目录
前言
顺序表的创建和链表相似,但顺序表里元素的地址是连续的,也就是说顺序表可以像数组一样通过下标来查找元素,顺序表结构里除了数据区以外还有两个数据,一个是length用来记录顺序表当前的长度,另一个是size用于记录顺序表最大长度。
创建顺序表
类似于创建一个整形数组:int nums[szie];
typedef struct SqList
{
int *elem; //地址
int length; //当前长度
int size; //最大长度
}SqList;
顺序表初始化
void InitList(SqList *head){
head->elem = malloc(sizeof(int)* 1);
if (head->elem == NULL){
printf("malloc失败!\n");
exit(0);
}
head->length = 0; //长度为0
head->size = Max; //大小为max
}
顺序表的销毁
void destoryList(SqList *head){
if (head->elem != NULL){
free(head->elem);
}
head->elem = NULL; //释放空间后记得置空
}
顺序表的清空
void cleanList(SqList *head){
head->length = 0; //直接让表的当前长度置零
}
判断顺序表是否为空
void judgeList(SqList head){ //因为不需要修改表里的数据,所以直接传值就行,不用传地址
if (head.length == 0)
printf("表为空!\n");
else{
printf("表不为空!\n");
}
}
按值查找顺序表
int getval(SqList head,int x){
for (int i = 0; i < head.length; ++i){
if (head.length == x){
printf("所在位置为第%d位!\n", i + 1);
return i-1;
}
}
printf("没有该数据!\n");
return 0;
}
按位查找顺序表
int getelem(SqList head, int i, int *re){ //获取第i位元素(按位顺序查找)
if (i<1 || i>head.length){
printf("获取失败,位置非法!\n");
return 0;
}
else{
*re = head.elem[i - 1]; //将值赋值给要返回的变量
return *re;
}
}
求顺序表中某个位置的前一个元素
int* prevVal(SqList head, int x, int *prev){
int k=-1;
for (int i = 0; i < head.length; ++i){
if (head.elem[i]== x){
k = i - 1;
break;
}
}
if (k>-1){
*prev = head.elem[k];
printf("%d的前一位元素是%d!\n", x, *prev);
return prev;
}
else{
printf("%d没有前一位元素!\n", x);
return 0;
}
}
求顺序表中某个位置的后一位元素
int* nextVal(SqList head, int x, int* next){
int k = -1;
for (int i = 0; i < head.length; ++i){
if (head.elem[i] == x){
k = i + 1;
break;
}
}
if (k < head.length){
*next = head.elem[k];
printf("%d的下一位元素是%d \n", x, *next);
return next;
}
else{
printf("%d没有下一位元素!\n", x);
return 0;
}
}
在顺序表中插入元素
void InsertList(SqList *head, int i, int val){ //在i位置插入val
if (i<1 || i>head->length){
printf("插入位置不合法!\n");
exit(0);
}
if (head->length == head->size){
printf("表已满无法插入!\n");
exit(0);
}
for (int j = head->length; j > i - 1; --j){
head->elem[j] = head->elem[j - 1]; //将第i位后的元素往后搬移
}
head->elem[i - 1] = val;
head->length++; //长度加一
}
删除顺序表中某位元素
void DeleteVal(SqList *head, int i){
if (i<1 || i>head->length){
printf("删除位置不合法!\n");
exit(0);
}
for (; i < head->length;++i){ //i位后元素全部前移一位
head->elem[i - 1] = head->elem[i];
}
head->length--; //长度减一
}