🍟传说中的单链表 [UP]

117 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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.单链表的销毁

算法思路:

  • 从头结点开始依次释放所有结点
  • 需要一个单链表,一个指针变量(指向头结点)
  • 一个变量若是想指向某一个空间则需要将该空间的地址给它

Screenshot_20221017_103453.png 即将L的值赋值给P

  • 重点思路:将L指向下一个结点,删除P指向的结点

Screenshot_20221017_103825.png 即将头结点的指针域(即L原来所指的next域)给L,这样L就指向了a1所在的结点

Screenshot_20221017_104626.png

在c语言中不用delete pfree(p)(若是用delete p则必须开创头结点时用new) 当L->next==NULL时即p在接下来也会p=L==NULL.销毁完成。

Screenshot_20221017_105454.png

//销毁单链表-算法
Status DestroyList (LinkList L){
        Node *p;//或LinkList p;
        while(L){
            p=L;     
            L=L->next;
            free(p) //另一种delete p

3.清空链表

链表仍然·存在,但是清空其中元素,成为空链表(头结点与头指针仍然在)
算法思路:

  • 依次释放所有结点,并将头结点指针域设置为空

Screenshot_20221017_110739.png

将L的next域赋给p,即p指向了a1结点(首元结点)

  • 当要释放a1时,指定一个变量q

Screenshot_20221017_111504.png

则将p的指针域赋给q再执行free(p),即可完成删除a1

  • 当继续删除时

Screenshot_20221017_111910.png 将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=0while(p){
        i++;
        p=p->next;
    }
    return;
        
    

以上是今天的单链表明天将继续更新