链表(C语言版)超详细讲解


链表


链表基础

一、链表的概念
定义:

  链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构。

二、链表的构成
构成:链表由一个个结点组成,每个结点包含两个部分:数据域和指针域。

  1. 数据域(data field):每个结点中存储的数据。

  2. 指针域(pointer field):每个结点中指向下一个结点的指针。
    在这里插入图片描述
    如图一个结点包括data(存储此结点的数据)和next(指向下一个结点)

三、结点的定义

typedef struct jiedian
{int data;struct jiedian *next;
}jiedian,*touzhizhen;

这里我们定义了一个结构体(也就是结点的框架),其中包括一个数据域和一个指针域(注意指针指向的是下一个结点也就是struct jiedian所以我们要定义为struct jiedian *next)。touzhizhen指针变量的设置是为了设置一个头指针指向第一个结点。头指针是重中之重,链表的一系列操作都是由头指针开始的,可以说头指针代表了整个链表。

四、链表初始化
链表的初始化很简单,我们先申请一块结点(头节点),再用头指针指向它,并将结点的next域指向NULL。
在这里插入图片描述

//初始化一个链表头结点
jiedian* lianbiao_init(void)
{jiedian *L; // 链表头指针L=(touzhizhen)malloc(sizeof(jiedian));L->next=NULL;return L;
}

注意:函数的返回的返回值必须是头结点(头结点几乎存储了链表的所有信息)

链表新结点的插入(尾插法)

一、尾插法的概念
定义:
尾插法(Tail insertion)是一种向链表中插入新节点的方法,它常用于创建链表或在链表尾部插入新节点。
二、尾插法的优点
优点:个人认为尾插法比头插法好太多了,尾插法的优点在于每次插入新节点都只需要遍历到链表的最后一个节点,时间复杂度为O(1)。而如果使用头插法,则需要遍历到链表的第一个节点,时间复杂度为O(n),而且尾插法是由数据插入的顺序依次存储的,查找起来会更加方便。
三、使用尾插法的基本思路
在这里插入图片描述
1、首先我们定义两个指针(x1,p),x1作为头指针指向头结点(尾插法时不要移动头指针,我们只需移动p即可),p始终指向尾结点(这里我们初始化指向头结点),再申请一块结点并用x指向它。这样我们基础工作完成。
2、在这里插入图片描述
第一步,让p所指向的结点和x结点建立联系(即让next指向x)。
第二步,让p指向x结点(指向尾结点,为下一次的插入做准备)。
注意:尾插法结束后必须要让尾结点指向NULL(这样才是一个有效的可以操作的链表)。
以上就是尾插法的基本操作,下面是代码。

jiedian* weichafa(jiedian * x1)
{int n;jiedian * p;jiedian * x;p=x1;while(n!=999){cin>>n;p->data=n;if(n!=999){x=(touzhizhen)malloc(sizeof(jiedian));p->next=x;p=x;}}p->next=NULL;return x1;
}

这里我们返回的依然是头指针(代表了整个链表)。

遍历链表

void printv(jiedian * x1)
{int s;while(x1!=NULL){s=x1->data;x1=x1->next;cout<<s<<endl;}
}

遍历链表的方法很简单,就是通过头指针的移动读取每个结点的数据域以遍历整个链表。

查找

查找某个数据也同样简单(和遍历的思想基本相同)。

int search(jiedian * x1,int n)
{int y;int n1=0;while(x1!=NULL){n1++;y=x1->data;if(y==n){return n1;}x1=x1->next;}return 0;
}

n代表我们所以要查找的数,函数的返回值是n在链表的位置。

插入结点

在这里插入图片描述

jiedian* plusjiedian(int n,int num,jiedian * x1)
{int i;jiedian* x;jiedian* x2;x2=x1;for(i=0;i<n;i++){x1=x1->next;}x = (touzhizhen)malloc(sizeof(jiedian));x->next=x1->next;x1->next=x;x->data=num;return x2;
}

先上代码,n代表我们在第几个结点后添加结点,num代表此结点的数据域值。
1、我们先使用一个for循环使x1指向第n个结点,让我们申请的结点的next指向第n+1个结点。
2、让第n个结点的next指向新添加的结点。
注意:第一步和第二步的顺序不能变,因为x的next是由x1传递给他的。

删除结点

在这里插入图片描述

jiedian* deletejiedian(int n,jiedian * x1)
{int i;jiedian* x2;x2=x1;for(i=0;i<n-2;i++){x1=x1->next;}x1->next=x1->next->next;return x2;
}

先上代码,删除比添加的操作要简单。
1、和添加不同的是,删除用for循环指向的是第n个结点的前面一个结点。
2、直接x1->next=x1->next->next;就可以让x1和x1+2的结点链接起来,这里按理来说要释放被删除的空间,读者可直接使用free函数即可。

主函数

