链表基础(代码注释很多,帮助你更好理解)

概述:

什么是链表?

1、链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,有一系列结点(地址)组成,结点可动态的生成。

2、结点包括两个部分:

(1)存储数据元素的数据域(内存空间)。

(2)存储指向下一个结点地址的指针域

  (3) 相对于线性表顺序结构,操作复杂。

链表的分类:


链表的结构非常多样,以下的情况组合起来就有8种链表结构

(1)单向和双向。

(2)有头和无头。

(3)循环和不循环。

虽然说链表有这么多类型,但是掌握了其中一个,掌握链表的核心思路,其他的也就自然会了,我们这里列举的是单向链表。

 链表操作函数:

这里列举几个链表的操作函数:

我们先定义相应的结构体,用来表示链表里面的节点。

//定义结构体,结构体里面的内容相当于链表里面的节点
struct STUDENT
{char name[21];int id;struct  STUDENT* next;//指向下一个节点
};typedef struct STUDENT STU;//方便以后定义结构体,直接用STU就可以代替struct  STUDENTSTU* p, * head, * tail;//head:用于指向链表的头部,tai:用于指向链表的尾部,p:用来指向每次创建的新节点

1、 链表里面加入新的节点:

/*链表里加入新的节点*/void add_new_joint(struct STUDENT ** p_head, struct STUDENT* p_new)//这里必须用二级指针
{//p_new指向需要加入的节点struct STUDENT* p_mov = *p_head;if (*p_head == NULL)//如果这个链表为空,加入的节点作为链表的头节点{*p_head = p_new;p_new->next = NULL;}else//链表不是空的,把他加在链表最后面{while (p_mov->next != NULL){p_mov = p_mov->next;//找到原有列表最后的一个节点}p_mov->next = p_new;p_new->next = NULL;//把他加入到链表的最后}
}

2、链表的遍历:

void print_joints(struct STUDENT * head)//这里只需要用一级指针
{struct STUDENT* p_mov = head;//定义新的指针保存链表的首地址while (p_mov!= NULL)//遍历到最后一个节点{printf("name:%s id:%d\n",p_mov->name,p_mov->id);p_mov = p_mov->next;}
}

3、链表的释放:

/*链表的释放*/
void link_free(struct STUDENT ** p_head)//把整个链表给释放
{struct STUDENT * p_mov=*p_head;if (*p_head == NULL)//如果这个链表本身为空,就不需要释放{printf("不是哥们,空的,释放什么啊\n");}while (*p_head!= NULL){p_mov = *p_head;//设置p_mov是为了删掉前面的节点,*p_head保存下一个节点的位置*p_head = (*p_head)->next;free(p_mov);//释放掉节点的内存p_mov = NULL;//实际上这句是无效的,只是为告诉你需要把头指针变回null,免得野指针}
}

4、链表的查找,这里是找到对应的学生;

/*链表节点的查找,找人*/
struct STUDENT * link_search_student(struct STUDENT* head, char *name)
{struct STUDENT* p_mov = head;while (!strcmp(p_mov->name, name)&&(p_mov->next != NULL))//设置p_mov是为了去遍历整个链表,去找人{p_mov = p_mov->next;}if (strcmp(p_mov->name, name))//是找到人而退出循环{printf("这个人找到了,学号是:%d\n", p_mov->id);return p_mov;}else//找到底都找不到人而退出循环{printf("老弟,找不到这个人\n");return NULL;}
}

 5、链表节点的删除,这里是找到对应的学生删除:

/*链表节点的删除*/
void link_delete_student(struct STUDENT** p_head, char* name)
{struct STUDENT* pb = *p_head;//用来遍历整个链表struct STUDENT* pf = *p_head;//用来报保存上一个节点if (*p_head == NULL){printf("空的,不用删\n");}while ((pb->next != NULL) && (!strcmp(pb->name, name))){pf = pb;pb = pb->next;}if (strcmp(pb->name, name))//是因为找到而退出循环{if (pb == *p_head)//如果删的是头部{//(*p_head)->next = *p_head;一样的效果*p_head = pb->next;}else//删的不是头部{//因为删除节点,只要把上一个节点的next指向需要删除节点的后一个节点,所以要多去创建一个pf指向前一个节点pf->next = pb->next;}free(pb);//释放掉需要删除的节点pb = NULL;//实质上是无效的,只是为告诉你需要把删除节点的指针变回null,免得野指针}else{printf("没有您要删除的节点\n");}
}

 6、链表中插入一个节点,这里是插入学号,从小到大排序:

/*链表中插入一个节点*/
void link_insert_num(struct STUDENT** p_head, struct STUDENT* p_new)//插入学号为4的同学,按学号顺序插入,0 1 2 3 5 -> 0 1 2 3 4 5
{struct STUDENT* pb=*p_head;//pb用来遍历链表,指向插入节点的下一个节点struct STUDENT* pf = *p_head;//存放目标节点的上一个节点if (*p_head == NULL)// 链表为空链表{*p_head = p_new;p_new->next = NULL;return;}while ((pb->next != NULL) && (pb->id > p_new->id))//插入成功退出或者插入到底都插入不进去{pf = pb;pb = pb->next;}if (pb->id > p_new->id)//成功插入{if (pb=*p_head)//插入的是头节点,他变成头节点{p_new->next = *p_head;*p_head = p_new;}else//插入的不是头节点{//插入就是把需要插入的节点的next指向后一个节点,上一个节点的next指向当前插入的节点//pb插入节点的下一个节点//所以需要上一个节点pfpf->next = p_new;p_new->next = pb;}}else//插入失败,只能给她丢在后面了{pb->next = p_new;p_new->next = NULL;}
}

