C语言之线性表

什么是线性表

线性表,也叫做顺序表。类似链表,但是里面的数据存储空间是连续的,不像链表是片段的,不连续。
顺序存储,数据连续的存储,中间不能有空值。

  1. 如果需要插入数据,在插入的位置之后的数据需要一个一个的往后移动,移动需要遵循把最后一个数据后移,
  2. 再后移最后一个数据的前一个数据,插入位置之后的数据依次后移即可,然后在需要的位置插入需要的数据。
  3. 如果需要删除数据,在删除的位置之后的数据需要一个一个的往前移动,移动需要遵循在删除位置的后一个数据前移,再前移删除位置的后一个数据的后一个数据,后面的数据依次前移即可,直到前移到最后一个数据完成。
    tips:线性表中数据元素之间的关系是一对一的关系,
    即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的
    注意,这句话只适用大部分线性表,而不是全部。

线性表的表现形式

typedef struct OrderList                              //线性表的结构体
{
	int length;   //存储的数据个数
	int size;     //顺序表的最大元素个数
	int *pBase;   //用来指向数组的指针
}Olist, *pOlist;
//初始化线性表
void initOrderList(pOlist Arr, int Length) //传入数据为线性表pOlist Arr,需要的数据长度 int Length
{
	//已经存储的数据长度  一开始为0
	Arr->length = 0;
	//整个顺序表的长度
	Arr->size = Length;
	//需要申请的的内存为int*型  大小为sizeof(int)乘以顺序表的长度Arr->size
	Arr->pBase = (int*)malloc(sizeof(int)*(Arr->size));
}

经过以上步骤我们就能得到一个线性表。

线性表的常见操作

在顺序表的任何一个地方插入数据

//在顺序表的任何一个地方插入数据
//Olist Arr  顺序表指针  pos是需要插入的位置  data是需要插入的数组
void insertPos(pOlist Arr, int pos, int data)
{
	//准备
	// Arr != 0
	// pos 正确的,不正解

	//1. 保证空间够
	if (Arr->length < Arr->size) {}		//1.1 够
	else                                //1.2 不够
	{
		//1.开一个大空间,把原来的内容复制到大空间 realloc
		//原来的空间大小Arr->size * 4;开辟后空间*2; 
		//p=realloc(p,大小)
		Arr->pBase = realloc(Arr->pBase, Arr->size * 4 * 2);

		//2.重做Arr成员的关系
		Arr->size *= 2;
		//Arr->pBase;
		//Arr->length;
	}

	//2. 插入
	if (0 >= pos)			//2.1 前插
	{
		for (int i = 0; i < Arr->length; i++)		//所有数据后移一位
			(Arr->pBase)[Arr->length - i] = (Arr->pBase)[Arr->length - i -1];

		(Arr->pBase)[0] = data;
	}
	//2.2 后插
	else if(Arr->length <= pos)
		Arr->pBase[Arr->length] = data;
	else    	//2.3 中间插入,当前索引位置和后面的后移,把当前索引位置空出来
	{
		for (int i = 0; i < Arr->length - pos; i++)		//当前索引起的数据后移一位
			(Arr->pBase)[Arr->length - i] = (Arr->pBase)[Arr->length - i - 1];

		(Arr->pBase)[3] = data;
	}

	//3.修正数据关系
	Arr->length++;
}

在顺序表中任意位置删除要给节点

//在顺序表中任意位置删除要给节点
//Olist Arr  顺序表指针  pos是需要删除的位置 
void delete_Pos(pOlist Arr, int pos)
{
	//准备
	if (0 == Arr->length)
		return;

	//2. 删除
	if (0 >= pos)                   //2.1 前删
	{
		for (int i = 0; i < Arr->length - 1; i++)
			(Arr->pBase)[i] = (Arr->pBase)[i + 1];
	}
	else if (pos >= (Arr->length - 1)) {}  //2.2 后删
	else                             	//2.3 中间删除
	{
		int iLoop = Arr->length - pos - 1;
		for (int i = pos; iLoop--; i++)
			(Arr->pBase)[i] = (Arr->pBase)[i + 1];
	}

	//3.修正数据关系
	Arr->length--;
}

得到整个顺序表的大小

int GetSize(pOlist Arr)
{
	return Arr->size;
}

将线性表重置为空表

Olist ClearList(Olist &L)
{ // 初始条件:顺序线性表L已存在。操作结果:将L重置为空表
L.length=0;
return OK;
}

销毁顺序线性表

销毁顺序线性表L
void DestroyList(Olist &L)
{ // 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
return OK;
}

判断是否为空表

判断是否为空表
bool ListEmpty(Olist L)
{ // 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
if(L.length==0)
return TRUE;
else
return FALSE;
}

代码测试

int main()
{
	Olist ol;				//定义顺序表变量
	initOrderList(&ol, 3);	//初始化ol
	insertPos(&ol, 0, 0);
	insertPos(&ol, 1, 1);
	insertPos(&ol, 2, 2);
	insertPos(&ol, 3, 3);
	insertPos(&ol, 4, 4);
	insertPos(&ol, 5, 5);
	insertPos(&ol, -1, -1);
	insertPos(&ol, 8888, 8888);
	//在内存中表现形式
	/*
	0x035A4980  ff ff ff ff		00 00 00 00		01 00 00 00		02 00 00 00  ................
	0x035A4990  03 00 00 00		04 00 00 00		05 00 00 00		b8 22 00 00  ............?"..
	0x035A49A0  cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd  ????????????????
	0x035A49B0  fd fd fd fd
	*/
    //删除一个尾部-1之后
	delete_Pos(&ol, -1);
	/*
	0x035A4980  00 00 00 00		01 00 00 00		02 00 00 00		03 00 00 00  ................
	0x035A4990  04 00 00 00		05 00 00 00		b8 22 00 00		b8 22 00 00  ........?"..?"..
	0x035A49A0  cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd  ????????????????
	0x035A49B0  fd fd fd fd
	*/
	//删除的数据没有
	delete_Pos(&ol, 6666);
	/*
	0x035A4980  00 00 00 00		01 00 00 00		02 00 00 00		03 00 00 00  ................
	0x035A4990  04 00 00 00		05 00 00 00		b8 22 00 00		b8 22 00 00  ........?"..?"..
	0x035A49A0  cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd  ????????????????
	0x035A49B0  fd fd fd fd
	*/
	delete_Pos(&ol, 3);
	/*
	0x035A4980  00 00 00 00		01 00 00 00		02 00 00 00		03 00 00 00  ................
	0x035A4990  04 00 00 00		05 00 00 00		b8 22 00 00		b8 22 00 00  ........?"..?"..
	0x035A49A0  cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd  ????????????????
	0x035A49B0  fd fd fd fd
	*/

	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值