int main()
{int n,mode;jiedian * L;jiedian * L1;jiedian * x2;jiedian * x3;L=lianbiao_init();L1=weichafa(L);cout<<"请输入你要选择的模式"<<endl;cin>>mode;if(mode==1)//直接打印printv(L1);if(mode==2)//找到数据并输出位置{n=search(L,10);cout<<n<<endl;}if(mode==3)//增加结点{x2=plusjiedian(2,1000,L1);
printv(x2);}if(mode==4){x3=deletejiedian(2,L1);
printv(x3);}
}

在上全部代码之前我们先了解一下主函数,主函数设置了四种模式,读者可自由选择。
1、直接打印链表。
2、遍历结点。
3、增加结点。
4、删除结点。

总代码

#include<iostream>
#include<malloc.h>
using namespace std;
//定义结点
typedef struct jiedian
{int data;struct jiedian *next;
}jiedian,*touzhizhen;
//初始化一个链表头结点
jiedian* lianbiao_init(void)
{jiedian *L; // 链表头指针L=(touzhizhen)malloc(sizeof(jiedian));L->next=NULL;return L;
}jiedian* weichafa(jiedian * x1)
{int n;jiedian * p;jiedian * x;p=x1;while(n!=999){cin>>n;p->data=n;if(n!=999){x=(touzhizhen)malloc(sizeof(jiedian));p->next=x;p=x;}}p->next=NULL;return x1;
}
void printv(jiedian * x1)
{int s;while(x1!=NULL){s=x1->data;x1=x1->next;cout<<s<<endl;}
}
int search(jiedian * x1,int n)
{int y;int n1=0;while(x1!=NULL){n1++;y=x1->data;if(y==n){return n1;}x1=x1->next;}return 0;
}
jiedian* plusjiedian(int n,int num,jiedian * x1)
{int i;jiedian* x;jiedian* x2;x2=x1;for(i=0;i<n;i++){x1=x1->next;}x = (touzhizhen)malloc(sizeof(jiedian));x->next=x1->next;x1->next=x;x->data=num;return x2;
}
jiedian* deletejiedian(int n,jiedian * x1)
{int i;jiedian* x2;x2=x1;for(i=0;i<n-2;i++){x1=x1->next;}x1->next=x1->next->next;return x2;
}
int main()
{int n,mode;jiedian * L;jiedian * L1;jiedian * x2;jiedian * x3;L=lianbiao_init();L1=weichafa(L);cout<<"请输入你要选择的模式"<<endl;cin>>mode;if(mode==1)//直接打印printv(L1);if(mode==2)//找到数据并输出位置{n=search(L,10);cout<<n<<endl;}if(mode==3)//增加结点{x2=plusjiedian(2,1000,L1);
printv(x2);}if(mode==4){x3=deletejiedian(2,L1);
printv(x3);}
}

这是我的第一篇博客,创作不易,能看到这里的读者谢谢大家的支持和鼓励,以后我也会陆续更新我的博客,流水不争先,争的是滔滔不绝,希望大家能够实现自己的梦想!!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

全网最详细的Jmeter接口自动化测试

前面我们复习了jmeter 的非图形化界面运行我们的测试接口。 大家可以翻看往期jmeter的文章。 具体来说就是&#xff1a;jmeter -n -t ****.jmx -l ****.jtl -e -o **** (*号代表路径&#xff09; 生成了测试报告。 但是这个非图形化运行有个缺点&#xff0c;就是只能运…

蓝牙资产标签信标

随着科技的不断进步&#xff0c;蓝牙技术的应用已经深入到我们的日常生活中。其中&#xff0c;蓝牙资产标签作为一种新型的资产管理方式&#xff0c;正逐渐受到广泛欢迎。蓝牙资产标签是一种基于蓝牙技术的小型电子标签&#xff0c;可以粘贴在各种资产上&#xff0c;通过手机或…

代码随想录算法训练营第27天—贪心算法01 | ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

理论基础 https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 贪心算法的本质&#xff1a;由局部最优推到全局最优贪心算法的套路&#xff1a;无固定套路 455.分发饼干 https://programmercarl.com/0455.%E5%88%8…

(白盒测试)简单循环测试

简单循环测试 1.为什么要引入简单循环测试&#xff1f; 用来测试代码中的循环结构是否能正常执行 是否会少执行一次&#xff1f;多执行一次&#xff1f; 通过循环测试就可以得知 2.什么是简单循环&#xff1f; 没有嵌套的循环⇒简单循环 比如 单层的for循环 单层的while循…

【Qt】鼠标拖拽修改控件尺寸---八个方位修改

前提 在开发一个类似qdesiger的项目中 使用QGraphicsProxyWidget将Qt基础控件作为item放在场景视图中显示和编辑 创建自定义类继承QGraphicsProxyWidget&#xff0c;管理控件 成员变量 有控件的xywh等&#xff0c;其中x、y坐标存储是基于最底层widgetitem的 坐标系 x轴以右为正…

