头插法和尾插法建立单链表详解与实现

article/2025/9/30 3:31:57

写在前面:本文使用C语言和C++引用,学C和C++的同学都是可以看懂的,C++毕竟向下兼容C。很详细,一篇能搞懂代码和原理。

先来了解几个简单概念

单链表就是线性表的链式存储;

头结点:单链表在第一个结点之前附加了一个结点,这个结点里面没有存放我们要使用的数据,只是头结点方便我们对链表进行操作而设立的;

头指针:用来标识一个单链表,头指针为NULL的话就是一个空表,本文的头指针就是LinkList L;

头插法:从一个空表开始,生成一个新的结点之后,将这个数据插在头结点和头结点指向的数据(原来的第一个数据)之间,此时这个新结点就变成了第一个数据,简单说就是把数据插入在表头。最终数据是倒序输出来的;

尾插法:也就是把数据从表尾插入进去,最后数据是你怎么输入的他就怎么输出;

头插法过程:申请好空间,输入我们要插入的数据之后,我们申请的新的结点的指针(s->next)指向后一个数据的空间(L->next),头部的指针(L->next)指向新生成的空间(s),就这么简单!

 第一步:先创建结构体,结构体里面一个存放数据的变量,一个存放指向下一个元素的指针的变量

/*:第一步:定义结构体*/
typedef int ElemType;//可随时修改数据的类型
typedef struct LNode {ElemType data;struct LNode* next;
}LNode,*LinkList;

第二步:创建变量和初始化

/*第二步:创建变量和初始化*/
int main()
{LinkList L;Fore_insert(L);Print_list(L);return 0;
}

第三步:编写头插法函数

/*第三步:头插法*/
LinkList Fore_insert(LinkList &L)
{L = (LinkList)malloc(sizeof(LNode));//申请链表空间,最开始是空链表L->next = NULL;//链表的结构体指针赋值为空int x;//我们要插入的数据LinkList s;scanf("%d", &x);while (x != 9999) {//输入9999就停下了s = (LinkList)malloc(sizeof(LNode));//申请新结点的空间s->data = x;//把x放到结点里面去s->next = L->next;L->next = s;scanf("%d", &x);}return L;
}

尾插法的过程:最开始链表是空的,申请空间之后,r表示链表尾部,链表尾部的结构体指针(r->next)指向新结点的空间(s),然后链表尾部变成了新空间s,要把r移向链表尾部(r=s),方便对接下来插入的数据进行操作,对于最后一个插入的数据,它的结构体指针要赋值成NULL。

第四步:编写尾插法函数

/*第四步:尾插法*/
LinkList Final_insert(LinkList& L)
{L = (LinkList)malloc(sizeof(LNode));int x;LinkList s;//新结点的指针LinkList r = L;//r指向链表尾部,插入一个数据就要移动到链表尾部哦!scanf("%d", &x);while (x != 9999) {s = (LinkList)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;//r移动到链表尾部scanf("%d", &x);}r->next = NULL;//一定不要忘记把最后一个结点的指针赋值为NULLreturn L;
}

第五步:把结构体打印出来看看

/*第五步:打印结构体数据*/
void Print_list(LinkList L)//注意前面的头插和尾插都是传址调用,这里是传值调用
{L = L->next;//L是头结点,L->next指向第一个数据while (L != NULL) {//遍历到NULL也就是最后一个数据的指针就是NULL,循环结束printf("%d ", L->data);L = L->next;}printf("\n");
}

总的代码在这里:

#include<stdio.h>
#include<stdlib.h>/*:第一步:定义结构体*/
typedef int ElemType;
typedef struct LNode {ElemType data;struct LNode* next;
}LNode,*LinkList;/*第三步:头插法*/
LinkList Fore_insert(LinkList &L)
{L = (LinkList)malloc(sizeof(LNode));L->next = NULL;int x;LinkList s;scanf("%d", &x);while (x != 9999) {s = (LinkList)malloc(sizeof(LNode));s->data = x;s->next = L->next;L->next = s;scanf("%d", &x);}return L;
}/*第四步:尾插法*/
LinkList Final_insert(LinkList& L)
{L = (LinkList)malloc(sizeof(LNode));int x;LinkList s;LinkList r = L;scanf("%d", &x);while (x != 9999) {s = (LinkList)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;scanf("%d", &x);}r->next = NULL;//一定不要忘记把最后一个结点的指针赋值为NULLreturn L;
}/*第五步:打印结构体数据*/
void Print_list(LinkList L)
{L = L->next;//L是头结点,L->next指向第一个数据while (L != NULL) {//遍历到NULL也就是最后一个数据的指针就是NULL,循环结束printf("%d ", L->data);L = L->next;}printf("\n");
}/*第二步:创建变量和初始化*/
int main()
{LinkList L;Fore_insert(L);Print_list(L);//Final_insert(L);//Print_list(L);return 0;
}

