用C语言实现线性表的顺序存储(动态存储)

  1. 建立一个具有5个元素的整数顺序表
  2. 查找(位置,值)
  3. 插入元素
  4. 删除一个元素
  5. 销毁
#define _CRT_SECURE_NO_WARNINGS 1//方便scanf的使用,防止警告,还可以scanf_s
#include
#include
#include
#include
const int InitSize = 100;//顺序表初始容量
const int InCreSize = 10;//顺序表存储空间每次扩展的长度
typedef int DataType;// 意思是DataType与int类型等同,写DataType只是为了方便理解,顺序表可以是很多类型
typedef struct 
{
	DataType* data;//动态申请数组空间的首地址
	int maxSize;//线性表容量
	int length;//当前长度
}DySeqList;
//初始化顺序表(为顺序表分配内存、给顺序表各个成员赋初始值)
void InitList(DySeqList* L)
{
	L->data = (DataType*)malloc(sizeof(DataType) * InitSize);//(动态申请)开辟空间用于存储100个int型数据,将开辟的空间的首地址赋给data
	if (L->data == NULL)//开辟失败
	{
		return;//因为我们定义的函数返回值为void,因此没有返回值
	}
	L->length = 0;//给顺序表各个成员赋初始值(初始化)
	L->maxSize = InitSize;//刚申请了内存,顺序表的长度已经改变
}
//建立顺序表
void Creat(DySeqList* L, DataType a[], int n) //建立一个长度为n的顺序表,将数组a中n个元素放在顺序表中
{
	for (int i = 0; i < n; i++) //遍历顺序表,将数组元素放入刚申请的内存里即顺序表里面
	{
		L->data[i] = a[i];
	}
	L->length = n;
}
//遍历顺序表
void print(DySeqList* L) 
{
	if (L->data == NULL) //表示顺序表里面没有元素
	{
		return;
	}

	for (int i = 0; i < L->length; i++)//遍历顺序表,然后打印顺序表里的各个元素
	{
		printf("%d ", L->data[i]);
	}
	puts("");
}
//插入操作
void Insert(DySeqList* L, int i, DataType x)
{
	if (i<1 || i>L->length + 1)//表示想插入的位置不合理
	{
		printf("插入的位置错误,插入失败\n");
		return;
	}
	if (L->length == L->maxSize)// 如果插入前已满,要追加空间(在前面动态申请里面加)
	{ 
		DataType* newspace = (DataType*)realloc(L->data, (L->maxSize + InCreSize) * sizeof(DataType));//表示插入前已满,要追加空间

		if (newspace == NULL) //追加空间失败,因为可能计算机当前为我们分配的堆已满,已无法申请
		{ 
			return;
		}
		//成功
		L->data = newspace;//修改新空间的首地址
		L->maxSize = L->maxSize + InCreSize;//修改线性表的容量
	}
	//插入
	for (int j = L->length; j >= i; j--)//从最后一个位置到i的位置 
	{ 
		L->data[j] = L->data[j - 1];//依次后移
	}
	L->data[i - 1] = x;
	L->length++;
}
//按值查找(返回序号,不是下标)
int Locate(DySeqList* L, DataType x) 
{
	for (int i = 0; i < L->length; i++) 
	{
		if (L->data[i] == x) //表示找到了
		{
			return i + 1;//返回的是序号
		}
	}
	return 0;//退出循环,说明查找失败
}
//6.按位置查找(第i个元素存储在数组下标为i-1的位置)
int Get(DySeqList* L, int i, DataType* data)
{    
	if (i<1 || i>L->length) 
	{
		printf("查找位置非法,查找失败\n");
		return 0;
	}
	*data = L->data[i - 1];//通过*data得到第i个元素的值
	return 1;
}
//删除操作(可以删除第一个位置的元素,也可以删除最后一个位置的元素,即位置i>=1或者i<=L->length)
int Delete(DySeqList* L, int i, DataType* data) //通过*data得到第i个元素的值
{  
	if (L->length == 0)
	{
		printf("表为空,删除失败\n");
		return 0;
	}
	if (i<1 || i>L->length)
	{
		printf("删除的位置不合理,删除失败\n");
		return 0;
	}
	*data = L->data[i - 1];//取出位置i的元素,暂时存放要删除的元素
	for (int j = i; j < L->length; j++)//j表示元素所在的位置下标
	{  
		L->data[j - 1] = L->data[j]; //从第i+1个元素(下标为i)到最后一个元素(下标为length-1)开始向前移动
	}
	L->length--;//表长减一
	return 1;
}
//销毁顺序表
void DesList(DySeqList* L) 
{
	free(L->data);
}
int main() 
{
	DySeqList L;
	InitList(&L);//初始化顺序表
	int arr[10] = { 1,2,3,4,5,6,7,8,9, 10 };
	Creat(&L, arr, 10);//建立一个有10个元素的顺序表
	printf("当前顺序表中的元素为:");
	print(&L);
	Insert(&L, 2, 100);
	printf("在顺序表的第二个位置插入100后,元素为:");
	print(&L);
	int pos = Locate(&L, 10);
	printf("10在顺序表中为第%d个元素\n", pos);
	DataType x;
	if (Get(&L, 5, &x) == 1)
	{
		printf("顺序表的第五个元素是%d\n", x);
	}
	if (Delete(&L, 5, &x) == 1) 
	{
		printf("删除顺序表中第五个元素:%d后,遍历顺序表如下:", x);
		print(&L);
	}
	//销毁顺序表
	DesList(&L);
	return 0;
}

运行结果:用C语言实现线性表的顺序存储(动态存储)_第1张图片

代码已经放在上面了,老规矩如有不懂,欢迎随时留言!!!

你可能感兴趣的:(c语言,数据结构,开发语言)