前提提醒:本文为了与后面STL(标准模板库)的知识对接,函数命名方式统一采用STL标准
介绍完了数据结构的基本概念,接下来介绍数据结构最开始学习的顺序表。
顺序表顾名思义便是可以按顺序存放数据的表,在c语言中以数组的形式代替表示,就是数据表
如
通过SeqListPushBack把1 2 3 4 5放到sl中 ,并通过SeqListPrint打印
为了养成良好的编程习惯,建议使用STD.h,STD.c,test.c进行模块化编程,本文以此为模板进行编写,因为其特别简单,故不做详细介绍,直接看代码就完事了。
目录
准备阶段
1.创建结构体
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
typedef struct SeqList
{
SLDataType *a;//所存数据的数组指针
int size;//表示储存了多少数据
int capacity;//数组时间能存数据的空间容量是多大
}SL;
请在头文件中进行此操作并在头文件中包含库函数和定义宏
接下来请都放在STD.c中
2.初始化函数
void SeqListInit(SL* ps)//初始化
{
ps->a= NULL;
ps->capacity = ps->size = 0;
}
3.打印函数
void SeqListPrint(SL* ps)
{
int a = 0;
for (a = 0; a<=ps->size-1; a++)
{
printf("%d ", ps->a[a]);
}
}
4.扩容函数
void SeqListCheckCapacity(SL* ps)
{
if (ps->size == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newcapacity);
if (tmp == NULL)
{
perror("realloc");
exit(1);
}
ps->a = tmp;
ps->capacity = newcapacity;
}
}
5.销毁函数
void SeqListDestory(SL* ps)//销毁
{
free(ps->a);
}
功能函数
1.尾部插入
void SeqListPushBack(SL* ps, SLDataType x)//尾插
{
SeqListCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
2.尾部删除
void SeqListPopBack(SL* ps)
{
assert(ps->size > 0);//if语句温柔,assert暴力
ps->size--;
}
3.头部插入
void SeqListPushFront(SL* ps, SLDataType x)
{
SeqListCheckCapacity(ps);
int end = ps->size-1;
for (; end >= 0; end--)
{
ps->a[end + 1] = ps->a[end];
}
ps->a[0] = x;
ps->size++;
}
4.头部删除
void SeqListPopFront(SL* ps)
{
int front = 0;
for (;front<ps->size-1;front++)
{
ps->a[front] = ps->a[front+1];
}
ps->size--;
}
5.查找
int SeqListFind(SL* ps, SLDataType x)
{
int pos = ps->size - 1;
int flag = 0;
for (; pos >= 0; pos--)
{
if (ps->a[pos] == x)
{
return pos + 1;
}
}
return -1;
}
6.定点插入
void SeqListInsert(SL* ps, int pos, SLDataType x)
{
assert(pos>=0&&pos<=ps->size);//假才报错
SeqListCheckCapacity(ps);
int end = ps->size - 1;
for (; end >= pos; end--)
{
ps->a[end + 1] = ps->a[end];
}
ps->a[pos - 1] = x;
ps->size++;
}
7.定点删除
void SeqListErase(SL* ps, int pos)
{
int begin = pos - 1;
for (; begin < ps->size-1; begin++)
{
ps->a[begin] = ps->a[begin + 1];
}
ps->size--;
}