C语言实现动态分配顺序表,静态分配顺序表
最近在考研,重新手撕一遍数据结构,这篇博客只是想做个记录,不是分享什么,顺便存存代码,写了注释,大家可以参考。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10 //顺序表的最大长度为10
/*
静态分配的顺序表
*/
typedef struct{
int data[MaxSize]; //存储顺序表数值的数组
int length; //顺序表的长度
}Sqlist1;
//这里要改变数组里的内容,必须按地址传递
void InitalSqlist1(Sqlist1* L){
L->length=0; //初始化顺序表长度为0,这一步不能省略
//初始化顺序表中所有数值内容为0,清除脏数据,但是这一步可以省略
for(int i=0;i<MaxSize;i++){
L->data[i]=0;
}
}
//这里是按值传递
void printSqlist1(Sqlist1 L){
for(int i=0;i<L.length;i++){
printf("第%d个元素是%d \n",i,L.data[i]);
}
}
/*
动态分配的顺序表
*/
#define InitSize 10 //便于我们初始化链表时计算需要分配给的连续存储空间的大小
typedef struct{
int *data; //这个指针指向这部分内容存空间的开头,类型取决于这个顺序表存储什么类型的数据
int maxSize; //在结构体内部定义最大Size,而不是用宏定义,便于当数据超过最大限度时候,进行修改
int length; //顺序表目前拥有数据元素的个数
}Sqlist2;
void InitalSqlist2(Sqlist2* L)
{
/*用 malloc(参数为需要分配的内存地址大小) 函数申请一段连续的存储空间,
malloc包含在头文件stdlib.h中,malloc返回一个指针,我们需要对这个指针进行类型转换,转为我们的顺序表要存储的类型
*/
L->data=(int *)malloc(InitSize*sizeof(int)); //将malloc(初始化顺序表大小*每个数据元素占的内存大小)返回的指针强行转换为int型(因为顺序表存储整数))
L->length=0; //初始化顺序表的长度为
L->maxSize=InitSize; //将最大长度设为初始化长度
}
/*增加动态数组的数据元素个数上限:
1.重新开辟一个更大的内存空间
2.将原来的内存空间的顺序表复制过来
3.free之前的内存空间
*/
void IncreaseSizeSqlist2(Sqlist2* L,int len) //len是需要追加的
{
int *p=L->data; //先找一个中间指针指向原来的内存空间
L->data=(int *)malloc((L->maxSize+len)*sizeof(int));//重新分配内存空间
//拷贝之前的数据元素到新的内存空间
for(int i=0;i<L->length;i++){
L->data[i]=p[i];
}
L->maxSize=L->maxSize+len;//更新最大的元素个数值,不用更新length,因为元素的个数没变,只是扩充了容量
free(p);//释放原来存储的内存空间,free函数也在stdlib.h中
}
//打印动态分配的顺序表
void printSqlist2(Sqlist2 L){
for(int i=0;i<L.length;i++)
{
printf("第%d个数据元素是%d",i,L.data[i]);
}
}
int main()
{
Sqlist1 L1;
InitalSqlist1(&L1);
printSqlist1(L1);
Sqlist2 L2;
InitalSqlist2(&L2);
printf("增加前,L2的最大长度为%d \n",L2.maxSize);
IncreaseSizeSqlist2(&L2,10);
printf("增加后,L2的长度为%d \n",L2.maxSize);
printSqlist2(L2);
return 0;
}