写出一个顺序表首先思路需要清晰。
大致步骤如下
1. 需要一个存放表中数据的空间,由于我们使用动态表,所以在C语言中我们需要用到指针。
2.我们需要知道表中数据的多少。所以需要一个int变量来存储数据的多少。
3.我们需要知道表中内存大小,方便内存不够时及时扩充。
由于数据类型不一致,所以我们最好选用结构体来实现
typedef int type; //方便以后修改数据类型
typedef struct Seqlist
{
type* a; //存储数据的指针变量
int size; //数据的多少
int capacity; //内存大小
}SL;
处理完数据声明 我们需要对结构体SL进行初始化
void SeqlistInit(SL* sl)
{
sl->a = NULL; //直接将最初的表初始化为空
sl->capacity = 0;
sl->size = 0;
}
第二步实现尾插
由于尾插较为简单 所以先热热身
void SeqlistPushBack(SL* sl, type x) //尾插
{
if (sl->size == sl->capacity)
{
int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;//扩容,判断内存是否为0
type* mid = (type*)realloc(sl->a, newcapacity * sizeof(type));//用realloc函数来扩容。
if (mid == NULL) //如果扩容失败,说明内存不够了,此时无法插入 程序结束
{
printf("defult\n");
exit(-1);
}
else
{
sl->a = mid; //扩容成功将新的表赋值给a
sl->capacity = newcapacity; //变为新的内存
}
}
sl->a[sl->size] = x; //将想要加入的数据存进尾部。
sl->size++; //因为插入了一个数据 所以大小加一
}
第三步实现头插。
具体思路:将数据从后往前依次后移一位,最后将想要插入的数据赋值给第一位
void SeqlistPushFront(SL* sl, type x) //头插
{
if (sl->size + 1 == sl->capacity) //依旧要先检查内存是否充足
{
int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
type* mid = (type*)realloc(sl->a, newcapacity * sizeof(type));
if (mid == NULL)
{
printf("defult\n");
exit(-1);
}
else
{
sl->a = mid;
sl->capacity = newcapacity;
}
}
int i = sl->size;
while (i) //每一位向后移
{
sl->a[i] = sl->a[i - 1];
i--;
}
sl->a[0] = x;
sl->size++;
}
第三步尾删
这一步也是非常的简单,我认为只需要将大小减一即可,但首先要检查表中是否有元素
void SeqlistPopBack(SL* sl) //尾删
{
if (sl->size == 0)
{
printf("没数据了\n");
exit(-1);
}
sl->size--;
}
第四步头删
依旧与头插相同,只是平移方向发生变化,这次是从前往后依次左移,并且需要检查是否有元素
void SeqlistPopFront(SL* sl) //头删
{
if (sl->size == 0)
{
printf("没数据了\n");
exit(-1);
}
int i = 1;
while (i < (sl->size))
{
sl->a[i - 1] = sl->a[i];
i++;
}
sl->size--;
}
第五步指定位置插入
只需要插入的某个位置的元素,后面元素依次后移一位,不过要检查内存是否充足
void SeqlistPushSpot(SL* sl, int n, type x) //指定位置插入
{
int i = sl->size;
if (n > i) //查看输入位置是否合法
{
printf("无法插入\n");
exit(-1);
}
else
{
if (sl->size + 1 == sl->capacity) //检查内存是否充足
{
int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
type* mid = (type*)realloc(sl->a, newcapacity * sizeof(type));
if (mid == NULL)
{
printf("defult\n");
exit(-1);
}
}
}
while (n <= i)
{
sl->a[i] = sl->a[i - 1];
i--;
}
sl->a[n - 1] = x;
sl->size++;
}
第六步指定位置删除
与上述基本一致
void SeqlisrPopSpot(SL* sl, int n) //指定位置删除
{
if (sl->size < n)
{
printf("没有数据啦\n");
exit(-1);
}
else
{
int i = sl->size;
while (n < i)
{
sl->a[n - 1] = sl->a[n];
n++;
}
}
sl->size--;
}
第六步寻找数据位置并且返回位置
int fintSpot(SL* sl, type x)
{
int i;
for (i = 0; i < sl->size; i++)
{
if (sl->a[i] == x)
{
return i+1;
}
}
printf("\n没找到\n");
exit(-1);
}