一、引言

上篇文章我们知道了顺序表的缺点:

  • 插入和删除操作需要移动大量元素。
  • 数组的大小不好确定。
  • 存储分配需要一整段连续的存储空间,不够灵活,造成很多碎片(空闲的空间得不到利用)。

所以我们就引入了单链表

二、简述单链表

单链表中逻辑上相邻的两个元素在物理位置上不相邻,一个结点分为数据域和指针域,如下图,1的指针域(指针变量)存放2的起始地址,以此类推,就很像我们生活中的火车,最后一个结点的指针域为NULL,当我们在遍历的时候遇到NULL,就明白是单链表的结束

括号外面的LNode是别名等价于struct LNode,LinkList等价于struct LNode *LinkList

三、单链表的实现

头指针:链表中第一个结点的存储位置,用来标识单链表

头结点:在单链表的第一个结点(a1)之前附加的一个结点,为了操作的方便(带头结点就是头结点没数据)

若链表有头结点,则头指针永远指向头结点,不论链表是否为空,头指针均不为空,头指针是链表的必要元素,标识一个链表。
        头结点为了操作的方便,其数据域一般为空,或者存放链表的长度。有头结点后,对在第一结点前插入和删除第一结点的操作就统一了 ,不用频繁重置头指针。但头结点不是一定要的。

头插、尾插、中间插如下图

(a)(b)插入的代码:

这里的p即为代码中的L(链头)

(c)插入的代码:

四、代码

