2021-02-22

C语言-线性表

C语言线性表的存储方式是线性连续的,和链表的区别就是:链表可以一个一个分
配内存,线性表必须一次性分配多个,这样内存才是连续的。当内存不够时,先临
时存储之前的内存内容,再重新分配比之前大的内存,然后把原来的内存内容放到
刚申请的内存中,再把之前的内存释放掉。在删除,插入操作时,必须配合size变
量。因为线性表删除插入,在不改变内存大小的情况下。是不会释放内存或者新分
配内存的。size大小指定的内存大小,是我们用到的内存,没用到的内存+size的
内存大小=分配的总内存大小。

插入操作

bool ListInsert_Sq(Sqlist* L, int a, ElemType e)//第二个参数表示在第a个位置上插入
{
	if (a<1 || a>L->length + 1)//判断插入位置是否合法
	{
		printf("所选的插入位置不合法!!\n");
		return false;
	}
	if (L->length == L->listsize)//在没有插入后,超过了链表容量,必须增加容量
	{
		ElemType* ptr = L->elem;
		L->elem = (ElemType*)malloc(sizeof(ElemType) * L->listsize*2);
		if (L->elem == NULL)
		{
			printf("内存分配失败\n");
			return false;
		}
		L->listsize= L->listsize*2;
		for (int i = 0; i < L->length; i++)//把原来内存中的数据移植到现在新分配的内存上去
		{
			L->elem[i] = ptr[i];
		}
		free(ptr);//释放之前的内存
	}
	for (int i = L->length; i >=a ; i--)//把第a个位置后的位置都往后移动一位
	{

		L->elem[i] = L->elem[i-1];
	}
	L->elem[a - 1] = e;//空出来的位置填e
	L->length++;//元素+1
	return true;
}

删除操作

bool ListDelete_Sq(Sqlist* L, int a)
{
	if (a<1 || a>L->length + 1)
	{
		printf("所选的插入位置不合法!!\n");
		return false;
	}
	for (int i = a-1; i <L->length; i++)
	{
		L->elem[i] = L->elem[i+1];
	}
	L->length--;
	return true;
}

总代码

#define LIST_INIT_SIZE 5//线性表存储空间的初始化分配量
#define LISTINCREMENT 1//线性表存储空间的分配增量
#define ElemType int //定义基本类型为int
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
	ElemType* elem;//存储空间基址
	int length;//当前长度
	int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}Sqlist;
//初始化线性表
bool InitList_Sq(Sqlist *L)
{
	//构造一个空的线性表
	L->elem = (ElemType*)malloc(sizeof(int) * LIST_INIT_SIZE);
	if (L->elem == NULL)
	{
		printf("分配内存失败");
		return false;
	}
	L->length = 0;
	L->listsize = LIST_INIT_SIZE;
	return true;
}
//插入元素
bool ListInsert_Sq(Sqlist* L, int a, ElemType e)
{
	if (a<1 || a>L->length + 1)
	{
		printf("所选的插入位置不合法!!\n");
		return false;
	}
	if (L->length == L->listsize)//在没有插入后,超过了链表容量,必须增加容量
	{
		ElemType* ptr = L->elem;
		L->elem = (ElemType*)malloc(sizeof(ElemType) * L->listsize*2);
		if (L->elem == NULL)
		{
			printf("内存分配失败\n");
			return false;
		}
		L->listsize= L->listsize*2;
		for (int i = 0; i < L->length; i++)//把原来内存中的数据移植到现在新分配的内存上去
		{
			L->elem[i] = ptr[i];
		}
		free(ptr);//释放之前的内存
	}
	for (int i = L->length; i >=a ; i--)
	{

		L->elem[i] = L->elem[i-1];
	}
	L->elem[a - 1] = e;
	L->length++;
	return true;
}
//删除元素
bool ListDelete_Sq(Sqlist* L, int a)
{
	if (a<1 || a>L->length + 1)
	{
		printf("所选的插入位置不合法!!\n");
		return false;
	}
	for (int i = a-1; i <L->length; i++)
	{
		L->elem[i] = L->elem[i+1];
	}
	L->length--;
	return true;
}
void print(Sqlist* L)
{
	for (int i = 0; i < L->length; i++)
	{
		printf("%d       ", L->elem[i]);
	}
	printf("\n");
}
int main()
{
	Sqlist* L=(Sqlist*)malloc(sizeof(Sqlist));
	L->elem = NULL;
	InitList_Sq(L);
	for (int i = 1; i < 20; i++)
	{
		ListInsert_Sq(L, i, i);
	}
	ListInsert_Sq(L, 2, 1);
	ListInsert_Sq(L, 5, 11);
	ListInsert_Sq(L, 2, 111);
	printf("LIST_SIZE:%d\n", L->length);
	printf("LIST_CONTAINER:%d\n", L->listsize);
	print(L);
	return 1;
	
}
其他操作可以在此基础上叠加。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值