最后的控制台输出结果如图所示:

头插法结果:

 尾插法结果:

 


http://chatgpt.dhexx.cn/article/ISLPb4h9.shtml

相关文章

链表的三种插入方法(头插法,尾插法,任意位置插入)

插入作为链表的四大基本操作之一&#xff08;增删改查&#xff09;&#xff0c;通常都会借助插入的方法增添信息&#xff0c;这一部分为大家着重讲解插入法。 1.头插法 简而言之&#xff0c;就是从链表的头部进行一个插入&#xff0c;定义一个结构体指针的新节点&#xff0c;…

【数据结构】:单链表之头插法和尾插法(动图+图解)

头插法和尾插法 一、头插法&#x1f4a4;思考一&#xff1a;头插法的核心是什么❓❗❗ 重点一&#xff1a;以带头结点方式实现头插法❗❗ 重点二&#xff1a;以不带头结点方式实现头插法 二、尾插法&#x1f4a4;思考二&#xff1a;尾插法的核心是什么❓❗❗ 重点三&#xff1a…

链表:头插法与尾插法(简易图解和代码)

头插法 定义&#xff1a;输入的数据次序生成的链表节点次序相反&#xff0c;例如&#xff1a;按1,2,3顺序进行头插之后&#xff0c;最终排序却变成了3,2,1。简而言之就是逆序插入。 定义图解&#xff1a; 代码图解&#xff1a; 代码&#xff1a;&#xff08;使用头插法建立单…

未声明的标识符

出现未声明的标识符错误&#xff0c;有可能是真的没有声明。但是也有可能是代码中有些注释&#xff0c;格式不对&#xff0c;导致声明的变量的作用域提前结束了。可以把注释都删掉试试

c2065 未声明的标识符 解决ok

场景1&#xff1a; cv::Mat pad_img; cv::Mat img; img 在一个if else后面声明&#xff0c;就报错了 解决方法&#xff0c;把cv::Mat 声明放到前面就行了&#xff0c;原因未知。 场景2&#xff1a; int a3; a为未声明的标识符&#xff0c;加了各种头文件&#xff0c;都不起…

已经包含头文件仍然出现,错误C2065“未声明的标识符”

由于当前在往一个比较大的项目中添加文件&#xff0c;文件又有相似性所以采取了复制的方式&#xff0c;最后出现了一个大疏漏。 在总的.cpp文件中调用新文件中的函数&#xff0c;在包含了新文件的.h头文件的情况下仍然说没有找到标识符&#xff0c;在网上找了很多方法&#xff…

c++: “default”: 未声明的标识符

c&#xff1a; “default”: 未声明的标识符 c&#xff1a; “default”: 未声明的标识符 1、错误描述 2、错误原因&#xff1a; 3、解决方案&#xff1a; 1、错误描述 错误 C2065 “default”: 未声明的标识符 2、错误原因&#xff1a; C11 标准的新特性…

C++命名空间namspace解析——“cout”未声明的标识符,“cin”未声明的标识符

首先我们先看一下下面这段代码运行时的情况&#xff08;注意按ctrlF5 运行&#xff09; #include<iostream> int main() {return 0; }运行结果如下 是一个没有任何结果的窗口 现在我们再加上一段输出代码 cout<<"hello"<<endl;会发现编译运行时…

error C2065: “string”: 未声明的标识符//error C2065: “vector”: 未声明的标识符

添加头文件没&#xff0c; #include <stdio.h> #include <string.h> #include #include using std::vector; #include <stdio.h> #include <string.h> #include <iostream> #include <vector> using std::vector;就这样&#xff0c;先&…

使用控件时提示未声明标识符的解决方法

