单链表常见的创建方法有头插法尾插法,这里记录头插法创建带头结点的单链表具体过程:
以C语言为例,
1)首先使用 typedef 关键字定义结点数据类型

typedef struct LNode{int var; //数据以整型为例struct LNode* next; //需要定义一个LNode结构体指针即结点指针来指向后继}LNode, *LinkList; 

4行的 LNode 和 *LinkList 可有可无,有的话后面定义结点变量和指针变量时更方便,不必须在LNode前面加 struct 关键字,可直接这样定义变量,

LNode l1, l2; //定义结点变量
LinkList p1, p2; //定义指针变量

与上面 typedef 关键字定义的单链表数据类型一样的定义方法:

struct LNode{int var;struct LNode* next;
}

若用这种方法定义链表结点类型,定义结点变量和指针变量时必须在LNode前带上struct关键字,即:

struct LNode l1, l2; //定义结点变量
struct LNode *p1, *p2; //定义指针变量

这两种定义方法效果是一样的,都是定义了包含 1个整型变量的数据域1个后继指针域的单链表结点类型

2)通过函数 头插构建链表,并返回 LinkList 类型表头指针变量 L
算法基本思想:带有头结点的单链表有两类结点,头结点元素结点,头结点通常不存储数据,用L表示,元素结点存储数据,用s表示

2.1 定义头结点指针变量L和元素结点s

LinkList s, L;

2.2 定义了头结点之后,内存中尚未分配空间,此时头结点并不真实存在,需使用malloc关键字分配存储空间后,并使L指针指之,才真正创建了L头结点。由于此时仅有头结点,无后继结点,需将其指针域置空

L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;

初始化头结点

这时设置一个整型变量x,通过不断输入其值,来初始化各结点数据域val,判断x=9999时为输入结束条件,先任意输入一个x,然后通过while循环来判断 x值决定是否进入添加结点过程

int x;
scanf("%d", &x);
while(x != 9999){ //进入添加结点过程... //不断添加结点过程
}

添加结点过程算法如下:
1, 初始化一个s元素结点,先初始化数据域var,然后初始化指针域next

s = (LinkList)malloc(sizeof(LNode));
s->var = x;
s->next = L->next;

先初始化数据域var,然后初始化指针域next头插法是这样插入新结点的,新的结点s始终在当前的表中第一个元素结点之前
,也就是L->next 之前插入,数据输入顺序与最终链表结点顺序是相反的,
所以在创建了一个新的元素结点s后,需要将其指针域置为L->next, 如图


第一个待插入的元素结点s初始化后

2, 初始化了一个元素结点s后,此时元素结点了,由于头结点L始终必须作为首个元素结点的前驱,所以需要头结点L的指针域,使当前元素结点s成为其后继

L->next = s;

头结点L指针域指向元素结点s

3, 这时,一个元素结点s就正式被插入到表中了,然后要插入第二个元素结点了,根据while循环的流程,再次判断x值需要再次输入一个x值,所以需要在while循环内最后一行输入x数据

scanf("%d", &x);

4,若输入的值非9999,则再次进入while循环,反复执行上述流程,不断插入元素结点扩大单链表长,这里赘述再添加一个元素结点的过程
又初始化了一个元素结点s,状态如图:

又初始化1个新的元素结点s

按照上述算法,头插法 新的元素结点s插入时始终插入在当前表中首个元素结点F之前,故需要将其后继指针域置为当前表中首个元素结点F,即s->next = L->next, 记住L->next始终指向首个元素结点,结果如图:

插入新元素结点s

元素结点s被“半插入”到表中后,F已经不是绝对意义上的首个元素结点了,此时需要更改头结点L的后继指针域,将其后继指针域置为被“半插入”表中的新元素结点s,这样,新的元素结点s正式被插入表中,表长+1,如图

插入新元素结点s

2.3 上述插入过程的函数完整实现:

LinkList head_Insert(){int x;LinkList s, L; L = (LinkList)malloc(sizeof(LNode));L->next = NULL;scanf("%d", &x);while(x != 9999){s = (LinkList)malloc(sizeof(LNode));s->var = x;s->next = L->next;L->next = s;scanf("%d", &x);}return L;
}

3.用printList()函数遍历打印单链表,接收的形参为要打印的单链表,从首个结点开始打印

