【数据结构基础笔记】【链表】

代码参考《妙趣横生的算法.C语言实现》

文章目录

  • 前言
    • 1、链表基础
    • 2、创建一个链表
    • 3、插入结点
    • 4、删除结点
    • 5、销毁链表
    • 6、实例分析


前言

本章总结:链表的定义、创建、销毁,结点的插入与删除


1、链表基础

链表的物理存储结构是用一组地址任意的存储单元存储数据的。
在链表结构中,每个数据元素记录都存放在链表的一个结点node中,而每个结点之间由指针将其连接到一起。
每个结点由指针域(存放后继结点的位置)、数据域构成。
一个链表通常有一个表头,是一个指针变量,用来存放第一个结点地址。
链表的最后一个结点的的指针域要置空,表示为链表的尾结点。
在这里插入图片描述
链表特点:
1、每个结点包括两个部分:数据域和指针域
数据域用来存放数据元素本身信息,指针域用来存放后继结点的地址
2、链表逻辑上是连续的,但物理上不一定是连续存储结点。
3、只要获取链表的头结点,就可以通过指针遍历整条链表
一个链表结点可以描述为:

typedef struct node{ElemType data;		//数据域struct node *next;	//指针域
}LNode,*LinkList;

每个结点的类型是LNode
*LinkList是指向LNode类型数据的指针类型定义。
所以 LNode *L 与 LinkList L; 是等价的。

2、创建一个链表

LinkList GreatLinkList(int n)
{//建立一个长度为n的链表LinkList p,r,list=NULL;		//p:相当于每次新建结点的暂存器,r:相当于插入结点的上一个结点,永远指向原先链表的最后一个结点。list链表的头指针ElemType elem;				//获取暂存数据int i;						//定义累加器for(i=0;i<n;i++){scanf("%d",&elem);p=(LinkList)malloc(sizeof(LNode));	//分配内存,并将首地址送到pp->data=elem;			//置入数据p->next =NULL;			//指针指向NULL,暂时不考虑下一个结点if(!list)				//如果链表为空,则新创建的结点就是该链表的第一个结点list=p;else					//如果链表不为空,则将新建立的结点连接到之前链表的尾部r->next=p;r=p;					//将p结点的数据赋给r}return list;				//将链表的头指针返回主调函数,通过list就可以访问链表中的每个结点,并进行操作	
}

3、插入结点

步骤描述:
1、创建新节点,用指针p指向该结点
2、将q指向结点的next域的值赋值给p指向结点的next域
3、将p的值赋值给q的next域
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynbLqOhX-1600526323871)(C:\Users\15409\AppData\Roaming\Typora\typora-user-images\1600507457502.png)]
代码描述:

void insertList(LinkList *list,LinkList q,ElemType e)
{//向链表中由指针q指向的结点后面插入结点,结点数据位eLinkList p;p=(LinkList)malloc(sizeof(LNode));		//生成一个新节点,由p指向它p->data=e;if(!*list)				//如果链表为空{*list=p;p->next=NULL;}						//当链表为空的时候,q没有意义,只能在头结点后面插入第一个元素else{//当链表不为空的时候,认为q指向的结点一定存在//将q指向的结点的next域的值赋给p指向的结点的next域p->next=q->next;q->next=p; }
}

通过这个算法同样可以创建一个链表,因为链表为空时,list==NULL,可以自动创建一个结点。在下面创建其他结点时,只要始终将指针q指向链表的最后一个结点,就可以创建出一个链表

4、删除结点

从非空链表中删除q所指的结点。
考虑三个情况:1、q指向的是链表的第一个结点
2、q指向的结点的前驱结点的指针已知
3、q指向的结点的前驱结点的指针未知
步骤:
1:将q所指的结点的指针域next的值赋给头指针list,让list指向第二个结点,再释放掉q所指的结点即可。
2:假设前驱指针为r,将q所指的结点的指针域next的值赋给r的指针域next,释放掉q所指结点
3:当q所指的结点的前驱结点的指针未知,需要通过链表头指针list遍历链表,找到q的前驱结点,并将该指针赋值给变量r,再按照第二种情况去做即可

