一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第七天,点击查看活动详情。
链表
接上篇,这里我们学习单向链表
知识点7--链表
前言
什么是链表?
链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结构。实际上是线性表的链式存储结构,与数组不同的是,它是用一组任意的存储单元来存储线性表中的数据,存储单元不一定是连续的,且链表的长度不是固定的,链表数据的这一特点使其可以非常的方便地实现节点的插入和删除操作
链表的每个元素称为一个节点,每个节点都可以存储在内存中的不同的位置,为了表示每个元素与后继元素的逻辑关系,以便构成“一个节点链着一个节点”的链式存储结构,
除了存储元素本身的信息外,还要存储其直接后继信息,因此,每个节点都包含两个部分,第一部分称为链表的数据区域,用于存储元素本身的数据信息,这里用data表示,
它不局限于一个成员数据,也可是多个成员数据,第二部分是一个结构体指针,称为链表的指针域,用于存储其直接后继的节点信息,这里用next表示,
next的值实际上就是下一个节点的地址,当前节点为末节点时,next的值设为空指针
struct link
{
int data;
struct link *next;
};
像上面这种只包含一个指针域、由n个节点链接形成的链表,就称为线型链表或者单向链表,链表只能顺序访问,不能随机访问,链表这种存储方式最大缺点就是容易出现断链,
一旦链表中某个节点的指针域数据丢失,那么意味着将无法找到下一个节点,该节点后面的数据将全部丢失
链表的组成
- 头指针:存放一个地址,该地址指向第一个元素
- 结点:用户需要的实际数据和连接节点的指针(data,next)
建立动态链表
所谓建立动态链表是指在程序执行过程中从无到有的建立起一个链表,即一个一个地开辟结点和输入个结点数据,并建立起前后相联的关系
举个栗子吧
题目:
根据下面的分析写一程序建立一个含有学生(学号,成绩)数据的单向动态链表
(约定:学号不会为0,如果输入的学号为0,则表示建立链表的过程完成,该结点不应连接到链表中)
思路
实现链表输出:
- 首先要知道链表第一个结点的地址,也就是要知道head的值;
- 设一个指针变量p,先指向第一个结点,输出p所指的结点,然后使p后移一个结点,输出p所指的结点;
- 使p后移一个结点,再输出,直到链表的尾结点。
流程图:
代码实现:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(struct student) //student结构的大小
struct student *create(); //创建链表
void print(struct student *head); //打印链表
struct student{
int num;
float score;
struct student *next;
};
int n; //全局变量,用来记录存放了多少数据
int main(){
struct student *stu;
stu = create();
print(stu);
printf("\n\n");
system("pause");
}
struct student *create(){
struct student *head;
struct student *p1,*p2;
p1 = p2 = (struct student *)malloc(LEN); //LEN是student结构的大小
printf("Please enter the num:");
scanf("%d",&p1->num);
printf("Please enter the score:");
scanf("%f",&p1->score);
head = NULL;
n = 0;
while(p1->num){
n++; //出现了第一个结点
if(1 == n){
head = p1;
} else {
p2->next = p1;
}
p2 = p1;
//是为了再插入新节点时,P1再指向新节点,P2继续指向P1->next
p1 = (struct student *)malloc(LEN); //p1继续为下一节点开辟空间
printf("\nPlease enter the num:");
scanf("%d",&p1->num);
printf("Please enter the score:");
scanf("%f",&p1->score);
}
p2->next = NULL;
return head;
};
void print(struct student *head){
struct student *p;
printf("\nThere are %d records!\n\n",n);
p = head;
if(head){
do{
printf("学号为 %d 的成绩是:%f\n",p->num,p->score);
p = p->next;
}while(p);
}
}
声明
小编是跟着b站上的小甲鱼视频学习的,希望每天都能进步一点点!!
链接附上:C语言学习之小甲鱼视频链接
参考:链表