环境&#xff1a;VS2012&#xff0c;Win8.1 64bit 参考&#xff1a; http://www.cnblogs.com/Romi/archive/2012/01/06/2314390.html http://zhidao.baidu.com/question/256304139.html 1. 用MFC默认创建Dialog类型项目&#xff0c;里面有个VS默认添加的CStatic控件 2. 如果…

引入头文件结构体,解决未声明标识符fileinfo

首先我问大佬&#xff0c;大佬让我右键单击结构体_finddata_t,找下它的定义&#xff0c;但是我没找到啥。然后大佬说让我引入结构体所在的头文件。我就右键单击_finddata_t&#xff0c;联机搜索&#xff0c;找到了它所在的头文件io.h&#xff0c;成功解决了未声明标识符fileinf…

未声明标识符怎么解决oracle,请问 什么是“未声明的标识符”错误,如何解决?...

月关宝盒 它们通常来自忘记包含包含函数声明的头文件&#xff0c;例如&#xff0c;此程序将给出“未声明的标识符”错误&#xff1a;缺少标题int main() { std::cout < return 0;}要修复它&#xff0c;我们必须包含标题&#xff1a;#include int main() { std::cout < re…

vs编译运行报错:未声明的标识符

报错如下图&#xff1a; 很奇怪&#xff0c;我这个testList是已经声明的&#xff0c;就在上一行&#xff0c;但是还是会给我报错&#xff1a;未声明的标识符。 最后发现原因是在报warning的地方。 解决办法&#xff1a; 在代码处右击出现菜单栏&#xff0c;点击最下方的【保存…

未声明标识符怎么解决oracle,什么是“未声明的标识符”错误,如何解决?

潇潇雨雨 它们通常来自忘记包含包含函数声明的头文件&#xff0c;例如&#xff0c;此程序将给出“未声明的标识符”错误&#xff1a;缺少标题int main() { std::cout < return 0;}要修复它&#xff0c;我们必须包含标题&#xff1a;#include int main() { std::cout < re…

插值算法的介绍及其在数学建模中的应用

目录 插值算法的介绍及其在数学建模中的应用 一、插值的介绍及其作用 二、插值法原理 三、插值法的分类 1、普通多项式插值 2、分段低次插值 3、&#xff08;三次&#xff09;样条插值 4、分段三次埃尔米特&#xff08;Hermite&#xff09;插值 插值算法的介绍及其在数…

插值方法学习

0.摘要 我感觉上采样阶段要放在特征提取的前期&#xff0c;而不是后期&#xff0c;因为后期的feature map太小了&#xff0c;而且相邻间的像素值会存在突变&#xff0c;会造成增加的噪声概率会比较高。参考图像插值技术综述学习了一下插值方法 1.单线性插值法 已知ac&#xf…

插值查找算法

插值查找算法 插值查找算法又称插值搜索算法&#xff0c;是在二分查找算法的基础上改进得到的一种查找算法。 插值查找算法只适用于有序序列&#xff0c;换句话说&#xff0c;它只能在升序序列或者降序序列中查找目标元素。作为“改进版”的二分查找算法&#xff0c;当有序序…

图像常用的插值算法:最近邻插值、双线性插值和双三次插值算法

图像常用的插值算法 最近邻插值算法双线性插值算法双三次插值(bicubic)算法三种插值算法的优缺点 插值算法是图像缩放中的一项基本且重要的算法&#xff1b;在图像缩放中&#xff0c;输出图像像素点坐标可能对应输入图像上几个像素点之间的位置&#xff0c;这个时候就需要通过灰…

插值拟合算法

一.插值算法 1.插值概念 构造一个函数使得所有已知点在函数图像上 2.一维插值插值方法 &#xff08;1&#xff09;一般多项式插值 &#xff08;2&#xff09;拉格朗日插值 &#xff08;3&#xff09;分段线性插值 采用线性函数 &#xff08;4&#xff09;牛顿插值 &#xf…

插值与逼近_数值分析计算方法

传送门&#xff1a; 线性和非线性方程数值解法_数值分析计算方法 &#x1f449;插值与逼近_数值分析计算方法 ⚠️施工中&#x1f477;… 1 插值 1.1 多项式插值 1.1.1 Lagrange插值 插值误差的事后估计&#xff1a;用两个结果的差来估计插值误差 使用注意 当插值点x位于…