C语言——基础链表详解
敢于向黑暗宣战的人,心里必须充满光明。
一、链表的构成
1.构成
链表是由一连串的结构(称为结点)组成的。
(1)结点的构成:
数据(要储存的数据)+指针(指向下一个结点的指针)
(2)关于几个定义
头结点:链表首结点前的一个结点(不是必须的,但是如果有就可以在解决某些问题时候方便一些,通常可以用来储存链表的长度等信息)
首结点:链表的第一个数据元素
头指针:必须要有的(而头结点可以没有,注意两者一个是指针一个是结点,一个必须有一个可以没有),指向头结点/首节点的指针(永远指向链表的第一个结点)
2.结点类型声明、创建结点
struct node{int value;struct node *next;//创建了一个指向一个node类型的指针,用于指向下一个结点
};
//至此声明了一个结点类型//头指针:
struct node *first = NULL;//结点创建:struct node *new_node;
new_node = (struct node *)malloc(sizeof(struct node));//给结点分配内存单元。注意:malloc返回的是void类型的指针,所以可以强制类型转换一下
new_node -> value = 10;//把数据存储到结点中
二、在链表开始处插入结点
struct node * first = NULL;struct node *new_node;
new_node =(struct node *)malloc(sizeof(struct node));
new_node ->value = 10;//将new_node结点插入链表开始处new_node->next = first;//new_node指向的node类型的next值为NULL,NULL可作为链表结尾(空指针)
first = new_node;//让first 指向 new_node指向的结点(其实就是刚才malloc出来的结点)//ok至此,现在就已经有了一个链表,它有一个结点,结点中储存的值是10new_node = (struct node*)malloc(sizeof(struct node));
new_node ->value = 2;
new_node->next = first;//又新创建了个结点并让next指向第一次创建的结点(因为first是指向第一次创建的结点的)
first = new_node;//可以理解为把头指针重置到头部
我们把它封装成函数
对于这样的函数我们传入一个链表list,和一个希望存入链表的数值n
struct node* add_to_list(struct node *list,int n)
{sturct noed *new_node;new_node = (struct node*)malloc(sizeof(struct node));if(new_node == NULL){printf("malloc error\n");exit(0);}new_node->value = n;new_node->next = list;//把新结点接到链表中return new_node;
}first = add_to_list(first,10);
first = add_to_list(first,20);
//需要注意的是add_to_list函数是没有办法修改指针的(因为这个相当于复制了一个指针传进去,能修改它指向的东西,但是没有办法对他本身进赋值存储)
//所以我们返回一个指向新结点的指针,让他作为返回值赋值储存给first
需要注意的是add_to_list函数是没有办法修改指针的(因为这个相当于复制了一个指针传进去,能修改它指向的东西,但是没有办法对他本身进赋值存储),所以我们返回一个指向新结点的指针,让他作为返回值赋值储存给first
三、搜索链表
while循环可以用,但是我们都知道for循环是很灵活的。这是一张访问链表中结点的习惯方法:
[惯用方法]
for (p = first; p !=NULL; p = p->next)...
这里可以使用指针变量p来追踪结点,p = p->next 就能实现了让p从一个结点移动到下一个结点
第一种方法:
struct node* search_list(struct node *list,int n)
{struct node *p;for(p = list; p != NULL; p = p->next){if(p -> value == n)return list;}return NULL;}
第二种方法:
struct node *search_list(struct node *list,int n)
{for(;list != NULL;list = list->next){if(list->next == n)return list;}return NULL;
}
这里list是原始链表指针的副本,所以在函数中对他改变是没有损害的
四、从链表中删除结点
步骤:
1.定位要删除的结点(搜索链表)
2.改变前一个结点的指向,从而使链表“绕过”希望删除的结点
3.调用free函数收回期望删除的结点占用的内存空间
一种方法:“追踪指针”法,在搜索链表时总是保留一个指向前一个结点的指针(prev)还有一个指向当前指针的结点(cur)。
如下:(list是带搜索链表,n是要删除的整数)
for(cur = list,prev = NULL;cur != NULL && cur->value != n;prev = cur,cur = cur ->next);
prev->next = cur->next;//条件为假,结束循环,让prev指向cur的下一个结点从而完成“绕过”操作
注意:表达式3是每次循环中最后一次被执行的操作
然后在free掉cur,让prev指向next
封装成函数:
struct node *delete_list(struct node *list,int n){struct node *prev,*cur;for(cur = list,prev = NULL;cur != NULL && cur->value != n;prev = cur,cur = cur->next);//这个for循环只是为了找到希望删除的结点即value等于n的结点if(cur == NULL)//找到了最后也没找到要删除的结点,不用删除,返回listreturn list;if(prev == NULL)//条件为假,未执行for循环,即首结点为n,直接让list指向下一个结点来绕过即可list = list->next;//对于删除链表中的首结点是一种特殊情况,需要特殊判断特殊绕过他。elseprev->next = cur->next;//绕过要删除的结点free(cur);//释放掉被删除的结点的内存return list;
}
C语言——基础链表详解相关推荐
- R语言基础知识详解及概括
R语言基础知识详解及概括 目录 R语言基础知识详解及概括 R数据可视化示例 R语言进行数据创建
- C语言-基础练习题详解
目录 前言 一.模拟用户登录情景 1.要求 2.代码 二.求两数的最大公约数 1.方法简介 2.代码 三.打印闰年 1.要求与概念 2.代码 四.打印100-200之间的素数 1.方法与概念 2.代码 ...
- C语言---单链表(详解)---数据结构
单链表所需要的头文件 重命名类型的意义在于以后还需要用到单链表时,存入的类型不一定时int类型,需要更改类型时,要一个个更改,非常麻烦,我们可以直接在这里修改,更加方便(这里的解释我上一篇也有提到) ...
- R语言可视化绘图基础知识详解
R语言可视化绘图基础知识详解 图形参数:字体.坐标.颜色.标签等: 图像符号和线条: 文本属性: 图像尺寸及边界: 坐标轴.图例自定义等: 图像的组合: #install.packages(c(&qu ...
- Go 语言快速开发入门(基础语法详解,第一节)
Go 语言快速开发入门(基础语法详解,第一节) 一.基础语法详解,第一节 1.HelloWorld 1.1.代码编写和解释 1.2.go语言注意事项 2.Go 语言的转义字符&&Go ...
- C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt
c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...
- python编程语法大全-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...
- python编程语法-Python编程入门——基础语法详解
今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...
- python编程if语法-Python编程入门基础语法详解经典
原标题:Python编程入门基础语法详解经典 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_number = ...
- python编程语法-Python编程入门——基础语法详解(经典)
今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...
最新文章
- Matlab与线性代数 -- 寻找矩阵的非零元素
- 2018python好找工作吗-2018年为什么要学习Python?Python还有前景吗?
- 投资计算机方面的策略构建,金融投资简单的策略分享和构建策略的基本思路
- 硬肝!超详细的Python文件操作知识
- 51. N-Queens N 皇后
- 【嵌入式】C语言高级编程-内联函数(10)
- Weblogic EJB 学习笔记(2)精
- 商务搜索引擎_2019年中国网民搜索引擎使用情况研究报告
- Java—static关键字
- 毫秒数据字符串转换为DateTime
- Eclipse 常用技巧及常见问题解决
- 数据-第12课-线性表课后练习
- 阿里云CentOs 6.4 yum报错Couldn't resolve host'xx
- Docker视频教程
- 制作ppt时如何使logo背景变成透明
- matlab仿真中直流电压,直流升压变换器的MATLAB仿真.doc
- 元宇宙产业化还很遥远
- win 2008R2启用TLS 1.2 Windows 2008/2008R2手动启用TLS1_2协议教程
- [C++]<numeric>头文件介绍
- 7-3 出租车计价 (15 分)
热门文章
- 基于vue的房屋中介管理系统
- 计算机电子电路原理图,简单电路图入门-电路原理图入门知识图解
- mysql5.7 64位下载_MySQL5.7下载-MySQL数据库5.7下载 v5.7.22.1官方版(32位/64位)--pc6下载站...
- Spring Boot基础教程 - 程序猿DD
- ccf csp 题目:工资计算
- 【python】爬取元素周期表的元素信息
- 优麒麟安装qq (Ubuntu)
- python pickle文件大小_无法在Python中加载以前转储的大尺寸pickle文件
- 常用学术文献数据库界面及导出参考文献方法
- 软磁材料和硬磁材料的区别