情况1、2的代码描述:

void delLink(LinkList *list,LinkList r,LinkList q)
{if(q==*list)		//情况1:q指向链表的第一个结点*list=q->next;else				//情况2:q指向的结点前驱结点的指针已知r->next=q->next;free(q);
}

情况1、3的代码描述:

void delLink(LinkList *list,LinkList r,LinkList q)
{if(q==*list)//情况1:q指向链表的第一个结点{*list=q->next;  free(q);}else				//情况3:q指向的结点前驱结点的指针未知{for(r=*list;r->next!=q;r=r->next);	//遍历链表,找到q的前驱结点的指针if(r->next!=NULL){r->next=q->next;			//从链表中删除q指向的结点free(q);}} 
}

5、销毁链表

使用链表之后需要销毁它,因为链表本身会占用内存。
code描述:

void destroyLinkList(LinkList *list)
{LinkList p,q;p=*list;while(p){q=p->next;free(p);p=q;}*list=NULL;
}

6、实例分析

要求:
输入一组整数(大于10个数),以0作为结束标志,将这组整数存放到一个链表中(结束标志0不包括在内),打印出该链表中的值。然后删除该链表中的第5个元素,打印出删除后的结果。最后在内存中释放掉该链表。

#include "stdio.h"
#include "malloc.h"
#include "conio.h"typedef int ElemType;
//指针定义
typedef struct node {ElemType data;		//数据域struct node* next;	//指针域
}LNode, * LinkList;//***********创建链表******************//
//
LinkList GreatLinkList(int n)
{//建立一个长度为n的链表LinkList p, r=NULL, list = NULL;		//p:相当于每次新建结点的暂存器,r:相当于插入结点的上一个结点,永远指向原先链表的最后一个结点。list链表的头指针ElemType elem;				//获取暂存数据int i;						//定义累加器for (i = 0;i < n;i++){scanf("%d", &elem);p = (LinkList)malloc(sizeof(LNode));	//分配内存,并将首地址送到pp->data = elem;			//置入数据p->next = NULL;			//指针指向NULL,暂时不考虑下一个结点if (!list)				//如果链表为空,则新创建的结点就是该链表的第一个结点list = p;else					//如果链表不为空,则将新建立的结点连接到之前链表的尾部r->next = p;r = p;					//将p结点的数据赋给r}return list;				//将链表的头指针返回主调函数,通过list就可以访问链表中的每个结点,并进行操作	
}//*************插入结点************//
//
void insertList(LinkList* list, LinkList q, ElemType e)
{//向链表中由指针q指向的结点后面插入结点,结点数据位eLinkList p;p = (LinkList)malloc(sizeof(LNode));		//生成一个新节点,由p指向它p->data = e;if (!*list)				//如果链表为空{*list = p;p->next = NULL;}						//当链表为空的时候,q没有意义,只能在头结点后面插入第一个元素else{//当链表不为空的时候,认为q指向的结点一定存在//将q指向的结点的next域的值赋给p指向的结点的next域p->next = q->next;q->next = p;}
}
//通过这个算法同样可以创建一个链表,因为链表为空时,list==NULL,可以自动创建一个结点。在下面创建其他结点时,只要始终将指针q指向链表的最后一个结点,就可以创建出一个链表//删除结点
void delLink(LinkList* list, LinkList q)
{LinkList r;if (q == *list)//情况1:q指向链表的第一个结点{*list = q->next;free(q);}else				//情况3:q指向的结点前驱结点的指针未知{for (r = *list;r->next != q;r = r->next);	//遍历链表,找到q的前驱结点的指针if (r->next != NULL){r->next = q->next;			//从链表中删除q指向的结点free(q);}}
}//销毁链表
void destroyLinkList(LinkList* list)
{LinkList p, q;p = *list;while (p){q = p->next;free(p);p = q;}*list = NULL;
}void print_linklist(LinkList show_list)
{while (show_list){printf("%d ",show_list->data);show_list = show_list->next;}
}
int main()
{int elem = 0;   //定义中间变量数据int i = 0;      //定义累加器LinkList L, q;  q = L = GreatLinkList(1);       //创建1个链表结点,q和L指向该结点scanf("%d",&elem);while (elem)                    //循环地输入数据,同时插入新生成的结点,结束条件:输入数据为0{insertList(&L,q,elem);q = q->next;scanf("%d", &elem);}q = L;printf("The content of the linklist\n");print_linklist(q);q = L;printf("\n Delete the fifth element\n");for (i=0;i<4;i++)           //将指针q指向第五个元素{if (q == NULL)     //确保此时链表的长度大于等于5,否则是非法操作{printf("The length of the linklist is smaller than 5");_getche();return 0;}q = q->next;}delLink(&L,q);q = L;print_linklist(q);destroyLinkList(&L);return 0;
}

result:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频图像质量评价

目录1、人眼视觉特性1、眼的适应性2、对比灵敏度3、空间分辨率和时间分辨率4、马赫效应5、可见度阈值2、图像质量测度3、图像评价方法4、图像评价方法的优劣1、人眼视觉特性 1、眼的适应性 暗适应性&#xff1a;从亮环境到暗环境&#xff0c;适应暗环境的特性 亮适应性&#…

recovery编译问题汇总

1、修改支持USB大容量存储 &#xff08;1&#xff09;、首先需要查看手机lun位置 手机链接电脑&#xff0c;打开cmd命令行&#xff0c;依次输入以下命令: adb shell find /sys -name "lun" 输出以下结果&#xff1a; 发现手机输出结果有两个&#xff0c;需要进一步查…

【数据结构基础笔记】【栈】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、栈的定义2、创建一个栈3、入栈和出栈操作4、栈的清空、销毁、计算栈的当前容量5、实例分析前言 本章总结&#xff1a;栈的定义、创建栈&#xff0c;销毁栈&#xff0c;入栈出栈操作等操作。 1、栈的定义 栈是一种重要的…

用HTML语言制作list标记,html5 datalist标签的用法是什么?这里有datalist标签的用法实例...

本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例。本文说了两个常用的选项框的实例供大家选择观看&#xff0c;下面就让我们一起来看这篇文章吧我们先来看看html5 datalist标签的用法&#xff1a;标签定义选项列表。请与input元素配合使用…

【数据结构基础笔记】【队列】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、队列定义2、创建一个队列3、入队列4、出队列5、销毁一个队列6、循环队列的概念7、循环队列的实现8、实例分析前言 本章总结&#xff1a;链队列定义&#xff0c;创建&#xff0c;出队入队操作&#xff0c;销毁操作&#x…

html图片自动循环轮播图,js实现图片无缝循环轮播

本文实例为大家分享了js实现图片无缝循环轮播的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下代码如下Document#container{overflow:hidden;width:400px;height:300px;margin:auto;}#front,#container{display:flex;flex-direction:row;}#container img{width:400px…

五、json模块

一、json模块的介绍 json模块是Python自带的模块&#xff0c;用于json和Python数据之间的相互转换 Json与Python数据类型的对应关系 JsonPythonobjectdictarrayliststringstrnumber(int)int,longnumber(real)floattrueTruefalseFalsenullNone [#中括号括起来的&#xff0c;对…

【数据结构基础笔记】【树】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、树的概念2、二叉树3、二叉树的遍历4、创建二叉树5、实例分析前言 本章总结&#xff1a;树的概念、二叉树的创建、遍历 1、树的概念 树结构是以分支关系定义得一种层次结构。 树的定义&#xff1a;树是由n(n>0)个结点…

可以自动撑起的html样式,好好玩:CSS3抖动样式CSS Shake让你的网页酷炫起来

