顺序表专题
一结构体:
因为顺序表中的成员类型只靠int,char,double,这些类型是不够的。列如:在一个顺序表中存入学生的基本信息,这仅靠int,char这些是无法成功的。这就需要自定义类型结构体。Struct stu{
char name【】;
int age 【】;
};
二顺序表的实现:
顺序表的底层逻辑就是数组,在数组的基础上实现增删查改。数组只能存int等类型但顺序表可以顺序存储结构体类型。
1顺序表类型的定义;
typedef int idate;//通过typedef将int定义为idate方便后续更改顺序表的元素
typedef struct SeqList {
idate* arr;
int size;
int capicty;
}SL;此种定义为动态顺序表,可以通过使用内存申请函数动态的申请空间
typedef struct SeqList {
idate arr【MAXSIZE】;
int size;
}SL
此种为静态顺序表。
大多数情况下使用动态顺序表,因为我们在创建顺序表时不确定我会使用多少空间,
2顺序表的增删查改;
(1)顺序表的插入
再顺序表中实现插入操作时都需要判断这个顺序的空间是否满了我门可以实现一个函数来判断空间是否满。
void SLCheak(SL*sq) {
if (sq->size == sq->c) {
int newc = sq->capicty == 0 ? 4 : 2 * sq->capicty;//如果空间为0则直接让capicty=4,不为0则为原来值的2倍。
idate* s = (idate*)realloc(sq->arr, newc * sizeof(idate));
if (s == NULL) {
perror("realloc");
exit(1);
}
else
sq->arr = s;
sq->capicyt = newc;
}
}
在判断完之后再进行插入操作
void SLInsert(SL* sq, int pos, idate x) {
assert(sq);
assert(pos >= 0 && pos <= sq->size);
SLCheak(sq);
int i = 0;
for (i = sq->size; i>pos; i--) {
sq->arr[i] = sq->arr[i - 1];
}
sq->arr[pos] = x;
sq->size++;//插入完之后一定要让顺序表中元素个数加1
}实现插入操作只需要让插入位置及其该位置之后的元素都往后移一位,然后让空出的位置放入要插入的元素。
(2)顺序中元素的删除
在删除元素之前要判断是否为空表如果为空表则报错。
void SLErase(SL* sq, int pos) {
assert(sq);
assert(pos >=0 && pos < sq->size);
int i = 0;
for (i =pos; i<sq->size-1; i++) {
sq->arr[i] = sq->arr[i+1];
}
sq->size--;//删除完后一定要让顺序表中元素-1.
}
(3)顺序表元素的查找
int SLFind(SL* sq, idate x) {
assert(sq);
int i = 0;
for (int i = 0; i < sq->size; i++) {
if (sq->arr[i] == x) {
printf("找到了");
return i;
}
else
printf("找不到 ");
return -1;
}
}