anaconda指定目录创建环境无效/环境无法创建到指定位置

已经设置目录到D盘 创建环境时还是分配到C盘 可能是指定位置没有开启读写权限&#xff0c;如我在这里安装到了anaconda文件夹&#xff0c;则打开该文件夹的属性->安全->编辑 allusers下的权限全都打勾

【DAY05 软考中级备考笔记】线性表,栈和队列,串数组矩阵和广义表

线性表&#xff0c;栈和队列&#xff0c;串数组矩阵和广义表 2月28日 – 天气&#xff1a;阴转晴 时隔好几天没有学习了&#xff0c;今天补上。明天发工资&#xff0c;开心&#x1f604; 1. 线性表 1.1 线性表的结构 首先线性表的结构分为物理结构和逻辑结构 物理结构按照实…

动态规划之使用最小花费爬楼梯【LeetCode】

动态规划之使用最小花费爬楼梯 LCR 088. 使用最小花费爬楼梯解法1解法2 LCR 088. 使用最小花费爬楼梯 LCR 088. 使用最小花费爬楼梯 解法1 状态表示&#xff08;这是最重要的&#xff09;&#xff1a;dp[i]表示以第i级台阶为楼层顶部&#xff0c;到达第i层台阶的最低花费。 状…

LeetCode_Java_移除链表元素(题目+思路+代码)

203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]思路&#xff1a;…

idea打包报错,clean、package报错

一、idea在打包时&#xff0c;点击clean或package报错如下&#xff1a; Error running ie [clean]: No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system. 示例图&#xf…

从0开始python学习-53.python中flask创建简单接口

目录 1. 创建一个简单的请求,没有写方法时默认为get 2. 创建一个get请求 3. 创建一个post请求&#xff0c;默认可以使用params和表单传参 4. 带有参数的post请求 1. 创建一个简单的请求,没有写方法时默认为get from flask import Flask, request# 初始化一个flask的对象 ap…

Python入门学习:if语句与条件控制--and、or、in、not in详解与实践

Python入门学习&#xff1a;if语句与条件控制–and、or、in、not in详解与实践 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

42.do...while语句

目录 一.什么是do...while语句 二.语法 三.执行流程图 四.举例 五.视频教程 一.什么是do...while语句 do...while语句也是循环语句&#xff0c;和while语句的区别是&#xff0c;while语句是先判断表达式&#xff0c;如果表达式成立才会执行循环体中的内容&#xff0c;否则…

【vmware安装群晖】

vmware安装群晖 vmware安装群辉&#xff1a; vmware版本&#xff1a;17pro 下载链接&#xff0c; https://customerconnect.vmware.com/cn/downloads/details?downloadGroupWKST-1751-WIN&productId1376&rPId116859 激活码可自行搜索 教程&#xff1a; https://b…

【数据结构(C语言)】排序详解

目录 文章目录 前言 一、排序的概念 1.1 排序的概念 1.2 常见的排序算法 二、插入排序 2.1 直接插入排序 2.1.1 基本思想 2.1.2 特性总结 2.1.3 代码实现 2.2 希尔排序 2.2.1 基本思想 2.2.2 特性总结 2.2.3 代码实现 三、选择排序 3.1 直接选择排序 3.1.1…

【技术杂谈】关于线程池在生产环境中的使用

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

快讯|Tubi 更新内容库重新定义自己

在每月一期的 Tubi 快讯中&#xff0c;你将全面及时地获取 Tubi 最新发展动态&#xff0c;欢迎&#x1f31f;星标关注【比图科技】&#xff0c;一起成长变强&#xff01; Tubi 更新内容库&#xff0c;重新定义自己 Tubi 近日宣布为数千万用户免费提供备受观众喜爱、获奖无数的…

Python多线程编程:深入理解threading模块及代码实战【第99篇—Multiprocessing模块】

Python多线程编程&#xff1a;深入理解threading模块及代码实战 在Python编程中&#xff0c;多线程是一种常用的并发编程方式&#xff0c;它可以有效地提高程序的执行效率&#xff0c;特别是在处理I/O密集型任务时。Python提供了threading模块&#xff0c;使得多线程编程变得相…

林曦老师的新年礼物,送你三个学习锦囊

暄桐是一间传统美学教育教室&#xff0c;创办于2011年&#xff0c;林曦是创办人和授课老师&#xff0c;教授以书法为主的传统文化和技艺&#xff0c;皆在以书法为起点&#xff0c;亲近中国传统之美&#xff0c;以实践和所得&#xff0c;滋养当下生活。    在暄桐六阶读书课…

每日一题 2673使二叉树所有路径值相等的最小代价

2673. 使二叉树所有路径值相等的最小代价 题目描述&#xff1a; 给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树…