以下是本人完成的一个 C 语言建立链表并进行增删查改操作的程序,为方便学习,本人将整个程序分为 头文件 和主函数 两部分:
1. 头文件(函数部分)
(1)初始化函数
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *head;
int length;
int capacity;
} Toslist; //Toslist 类型
// 初始化顺序表
Toslist initSeqlist() {
Toslist list;
list.length = 0;
list.capacity = 5;
list.head = (int *)malloc(10 * sizeof(int));
if (!list.head)
{printf("初始化失败!\n");
exit(0);
}
return list;
}
(2)打印函数
// 打印顺序表
void displayList(Toslist list) {for (int i = 0; i < list.length; i++) {printf("%d", list.head[i]);
}
printf("\n");
}
(3)插入函数
// 插入元素
Toslist add(Toslist list, int elem, int pos) {if (list.length == list.capacity) {int *temp = (int *)realloc(list.head, (list.capacity + 1) * sizeof(int));// 判断空间是否足够,不够就另建链表
// 不直接用 head 而引入 temp 的作用:防止空间分配失败导致 head 失去原来的链表
if (!temp) {
list.head = temp;
list.capacity += 1;
}
}
// 插入位置及以后的元素后移
for (int i = list.length - 1; i >= pos; i--) {list.head[i + 1] = list.head[i];
}
list.head[pos] = elem;
list.length ++;
return list;
if (pos > list.length || pos < 0)
printf("插入位置错误!\n");
return list;
}
(4)删除函数
// 删除元素
Toslist delete(Toslist list, int pos) {for (int i = pos; i < list.length - 1; i++) {list.head[i] = list.head[i + 1];
}
list.length--;
return list;
if (pos < 0 || pos > list.length) {printf("删除位置有误!\n");
return list;
}
}
(5)查找函数
// 查
int search(Toslist list, int elem) { //elem 是查找的元素
// 顺序查找
for (int i = 0; i < list.length; i++) {if (elem == list.head[i]) {return i;}
}
return 0;
}
(6)替换函数
// 改
Toslist modify(Toslist list, int elem, int val) { //val 是要替换它的元素
int pos = search(list, elem); // 获取要替换元素的位置
list.head[pos] = val;
return list;
}
2. 主函数
int main() {Toslist list = initSeqlist();
int Addpos = -1, Addnum, Delpos, Serachnum,Modifynum;
printf("请输入 5 个整数元素 \n");
for (int i = 0; i < 5; i++) {scanf("%d", &list.head[i]);
list.length++;
}
printf("顺序表中的元素有:\n");
displayList(list);
// 插入元素
printf("要在哪个元素后插入元素?\n");
while (Addpos < 0 || Addpos > list.length) {scanf("%d", &Addpos);
if (Addpos < 0 || Addpos > list.length)
printf("请输入正确的位置!\n");
};
printf("请输入需要插入的元素:\n"); scanf("%d", &Addnum);
printf("在顺序表的第 %d 个元素后插入元素 %d 得到 \n", Addpos, Addnum);
list = add(list, Addnum, Addpos);
displayList(list);
// 删除元素
printf("要删除顺序表下标顺序中哪个元素?\n"); scanf("%d", &Delpos);
printf("删除后得到:\n");
list = delete(list, Delpos);
displayList(list);
// 查找
printf("请输入需要查找的元素 \n"); scanf("%d", &Serachnum);
int pos = search(list, Serachnum);
if(pos)
printf("元素 %d 的位置为第 %d 个 \n", Serachnum, pos+1);
if(!pos){printf("表中无该元素 \n");
}
// 修改
printf("请输入需要修改的元素:\n");scanf("%d",&Serachnum);
printf("请输入要替换的数:\n");scanf("%d",&Modifynum);
printf("将 %d 修改为 %d 得到:\n", Serachnum, Modifynum);
list = modify(list, Serachnum, Modifynum);
displayList(list);
free(list.head);
list.head = NULL;
return 0;
}
以上程序本人已调试完毕,若程序有繁杂之处,欢迎批评指正!
如果有帮助,希望关注交流,谢谢????GershonHold 的博客
我的 GitHub 地址:GershonHold 的 Github