链表
1.什么是链表
【官方版】链表是一种采用动态存储分配内存的数据结构。(数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合)
【自己】链表即让多个结构体通过指针串在一起成为一条链。即通过当前结构体(包含数据域与结构域)的指针域中存放的指针指向下一个结构体,即当前结构体的指针装着下一个结构体数据的地址。
2.为什么要用链表
一般用来存储数据用的是数组,但是在定义数组前需要预先知道有多少个数据要用来处理,要分配多大的数组。并且还要让所开辟的空间足够大用来满足自身需求,但如果分配的太多会浪费内存。因而链表可以用来弥补数组带来的诸多不便,让我们可以任意为一些数据进行空间的分配,根据需要进行动态内存单元的分配。
综上所述 :数组大小固定,不适合动态存储,动态添加,内存为一连续的地址,可随机访问,查询较快。而链表大小可变,扩展性强,在内存中其地址不连续,但只能顺着指针的方向查询,速度较慢。
3.创建链表
定义结构体
struct stud
{
long num;
char name[11];
float score;
struct stud* next;
};
创建链表
struct stud* create(void) //链表的创建
{
struct stud *p1, *p2, *head;
head = p2 = (struct stud*)malloc(sizeof(struct stud)); //head,p2指向头结点
printf("学号 姓名 成绩(学号输入-1结束\n");
p1 = (struct stud*)malloc(sizeof(struct stud)); //p1指向第一个结点
scanf("%ld %s %f", &p1->num, &p1->name, &p1->score);
while(p1->num != -1)
{
p2->next = p1; //将新结点链接到表尾
p2 = p1;
p1 = (struct stud*)malloc(sizeof(struct stud));
scanf("%ld %s %f", &p1->num, &p1->name, &p1->score);
}
p2->next = NULL;
free(p1);
return head;
}
输出链表
void print(struct stud* p)
{
p = p->next;
while(p != NULL)
{
printf(PT);
p = p->next;
}
}
增
struct stud* Insert(struct stud* p0)
{
struct stud* p;
p = (struct stud*)malloc(sizeof(struct stud)); //p指向新申请的结点
printf("请输入要插入的学号 姓名 成绩\n");
scanf("%ld %s %f", &p->num, p->name, &p->score);
while(p0->next != NULL && p0->next->num == p->num) //找到重号
{
free(p);
return 0;
}
p->next = p0->next; //后续链表接到新链表上
p0->next = p; //新链表接到前链表后
return p0;
}
删
struct stud* Delete(struct stud* p0)
{
long num;
struct stud* p;
p = p0->next;
if(p == NULL)
return 0;
printf("请输入要删除的学号:");
scanf("%ld", &num);
while(p != NULL)
{
if(p->num == num) //寻找要删除的结点
{
p0->next = p->next; //后续结点链接到前一个结点上
free(p);
return p0; //删除成功
}
p0 = p;
p = p->next;
}
return p0; //如果没有要查找的学号则删除失败返回0
}
改
struct stud* change(struct stud* p)
{
int i, n, count;
struct stud* now;
now = p;
printf("请输入要修改第几个学生的信息:\n");
scanf("%d", &n);
for(i = 1; i <= count && now != NULL; i++)
{
if(i == n)
{
printf("请输入修改后的成绩:\n");
scanf("%d", &now->score);
return p;
}
now = now->next;
}
}
查
struct stud* find(struct stud* p)
{
long num;
printf("请输入要查找的学号:\n");
scanf("%ld", &num);
while(p->next != NULL)
{
p = p->next;
if(p->num == num)
return p;
}
return NULL;
}
主函数
int main()
{
struct stud *head, *p;
head = create();
print(head);
p = find(head);
if(p)
printf("找到学号:%ld 姓名:%-10s 成绩:%6.lf\n", p->num, p->name, p->score);
else
printf("没有此信息!\n");
if(Insert(head))
printf("已成功插入!\n");
else
printf("有重号插入失败\n");
print(head);
if(Delete(head))
printf("已正确删除!\n");
else
printf("要删除的信息不存在!\n");
print(head);
}
注:此代码中:#define PT “学号:%ld 姓名:%-10s 成绩:%6.lf\n”, p->num, p->name, p->score