敢于向黑暗宣战的人,心里必须充满光明。

一、链表的构成

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语言——基础链表详解相关推荐

  1. R语言基础知识详解及概括

    R语言基础知识详解及概括 目录 R语言基础知识详解及概括 R数据可视化示例 R语言进行数据创建

  2. C语言-基础练习题详解

    目录 前言 一.模拟用户登录情景 1.要求 2.代码 二.求两数的最大公约数 1.方法简介 2.代码 三.打印闰年 1.要求与概念 2.代码 四.打印100-200之间的素数 1.方法与概念 2.代码 ...

  3. C语言---单链表(详解)---数据结构

    单链表所需要的头文件 重命名类型的意义在于以后还需要用到单链表时,存入的类型不一定时int类型,需要更改类型时,要一个个更改,非常麻烦,我们可以直接在这里修改,更加方便(这里的解释我上一篇也有提到) ...

  4. R语言可视化绘图基础知识详解

    R语言可视化绘图基础知识详解 图形参数:字体.坐标.颜色.标签等: 图像符号和线条: 文本属性: 图像尺寸及边界: 坐标轴.图例自定义等: 图像的组合: #install.packages(c(&qu ...

  5. Go 语言快速开发入门(基础语法详解,第一节)

    Go 语言快速开发入门(基础语法详解,第一节) 一.基础语法详解,第一节 1.HelloWorld 1.1.代码编写和解释 1.2.go语言注意事项 2.Go 语言的转义字符&&Go ...

  6. C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt

    c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...

  7. python编程语法大全-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...

  8. python编程语法-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...

  9. python编程if语法-Python编程入门基础语法详解经典

    原标题:Python编程入门基础语法详解经典 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_number = ...

  10. python编程语法-Python编程入门——基础语法详解(经典)

    今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...

最新文章

  1. Matlab与线性代数 -- 寻找矩阵的非零元素
  2. 2018python好找工作吗-2018年为什么要学习Python?Python还有前景吗?
  3. 投资计算机方面的策略构建,金融投资简单的策略分享和构建策略的基本思路
  4. 硬肝!超详细的Python文件操作知识
  5. 51. N-Queens N 皇后
  6. 【嵌入式】C语言高级编程-内联函数(10)
  7. Weblogic EJB 学习笔记(2)精
  8. 商务搜索引擎_2019年中国网民搜索引擎使用情况研究报告
  9. Java—static关键字
  10. 毫秒数据字符串转换为DateTime
  11. Eclipse 常用技巧及常见问题解决
  12. 数据-第12课-线性表课后练习
  13. 阿里云CentOs 6.4 yum报错Couldn't resolve host'xx
  14. Docker视频教程
  15. 制作ppt时如何使logo背景变成透明
  16. matlab仿真中直流电压,直流升压变换器的MATLAB仿真.doc
  17. 元宇宙产业化还很遥远
  18. win 2008R2启用TLS 1.2 Windows 2008/2008R2手动启用TLS1_2协议教程
  19. [C++]<numeric>头文件介绍
  20. 7-3 出租车计价 (15 分)

热门文章

  1. 基于vue的房屋中介管理系统
  2. 计算机电子电路原理图,简单电路图入门-电路原理图入门知识图解
  3. mysql5.7 64位下载_MySQL5.7下载-MySQL数据库5.7下载 v5.7.22.1官方版(32位/64位)--pc6下载站...
  4. Spring Boot基础教程 - 程序猿DD
  5. ccf csp 题目:工资计算
  6. 【python】爬取元素周期表的元素信息
  7. 优麒麟安装qq (Ubuntu)
  8. python pickle文件大小_无法在Python中加载以前转储的大尺寸pickle文件
  9. 常用学术文献数据库界面及导出参考文献方法
  10. 软磁材料和硬磁材料的区别