调用函数:

在创建以上几个链表的操作函数,就可以把他们调用到main函数里面了。这里只举一个例子,其他读者可以自己去尝试。

创建一个节点,输入内容,把节点放在链表里面,然后遍历链表,把他们在全部输出出来。

int main()
{int i;for (i = 0; i < 2; i++){p = (struct STUDENT*)malloc(sizeof(struct STUDENT));printf("请输入名字和学号\n"); scanf("%s %d",&p->name,&p->id);add_new_joint(&head,p);	//将新节点加入链表}joints_print(head);return 0;
}

到这里链表基础知识就讲完了,这只是基础,只有掌握基础之后,读者才能继续深入学习,切记,代码不是拿来看的,要去自己敲出来,画图理解,才能熟练掌握,包括我自己也是,我还需要后续去进行学习,做到真正掌握链表。

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

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

相关文章

003基于SSM的学生选课系统(学生信息管理系统)ssm+mysql

003基于SSM的学生选课系统/学生信息管理系统 开发环境&#xff1a; Eclipse/MyEclipse、Tomcat8、Jdk1.8 数据库&#xff1a; MySQL 前端&#xff1a;JavaScript、jQuery、bootstrap4、particles.js 后端&#xff1a;maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybat…

【目标检测】基于深度学习的酒瓶表面瑕疵缺陷检测(yolov5算法,6个类别,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内) 路虽远,行则将至;事虽难,做…

JavaEE初阶——文件操作和IO

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享文件操作及IO的内容 如果有不足的或者错误的请您指出! 目录 *1.解释IO**2.关于文件的基本知识*2.1路径2.1.1绝对路径2.1.2相对路径 2.2文件分类 *3.通过Java代码操作文件*3.1针…

Java毕业设计 基于SpringBoot vue城镇保障性住房管理系统

Java毕业设计 基于SpringBoot vue城镇保障性住房管理系统 SpringBoot 城镇保障性住房管理系统 功能介绍 首页 图片轮播 房源信息 房源详情 申请房源 公示信息 公示详情 登录注册 个人中心 留言反馈 后台管理 登录 个人中心 修改密码 个人信息 用户管理 房屋类型 房源信息管理…

红海云入选HRoot2023年度人力资源服务机构100强

4月26日&#xff0c;中国领先的人力资源媒体HRoot主办的『存在与现在——重新审视企业管理中的常识』2024 HRoot人力资本论坛在北京隆重举行&#xff0c;论坛汇聚人力资源领域的前沿实践者与行业思想领袖&#xff0c;与CEO、CHRO、人力资源总监、人力资源经理等企业高管&#x…

【毕设绝技】基于 SpringCloud 的在线交易平台商城的设计与实现-数据库设计(三)

毕业设计是每个大学生的困扰&#xff0c;让毕设绝技带你走出低谷迎来希望&#xff01; 基于 SpringCloud 的在线交易平台商城的设计与实现 一、数据库设计原则 在系统中&#xff0c;数据库用来保存数据。数据库设计是整个系统的根基和起点&#xff0c;也是系统开发的重要环节…

鸿蒙云函数调试坑点

如果你要本地调试请使用 const {payload, action} event.body/** 本地调试不需要序列化远程需要序列化 */ // const {payload, action} JSON.parse(event.body) const {payload, action} event.body 注意: 只要修改云函数&#xff0c;必须上传云函数 如果使用 const {pay…

NumPy 1.26 中文官方指南(一)

NumPy 用户指南 原文&#xff1a;numpy.org/doc/1.26/user/index.html 本指南是一个概述&#xff0c;解释了重要特性&#xff1b;细节请参阅 NumPy 参考文档。 入门指南 什么是 NumPy? 安装 NumPy 快速入门 NumPy&#xff1a;初学者的绝对基础 基础知识和用法 NumPy 基础…

#ESP32S3N8R8(按键点灯)

一、按键对应端口为GPIO0&#xff08;上拉&#xff09; 二、代码 #include <stdio.h> #include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "unistd.h"void app_main(void) {int co…

【产品经理修炼之道】- 政务G端业务产品介绍

相较于C端和B端产品经理&#xff0c;G端产品经理的数量可能相对较少&#xff0c;有关G端产品的系统介绍也相对较少。这篇文章里&#xff0c;作者就做了相对系统的总结&#xff0c;或许可以帮你更清楚地理解G端产品的业务类型。 产品经理多见于C端和B端&#xff0c;G端产品经理…

天空卫士旗舰产品入选《网络安全专用产品指南》

权威认证 近日&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;发布了第一版《网络安全专用产品指南》。这一权威指南中&#xff0c;天空卫士荣获殊荣&#xff0c;旗下三款尖端产品荣耀入选&#xff0c;分别是增强型Web安全网关&#xff08;ASWG&#xff09;、数…

springboot整合log4j2

springboot整合log4j2 log4j2相信大家非常常见了&#xff0c;以前基本去了项目每个都有&#xff0c;然后也都直接用&#xff0c;很少有时间研究过它&#xff0c;这不这两天稍微空了点&#xff0c;学习了下&#xff0c;然后写下了这篇文章记录。 本文主要大纲 springboot整合l…