持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
🍖我的单链表相关的分享 🍖 关于单链表
这篇文章主要从下面几点讲
🌭 part1 单链表的定义方式
🍤 part2 对链表进行初始化
🥞 part3 单链表的几种简单算法
1.判断是否为空链表
2.单链表的销毁
3.单链表的清除
4.单链表的长度
🍨🍧来吧!! beautiful 单链表
单链表:单链表是一种物理空间不连续但逻辑空间连续的存储方式
链表是由多个结点组成的,每个结点由数据域和指针域
一.🍩 定义单链表
定义单链表有两种方式
1.方式一
🌻🌻举个例子来介绍一下单链表的定义
such as!!🥯
我们要定义一个储存学生信息的单链表结点
//存储学生学号,姓名,成绩的单链表的结点类型定义
typedef Struct student
{
char name[10]; //数据域
char num[11]; //数据域
int score; //数据域
struct student *next;//指针域
} Node,*LinkList;
这段代码中,学生信息是数据域,next属于指针域
2.方式二
为了方便操作用另一种方式定义
typedf Struct{
char name[10];//数据域
char num[11];//数据域
int score;//数据域
} ElemType;
typedef Struct student{
ElemType data;//数据域
struct student *next;//指针域
} Node,*LinkList;
二.🍰 单链表的初始化
单链表的初始化:即创建一个带有头节点的单链表,
.L指向这个头结点
.头结点指针域为空
Status initList L(LinkList *L){//初始化一个链表L,L是指向拥有data与next的结点的指针
L=new Node ;
//这段的描述为从内存中找到一个空间,将空间的地址赋值给L
//或者L=(LinkList)malloc(sizeof(Node)) ,
//,这一步主要是new一个新节点(这是一个赋给L的地址);
//new Node属于c++
L->next=NULL;//给该节点的指针域设置为空
return;
}
三.🥧 简单算法
1. 判断链表是否为空表
链表中无元素(只有头指针和头结点)即可以称为空链表
算法思路:
判断头结点指针域是否为空
int ListEmpty(LinkList L){
if(L->next)
return 0;
else
return 1;
}
2.单链表的销毁
算法思路:
- 从头结点开始依次释放所有结点
- 需要一个单链表,一个指针变量(指向头结点)
- 一个变量若是想指向某一个空间则需要将该空间的地址给它
即将L的值赋值给P
-
重点思路:将L指向下一个结点,删除P指向的结点
即将头结点的指针域(即L原来所指的next域)给L,这样L就指向了a1所在的结点
在c语言中不用delete p 用free(p)(若是用delete p则必须开创头结点时用new)
当L->next==NULL时即p在接下来也会p=L==NULL.销毁完成。
//销毁单链表-算法
Status DestroyList (LinkList L){
Node *p;//或LinkList p;
while(L){
p=L;
L=L->next;
free(p) //另一种delete p
3.清空链表
链表仍然·存在,但是清空其中元素,成为空链表(头结点与头指针仍然在)
算法思路:
- 依次释放所有结点,并将头结点指针域设置为空
将L的next域赋给p,即p指向了a1结点(首元结点)
- 当要释放a1时,指定一个变量q
则将p的指针域赋给q再执行free(p),即可完成删除a1
- 当继续删除时
将q赋值给p,p指向p结点的下一个结点
- 结束条件
p==NULL - 循环条件
p!=NULL - 最后一步头结点为空
L->next=NULL反复执行即可
//清空链表-保留头指针与头结点
Status ClearList (LinkList L){
node *p,*q; //或者使用LinkList p,q
p=L->next;
while(p){
q=p->next;
free(p);
p=q;
}
L->next=NULL;n //将头结点指针域设置为空
return;
}
4.求单链表的表长
算法思路:
- 从首元结点开始,依次计数所有结点
- 定义一个变量p,让p指向首元结点
- p=L->next
- 然后判断他的指针域是否为空不为空i+1
- 定义变量 i 计数
- 接下来让p指向下一个结点
- p=p->next
//求单链表表长
int ListLength(LinkList L){
Node *p; //LinkList p,定义指针变量
p=L->next; //p变量指向第一个结点(首元结点)
i=0;
while(p){
i++;
p=p->next;
}
return;
以上是今天的单链表明天将继续更新