思维导图:
一,顺序表
一,顺序表的创建(位置:头文件内)
1.1顺序表的结构体类型
要求:创建顺序表并使这个顺序表能够存放数据,能记录有效数据的个数,能够记录容量大小。
代码:
#define data int
typedef struct SL {
data* Data;
int sz;
int capacity;
}SL;
这里还使用了typedef来对结构体类型进行重命名,可以方便使用这种结构体类型。
使用(测试文件内):
SL a;
2.初始化(SL.c文件内)
代码:
void SlInit(SL* a) {
a->Data = (data*)malloc(sizeof(data) * 4);
if (a->Data == NULL) {
perror("malloc fail");
return;
}
a->sz = 0;
a->capacity = 4;
}
!!!初始化是非常必要的
3.容量检查(SL.c文件内)
! ! ! 检查容量避免越界
void SlCheak(SL* a) {
if (a->sz == a->capacity) {
data* temp = (data*)realloc(a->Data,sizeof(data)*2*(a->capacity));
if (temp == NULL) {
perror("malloc fail\n");
return;
}
a->Data = temp;
a->capacity = 2 * (a->capacity);
}
}
4.插入与删除函数
前插,尾插,前删,尾删,中间插入,中间删除
1.在这里,先分别写一个中间插入与删除的函数:
中间插入函数:SLInsert()
参数:SL*a,int pos,int n
代表:要插入的顺序表,插入位置,插入的值
代码:
void SlInsert(SL* a, int pos, int n) {
assert(pos > 0 && pos < a->sz);
SlCheak(a);
pos = pos - 1;
int i = a->sz-1;
while (i >= pos) {
a->Data[i + 1] = a->Data[i];
i--;
}
a->Data[pos] = n;
a->sz++;
}
中间删除函数:SLErase()
参数:SL*a , int pos
代表:顺序表,要删除的数的下标
代码:
void SlErase(SL* a, int pos) {
assert(pos > 0 && pos < a->sz);
SlCheak(a);
pos = pos - 1;
int i = 0;
for (i = pos;i < a->sz-1;i++) {
a->Data[i] = a->Data[i + 1];
}
a->sz--;
}
其实,尾插头插,尾删头删都可以复用中间插入中间删除来实现。在这里交给各位读者来想想了。
四,查找数据
SLFind()
在这里使用的了一个static修饰的函数Find()来寻找要查找的数据的位置。这个函数也可以复用来实现Modify()函数
static int Find(SL* a, int taget) {
assert(a);
int i = 0;
for (i = 0;i < a->sz;i++) {
if (a->Data[i] == taget) {
return i;
}
}
return -1;
}
void SlFind(SL* a) {
assert(a);
printf("请输入你要查找的数据:>");
int taget = 0;
scanf("%d", &taget);
if (Find(a, taget)>=0) {
printf("找到了,下标是:>%d\n", Find(a, taget));
}
else {
printf("找不到……\n");
}
}
五,修改数据
Modify()
void SlModify(SL* a) {
assert(a);
printf("请输入你要修改的对象:>");
int n = 0;
scanf("%d", &n);
int pos = Find(a, n);//复用
if (pos == -1) {
printf("这个值不存在\n");
}
else {
printf("请输入你要修改的值:>");
int j = 0;
scanf("%d", &j);
a->Data[pos] = j;
}
}