单链表创建之--头插法创建带头结点的单链表
单链表常见的创建方法有头插法和尾插法,这里记录头插法创建带头结点的单链表具体过程:
以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;
}
程序最终运行结果如图,可以看到,头插法建立的单链表数据顺序与输入顺序相反:
程序运行结果
单链表创建之--头插法创建带头结点的单链表相关推荐
- 数据结构c/c++ 头插法尾插法建立带头结点的单链表,以数组创建带头结点的单链表和不带头结点的单链表,输出打印单链表
// // Created by 焦娇 on 2021/9/17. //#ifndef CHAPTER2_LINELINK_LLK_H #define CHAPTER2_LINELINK_LLK_H# ...
- java怎样建立头插法单链表,链表的创建,头插法创建单链表(带源码+解析)
头插法创建单,即通过不断地将新创建的结点添加到链表的第一个数据结点之前,作为链表新的首个数据结点的方法,创建单链表. 根据链表是否有头结点,头插法插入结点的位置有所不同: 若链表存在头结点,头插法需将 ...
- python实现带头结点的单链表的就地逆置_6-1 带头结点的单链表就地逆置 (10 分)...
本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置 ...
- python实现带头结点的单链表的就地逆置_带头结点的单链表就地逆置
本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置 ...
- 【C语言】数据结构C语言版 实验3 带头结点的单链表
slnklist.h #include <stdio.h> #include <stdlib.h> /************************************* ...
- java不带头结点单链表,java带头结点的单链表
JAVA 循环双链表的建立 import java.util.Scanner; //循环双向链表的结点类 class DuLNode { private Object data;// 存放结点值 前驱 ...
- 带头结点的单链表就地逆置
本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数.L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置 ...
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表) ...
- 不带头结点的单链表的创建(头插法和尾插法)
1.用头插法建立不带头结点的单链表 #include<iostream> using namespace std;//单链表的结构体 typedef struct Node {int da ...
最新文章
- 冲刺第一天 12.29 SAT
- .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono
- python知识点汇总_Python知识点总结大全(一)
- 前端学习(500):水平居中布局得第二种方式
- matlab画图显示中文
- 【mac】vmware tools 在菜单上显示灰色无法安装的问题
- 使用Python写入docx文件并控制字体颜色
- DataGridView多线程更新数据的问题的解决办法
- 你都用python来做什么-你都用 Python 来做什么?
- python基本代码教程-python基础教程第三版源代码
- [Z]Java Architecture for XML Binding (JAXB)
- jvm 内存溢出 Java heap space 调优解决过程
- 使用 Unbound 创建DNS服务器
- Docker镜像使用详解
- CSS效率---常用CSS框架
- 卡贴机变无锁教程_有锁机变无锁教程 教你轻松设置去掉卡贴有锁机变无锁完美4G...
- 常见的电商直播模式有哪些,你都了解过吗?
- java 素数 五行_c语言动态烟花小程序代码
- SQL实战39.针对上面的salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005,
- python大牛_成为Python大牛必须要掌握的高端语法——yield