【数据结构】顺序表

该博客介绍了顺序表的数据结构及其C语言实现,包括初始化、销毁、尾插、头插、尾删、头删等操作。代码展示了如何动态调整数组容量以及查找、在中间插入和删除元素的方法。此外,还提供了测试用例和操作菜单供用户交互体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

顺序表

头文件SeqList.h:

测试文件8.6.c:

文件运行SeqList.c:

小结:

下面继续接着实现3个接口:

查找:

在中间插入某个数(重要!):

删除某个数:

菜单:

完整代码:顺序表


顺序表

可动态增长的数组,要求数据是连续存储的

(类似通讯录,本文直接上代码哦)

头文件SeqList.h:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SQDataType;

typedef struct SeqList
{
	SQDataType* a;
	int size;//有效数据的个数
	int capacity;//容量空间的大小
}SLT;

//增删查改
void SeqListInit(SLT* ps1);//初始化
void SeqListDestory(SLT* ps1);
void SeqListPushBack(SLT* ps1, SQDataType x);
void SeqListPushfront(SLT* ps1, SQDataType x);
void SeqListPrint(SLT* Ps1);

void SeqListCheckCapacity(SLT* ps1);

//尾插尾删,头插头删
void SeqListPushBack(SLT* ps1, SQDataType x);//时间复杂度O(1)
void SeqListPushFront(SLT* ps1,SQDataType x);//时间复杂度O(N)
void SeqListPopBack(SLT* ps1);//时间复杂度O(1)
void SeqListPopFront(SLT* ps1);//时间复杂度O(N)

测试文件8.6.c:

#include"SeqList.h"
void TestSeqList()
{
	SLT s;
	SeqListInit(&s);
	SeqListCheckCapacity(&s);
	SeqListPushBack(&s, 1);//尾插 
	SeqListPushBack(&s, 2);//尾插 
	SeqListPushBack(&s, 3);//尾插
	SeqListPrint(&s);

	SeqListPushFront(&s, -1);//头插
	SeqListPrint(&s);

	SeqListPopBack(&s);//尾删
	SeqListPrint(&s);

	SeqListPopFront(&s);//头删
	SeqListPrint(&s);

	SeqListPopFront(&s);//头删
	SeqListPrint(&s);

	SeqListPopFront(&s);//头删
	SeqListPrint(&s);


	SeqListDestory(&s);
}
int main()
{
	TestSeqList();
	return 0;
}

文件运行SeqList.c:

#include"SeqList.h"
void SeqListInit(SLT* ps1)
{
	assert(ps1);
	ps1->a = NULL;
	ps1->size = ps1->capacity = 0;
}


void SeqListDestory(SLT* ps1)
{
	assert(ps1);
	if (ps1->a)
	{
		free(ps1->a);
		ps1->a = NULL;
	}
	ps1->size = ps1->capacity = 0;

}

void SeqListPrint(SLT* ps1)
{
	assert(ps1);
	for (int i = 0; i < ps1->size; i++)
	{
		printf(" %d",ps1->a[i]);
	}
	printf("\n");
}

//是否满了,满了就要增容
void SeqListCheckCapacity(SLT* ps1)
{
	assert(ps1);
	if (ps1->size == ps1->capacity)
	{
		size_t newcapacity = ps1->capacity == 0 ? 4 : ps1->capacity * 2;
		ps1->a = (SQDataType*)realloc(ps1->a, newcapacity*sizeof(SQDataType));
		ps1->capacity = newcapacity;
	}
}

//尾插尾删,头插头删
void SeqListPushBack(SLT* ps1, SQDataType x)//尾插
{
	assert(ps1);
	SeqListCheckCapacity(ps1);
	ps1->a[ps1->size] = x;
	ps1->size++;
}

void SeqListPushFront(SLT* ps1, SQDataType x)//头插
{
	assert(ps1);
	SeqListCheckCapacity(ps1);
	int end = ps1->size - 1;
	while (end >= 0)
	{
		ps1->a[end + 1] = ps1->a[end];
		end--;
	}
	ps1->a[0] = x;
	ps1->size++;
}

void SeqListPopBack(SLT* ps1)//尾删
{
	assert(ps1);
	assert(ps1->size > 0);
	//ps1->a[ps1->size - 1] = 0;没必要,直接删除
	ps1->size--;
}

void SeqListPopFront(SLT* ps1)//头删
{
	assert(ps1);
	assert(ps1->size > 0);
	int begin = 1;
	while (begin < ps1->size)
	{
		ps1->a[begin - 1] = ps1->a[begin];
		begin++;
	}
	if (ps1->size > 0)
	{
		ps1->size--;
	}
}

小结:

1.空间不够增容

2.插入跟删除都得要求数据要连续

下面继续接着实现3个接口:

查找:

int SeqListFind(SLT* ps1, SQDataType x)//查找
{
	assert(ps1);
	for (int i = 0; i < ps1->size; i++)
	{
		if (ps1->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}

在中间插入某个数(重要!):

注意有符号和无符号

void SeqListInsert(SLT* ps1, size_t  pos, SQDataType x)
{
	assert(ps1);
	assert(pos <= ps1->size && pos>=0);
	SeqListCheckCapacity(ps1);
	//假如pos=0或者end=0,会发生整型提升
	//方案1:将pos强制类型转换成int

	/*int end = ps1->size - 1;
	while (end >= (int)pos)
	{
		ps1->a[end + 1] = ps1->a[end];
		end--;
	}*/


	//方案2(推荐):用size_t要防止这个数变成-1
	size_t end = ps1->size;
	while (end > pos)
	{
		ps1->a[end] = ps1->a[end-1];//防止了end变为-1
		end--;
	}

	ps1->a[pos] = x;
	ps1->size++;
}

总结:要避免负数给到无符号,或者避免有符号数变成负数以后,被提升或者强转成有符号

删除某个数:

void SeqListErase(SLT* ps1, size_t pos)
{
	assert(ps1);
	assert(pos < ps1->size);
	size_t begin = pos;
	while (begin < ps1->size - 1)
	{
		ps1->a[begin] = ps1->a[begin+1];
		begin++;
	}
	ps1->size--;
}

菜单:

void menu()
{
	printf("***********************************\n");
	printf("       1.尾插数据 2.头插数据       \n");
	printf("       3.尾删数据 4.头删数据       \n");
	printf("       5.  打印   0.  退出         \n");
	printf("***********************************\n");
}
int main()
{
	int input = 0;
	SLT s;
	SeqListInit(&s);
	int val = 0;
	int front = 0;
	do
	{
		menu();
		printf("请选择操作选项:>");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			break;
		case 1:
			printf("请输入要尾插数据,以-1结束:");
			scanf("%d",&val);
			while (val != -1)
			{
				SeqListPushBack(&s, val);
				scanf("%d", &val);
			}
			break;
		case 2:
			printf("请输入要头插数据,以-1结束:");
			scanf("%d",&front);
			while (front != -1)
			{
				SeqListPushFront(&s, front);
				scanf("%d",&front);
			}
			break;
		case 3:
			SeqListPopBack(&s);
			break;
		case 4:
			SeqListPopFront(&s);
			break;
		case 5:
			SeqListPrint(&s);
			break;
		default:
			printf("无此选项,请重新输入");
			break;
		}

	}while (input != 0);
	SeqListDestory(&s);
	//TestSeqList();
	//越界不一定报错,系统对越界的检查是一种抽查
	//访问修改数据结构的建议一定用函数去,这样是最安全靠谱的
	return 0;
}

完整代码:顺序表

标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值