思维导图:
一,顺序表
一,顺序表的创建(位置:头文件内)
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;}}