#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>typedef int ElemType;//单链表中的元素类型
//单链表结点的定义
typedef struct LNode{//单链表结点类型ElemType data;//数据域struct LNode *next;//指针域 指向下一个结点
}LNode,*LinkList;//*LinkList等价于struct LNode *LinkList
/*头插法建立单链表*/
LinkList createListH(LinkList &L)
{LNode *q;int n;L=(LinkList)malloc(sizeof(LNode));//带头结点的链表L->next=NULL;//L.data没存数据scanf("%d",&n);//读取数据while (n!=999){q=(LNode*)malloc(sizeof(LNode));//申请新空间给qq->data=n;//把读取的值给q->dataq->next=L->next;//新结点的next指针指向链表的第一个元素(第一个放数据的元素)L->next=q;scanf("%d",&n);//继续读取}return L;
}
/*尾插法建立单链表*/
LinkList createListT(LinkList &L)
{L=(LinkList)malloc(sizeof(LNode));//带头结点的链表LNode *q,*r=L;//写成LinkList q,r=L;也可以,这里r一开始就是表尾结点指向链表尾部int n;scanf("%d",&n);//读取数据while (n!=999){q=(LNode*)malloc(sizeof(LNode));//申请新空间给qq->data=n;//把读取的值给q->datar->next=q;//尾部结点指向新结点r=q;//r指向新的表尾结点scanf("%d",&n);//继续读取}r->next=NULL;//尾指针的next指针赋值为空return L;}
void printList(LinkList L)//这里L没用引用,不会改变主函数里面的L
{L=L->next;while (L!=NULL){printf("%3d",L->data);L=L->next;//打印完数据指向下一个结点继续打印,直到L=NULL}printf("\n");
}
int main()
{LinkList L;//链头 结构体指针类型LinkList pfind;//存储拿到的某个结点createListH(L);//输入 1 2 3 4 5//createListT(L);printf("头插法打印链表元素如下:\n");printList(L);//打印链表return 0;
}

1、scanf("%d",&n);输入时会忽略空格 ,可以一次性输一排,空格隔开

2、 注意尾插法中一定要把尾指针的next指针赋值为空(r->next=NULL;),不然会出现异常,不是NULL,就会指向申请的空间的地址,在打印链表时进入while循环判断时不等于NULL,就会去拿它指向的空间的数据(L->data),而这个地址是不可读的,这时候去访问就出现异常

五、结果

输入1 2 3 4 5 999(遇到999回车结束输入)

遇到的bug:尾插法输入完直接结束,如图

调试如下:

发现问题:

解决问题:链头要先申请空间再赋值给结点r

原创不易,转载请注明出处:

数据结构(二)——单链表的头插与尾插

数据结构(二)——单链表的头插与尾插相关推荐

  1. 单链表的头插法和尾插法c语言实现

    /*单链表的头插法和尾插法c语言实现*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #d ...

  2. 单链表的头插法尾插法及删除节点操作

    带头节点的单链表的头插法尾插法及删除节点操作 链表的操作对于初学者来说理解非常有难度,初学的同学们应该在学习链表的过程中多再练习本上画图,写一行代码就画出代码执行后链表各节点图的变化,方便理解.我也是 ...

  3. 单链表建立——头插法和尾插法

    引言 当我们准备采用单链表形式实现线性表,第一步就是要建立单链表,即初始化.由于链表是一个动态结构,不需要预先分配空间,因此生成链表的过程就是"逐个插入"的过程,插入结点的位置可以 ...

  4. 单链表的头插法和尾插法实现代码(无头结点)

    /*头指针,可以发现head是赋值为NULL,而不是head->next*/ //-----------------头插法------------------- node *head, *p; ...

  5. 关于单链表的头插法和尾插法

    #include<stdio.h> #include<stdlib.h>  typedef struct Node {         //        定义的链表类型    ...

  6. c语言 链表建立头插法尾插法,单链表的创建(头插法和尾插法)

    单链表的创建分为头插法和尾插法,头插法是不断地向头结点插入新的结点.这样会使你所插入的结点值呈现逆序,所以头插法也可以实现单链表的逆置.尾插法是不断地向插入的新元素之后再插入新的元素.需要注意的是头插 ...

  7. 数据结构 在顺序表中头插及尾插的实现

    头插 头插和尾插不同尾插只需要在顺序表最后插入一个数据容量不够扩容即可,而头插需要移动元素 ,所以我们必须明白是应该从后往前还是从前往后移动元素. //头插 从后向前移动(防止数据被覆盖) void ...

  8. 链表的头插法和尾插法——头插尾插交替插入

    private static ListNode dummy = new ListNode(0);//头插法public static void headInsert(ListNode node){if ...

  9. 【C数据结构】单链表的实现以及链表和顺序表的优缺点

    文章目录 一.链表和顺序表的相辅相成 二.认识链表的最简单结构(单链表) 1.单链表的结构: 2.单链表的简单操作实现: (1).提前准备(头文件和测试源文件) (2).单链表的头插.尾插与创建一个新 ...

最新文章

  1. vscode安装python插件_python之VSCode
  2. Netty的引用计数对象
  3. python短信接口_短信接口DEMO-PYTHON
  4. SDO_GEOMETRY Object Type
  5. Java并发——线程中断学习
  6. android获取屏幕宽高与获取控件宽高
  7. MyBatis→优缺点、select延迟加载、接口式MyBatis编程、一级缓存、二级缓存、集成Redis自定义缓存、Log4j
  8. The Classic IQ Test
  9. 史上最详细的Studio教程二来啦
  10. php select事件模型,select:联动+change事件(数据从后台获取)总结
  11. Android、Symbian系统手机通讯录和Google Gmai同步
  12. 学习java第15天
  13. Qsetting本地缓存PC端数据
  14. 【20230407】NVIDIA显卡算力、Jetson比较
  15. STM32F407传输OV2640视频数据并在PC端显示
  16. IE6浏览器不支持固定定位(position:fixed)解决方案
  17. TaefTestParser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
  18. 刚刚,2019年中国信息通信服务交流研讨会盛大召开!
  19. 【C#/WPF】Bitmap、BitmapImage、ImageSource 、byte[]转换问题
  20. 为远程桌面Ubuntu配置固定的公网TCP端口地址【内网穿透】

热门文章

  1. iOS 自定义转场动画篇
  2. 决策树的三种常见算法
  3. SpringCloud全家桶主要组件及通信协议剖析
  4. 状态方程的离散化仿真
  5. 任正非评华为HR胡玲事件,元芳你怎么看?
  6. 全国大学生“高教杯“成图大赛:轴类零件的快速建模
  7. android vivo 模拟器,逍遥安卓打造VIVO华为魅族OPPO小米联想手游安卓模拟器
  8. 氢原子光谱、类氢原子光谱和类氢离子光谱
  9. 5个高清图片素材网站,无水印,免费商用。
  10. 大恒相机Python版Qt界面(二)