顺序表就是一组在空间中连续存储的表,例如数组。而我们在完整地去描述一个顺序表的时候,往往还需要对其表内已经存储的数据个数进行记录。所以我们可以这样去定义一个顺序表。
typedef SLdata int
#define MAX 1000
typedef struct
{
SLdata a[MAX];
int sz;
}SeqList;
其中SLdata代表顺序表中的数据类型,该示例中被定义为int。
但我们可以发现这种顺序表有一个很明显的缺点,就是该顺序表的长短不可变,这就很蛋疼啦,你说我存9个数据过去吧,又剩下991个int空间被浪费了,我要存10000个吧,人家又不够。这就是静态顺序表的缺点。
接下来就是动态顺序表
typedef SLdata int
typedef struct
{
SLdata* SL_Ptr;
int sz;
int capacity;
}SeqList;
动态顺序表的数据就被定义为了一个指针变量,这样就可以让这个指针变量指向的内存可以通过动态内存管理的手段来进行实现动态顺序表
接下来去实现顺序表的初始化
void SL_Init(SeqList* SL)
{
SL->SL_Ptr = (SLdata*)malloc(4 * sizeof(SLdata) );
SL->sz = 0;
SL->capacity = 4;
}
通过malloc函数对SL_Ptr指向的空间进行扩展。
接下来就是对顺序表的管理,管理包括增删改查
增:往数据表中存入数据
void SL_add(SeqList* SL)
{
int num = 0;
printf("请输入添加的数字");
scanf("%d",&num)
*( SL->SL_Ptr + (SL->sz++) ) = num;
}
按以上函数进行操作的话,我们会发现一个问题,如果capacity不够了怎么办?
接下来就是检查是否需要扩容的函数
void Check_Capacity(SeqList* SL)
{
if(SL->sz == SL->capacity)
{
SLdata* temp = (SLdata*)realloc(SL_Ptr, (SL->capacity + 2) * sizeof(SLdata) );
if(temp != NULL)
SL->SL_Ptr = temp;
else
{
printf("realloc error");
exit(-1);
}
}
}
相应的,增加数据的函数就会改为:
void SL_add(SeqList* SL)
{
Check_capacity(SL);
int num = 0;
printf("请输入添加的数字");
scanf("%d",&num)
*( SL->ptr + (SL->sz++) ) = num;
}
删:从顺序表中删去数据
void Delete_data(SeqList* SL)
{
int pos = -1;
int i = 0;
printf("请输入需要删除的位置");
scanf("&d",&pos);
for(i = pos - 1; i < SL->sz - 1; i++)
{
*(SL->SL_Ptr + i) = *(SL->SL_Ptr + i + 1);
}
sz--;
}
改:在数据表中对相应数据作出改动
void Delete_data(SeqList* SL)
{
int pos = -1;
int i = 0;
int input = 0;
printf("请输入需要改动的位置");
scanf("&d",&pos);
printf("请输入改动的值");
scanf("&d",&input);
*(SL->SL_Ptr + pos - 1) = input;
}
查:查找在数据表中的数据
void Delete_data(SeqList* SL)
{
int pos = -1;
int i = 0;
int input = 0;
printf("请输入需要查找的位置");
scanf("&d",&pos);
printf("%d",*(SL->SL_Ptr + pos - 1));
}
后续会作出改进..................