之前在一些网站发现了一个好玩的样式&#xff0c;就是鼠标移到网站LOGO上&#xff0c;logo会自动抖动起来&#xff0c;显得非常炫酷。我也是十分感兴趣。自从本站新添加了一个视觉设计的分类之后&#xff0c;我也是想起来有个抖动CSS样式CSS Shake&#xff0c;所以今天给小伙伴…

爬虫项目(一)---采集最近一日世界各国的疫情数据信息

该内容出自黑马程序员教程 采集最近一日世界各国疫情数据 步骤&#xff1a; 发送请求&#xff0c;获取疫情首页从疫情首页中提取最近一日各国疫情字符串从最近一日各国疫情字符串中提取json格式字符串把json格式字符串转换为Python类型把Python类型的数据&#xff0c;以json…

【数据结构基础应用】【顺序表】

代码参考《妙趣横生的算法.C语言实现》、《剑指OFFER 名企面试官精讲典型编程题 第2版》等 文章目录前言1、合并两个顺序表前言 本章总结在看书过程中的一些关于顺序表的算法题并可能含有一些自己的一些疑问。题目数量不定&#xff0c;随阅历增加而增加&#xff1b; 1、合并两…

html上下滚动切换顶端tab,jQuery实现Tab菜单滚动切换的方法

本文实例讲述了jQuery实现Tab菜单滚动切换的方法。分享给大家供大家参考。具体如下&#xff1a;这是一款jQuery实现让你的Tab菜单滚动的代码,先运行一下看看效果咋样?是不是超不错,让你的网页变得灵动起来,不再静止,学习jquery的朋友也可作为范例来参考吧.运行效果截图如下&am…

[转载]十四步实现拥有强大AI的五子棋游戏

又是本人一份人工智能作业……首先道歉&#xff0c;从Word贴到Livewrter&#xff0c;好多格式没了&#xff0c;也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋&#xff0c;可以说需要考虑的问题还是很多的&#xff0c;我们将制作拥有强大AI五子棋的过程分为十四…

爬虫项目(二)---采集从03月02号以来的世界各国疫情数据

该内容出自黑马程序员教程 采集从03月02号以来的世界各国疫情数据 步骤&#xff1a; Ⅰ&#xff0c;重构项目(一)的代码&#xff0c;以提高扩展性 把功能封装到一个类中每一个小功能变成一个方法通过run方法启动爬虫 import requests import re import json from bs4 impor…

【原创】StreamInsight查询系列(二十)——查询模式之检测间隙事件

上篇文章介绍了查询模式中如何检测异常事件&#xff0c;这篇博文将介绍StreamInsight中如何检测间隙事件。 测试数据准备 为了方便测试查询&#xff0c;我们首先准备一个静态的测试数据源&#xff1a;// 创建数据源&#xff0c;要注意的是4:16和4:30之间存在的事件间隙 var sou…

【数据结构基础应用】【查找和排序算法】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、顺序查找2、折半查找3、直接插入排序4、选择排序5、冒泡排序6、希尔排序7、快速排序8、堆排序9、排序算法性能比较10、所有算法的code&#xff08;C语言&#xff09;前言 本章总结查找和排序算法&#xff1a;顺序查找、折…

爬虫项目(三)---采集最近一日全国各省疫情数据

该内容出自黑马程序员教程 采集最近一日全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 思路&#xff1a;首先需要先确定全国各省疫情数据的位置 全国各省份的疫情数据…

计算机专业博士后排名,排名丨计算机专业领域TOP10,性价比超高!

原标题&#xff1a;排名丨计算机专业领域TOP10&#xff0c;性价比超高&#xff01;相信各位家长、同学已经看过太多专业的排名&#xff0c;我问过很多理科生将来想学什么专业&#xff0c;听到频率最高的还是计算机专业。似乎大家都知道&#xff0c;学计算机是比较挣钱的&#x…

js 命名规范

转载于:https://www.cnblogs.com/zjx2011/p/3165043.html

爬虫项目(四)---采集从01月22日以来全国各省疫情数据

采集从03月02日以来全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 分析 确定01月22日以来全国各省疫情数据的URL 由项目(三)可以获取全国各省疫情数据点击可下载&…