void printList(LinkList L){while(L != NULL){  printf("%d ", L->var);L = L->next; //向后遍历}
}

4)主函数main() 流程
需要初始化一个head 指针变量,来接收head_Insert()函数所返回的已创建的链表头结点指针值, 然后将head传入printList()函数直接调用打印输入单链表数据,由于printList()是从首个结点开始打印,而头结点不存储数据,故传入第一个元素结点

int main(){LinkList head;head = head_Insert();printf("the linklist vars are: \n");printList(head->next); //由于printList()是从首个结点开始打印,而头结点不存储数据,故传入第一个元素结点return 0;
}

程序最终运行结果如图,可以看到,头插法建立的单链表数据顺序与输入顺序相反:

程序运行结果

单链表创建之--头插法创建带头结点的单链表相关推荐

  1. 数据结构c/c++ 头插法尾插法建立带头结点的单链表,以数组创建带头结点的单链表和不带头结点的单链表,输出打印单链表

    // // Created by 焦娇 on 2021/9/17. //#ifndef CHAPTER2_LINELINK_LLK_H #define CHAPTER2_LINELINK_LLK_H# ...

  2. java怎样建立头插法单链表,链表的创建,头插法创建单链表(带源码+解析)

    头插法创建单,即通过不断地将新创建的结点添加到链表的第一个数据结点之前,作为链表新的首个数据结点的方法,创建单链表. 根据链表是否有头结点,头插法插入结点的位置有所不同: 若链表存在头结点,头插法需将 ...

  3. python实现带头结点的单链表的就地逆置_6-1 带头结点的单链表就地逆置 (10 分)...

    本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置 ...

  4. python实现带头结点的单链表的就地逆置_带头结点的单链表就地逆置

    本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置 ...

  5. 【C语言】数据结构C语言版 实验3 带头结点的单链表

    slnklist.h #include <stdio.h> #include <stdlib.h> /************************************* ...

  6. java不带头结点单链表,java带头结点的单链表

    JAVA 循环双链表的建立 import java.util.Scanner; //循环双向链表的结点类 class DuLNode { private Object data;// 存放结点值 前驱 ...

  7. 带头结点的单链表就地逆置

    本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置 ...

  8. C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

    http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表) ...

  9. 不带头结点的单链表的创建(头插法和尾插法)

    1.用头插法建立不带头结点的单链表 #include<iostream> using namespace std;//单链表的结构体 typedef struct Node {int da ...

最新文章

  1. 冲刺第一天 12.29 SAT
  2. .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono
  3. python知识点汇总_Python知识点总结大全(一)
  4. 前端学习(500):水平居中布局得第二种方式
  5. matlab画图显示中文
  6. 【mac】vmware tools 在菜单上显示灰色无法安装的问题
  7. 使用Python写入docx文件并控制字体颜色
  8. DataGridView多线程更新数据的问题的解决办法
  9. 你都用python来做什么-你都用 Python 来做什么?
  10. python基本代码教程-python基础教程第三版源代码
  11. [Z]Java Architecture for XML Binding (JAXB)
  12. jvm 内存溢出 Java heap space 调优解决过程
  13. 使用 Unbound 创建DNS服务器
  14. Docker镜像使用详解
  15. CSS效率---常用CSS框架
  16. 卡贴机变无锁教程_有锁机变无锁教程 教你轻松设置去掉卡贴有锁机变无锁完美4G...
  17. 常见的电商直播模式有哪些,你都了解过吗?
  18. java 素数 五行_c语言动态烟花小程序代码
  19. SQL实战39.针对上面的salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005,
  20. python大牛_成为Python大牛必须要掌握的高端语法——yield

热门文章

  1. 基于opencv的图片模板匹配及其简单应用
  2. 黄金圈理论和知识体系
  3. 【工具分享】如何识别手机里偷数据的那些软件(适用于安卓平台)
  4. 银河麒麟arm64 qt打包
  5. 【项目篇-资料获取】怎么获取创新创业比赛资料、优秀作品?如何去借鉴?
  6. win10系统对计算机要求,使用win10系统,你需要掌握的5个技巧
  7. 人机交互技术课程实验报告《社交点评APP》系统移动界面分析报告
  8. uni-app/js/小程序/生成支付二维码图片,类似于支付宝和微信商家码
  9. 2020-06 前端技术汇总
  10. 微信开始屏蔽拼多多小红书快手外链访问