建立链表的标题插入法
最编程
2024-06-11 13:32:21
...
头插法就是建立一个头节点,进行初始化定义,next存储下一个节点位置的地址,初始化定义指针域为空,表示该头部节点后面指向任何位置的地址,开始时只有一个头部节点。
head -> next = NULL;
图形化表示为
申请一个新节点A1,将A1按照头插法插入到head节点的后面,实现代码为
p -> next = head -> next;
head -> next = p;
p -> next表示p后面指向的地址,将该地址赋值给为头部节点的所指向的下一个节点,也就是空节点(head->next初始化为NULL)
也就是相当于p->next = head -> next =NULL
head -> next 表示头部节点指向的下一个节点,为p,表示head的下一个节点为p, p的下一个节点为空
图像化表示为(该节点用A1表示)
当继续采用头插法插入节点A2时,依旧执行代码
p -> next = head -> next;
head -> next = p;
在此时各个节点的对应情况为
p -> next = head -> next = p(A1) 也就是说A2 后面对应的是节点A1
head -> next = p(A2) 头节点后面对应的节点是A2
图像化表示为
新来的A2破坏了原本head和A1之间的关系,并且建立了新联系
后面的操作过程就是不断地重复上诉过程,把头节点和新插入的节点之间建立联系,新插入的节点和上一个插入的节点之间建立联系,最终实现一个完整的链表
c语言代码实现如下
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
//结构体的定义
struct LNode{
Elemtype data;//数据域,存储数据
struct LNode *next;//指针域,存储指针,存放后继节点信息
}LNode;
typedef struct LNode* Linklist;//定义结构体指针型变量,将结构体指针等价于Linklist
//头插法建立链表
void CreateListHead(Linklist L, int n){//n为创建链表的大小空间
Linklist p;
int i;
L->next = NULL;//开始时,该节点的指针域为空,也就是下一个节点为空,不包含其他节点
for(i = 0; i < n; i ++){//定义含有i个空间大小的空间
p = (struct LNode *)malloc(sizeof(struct LNode));//申请足够大小的空间,将该空间的基地址赋值给p
p->data = i;//在数据域中存储数据
p->next = L->next;
L->next = p;//重新定义头指针的下一个,为当前的开始位置
}
}
//链表的遍历输出
void TraverseList(Linklist L){
Linklist p, q;
p = L;//将头指针赋值给p
while(p->next != NULL){
q = p->next;
printf("%d\n", q->data);
p = p->next;
}
}
int main()
{
Linklist L = (struct LNode*) malloc(sizeof(struct LNode));
CreateListHead(L, 5);
TraverseList(L);
return 0;
}
推荐阅读
-
建立链表的标题插入法
-
建立线性链表的 "头入式 "和 "尾入式 "方法的异同
-
链表学习:链表表头插入法和表尾插入法以及 HashMap 中的链表节点插入法
-
单链表创建--头部插入法创建带头部节点的单链表,超详细--头部插入法和尾部插入法,这里记录头部插入法创建带头部节点的单链表的具体过程: 以 C 语言为例。 1)首先使用 typedef 关键字定义节点数据类型 1 typedef struct LNode{ 2 int var; // 以整数数据为例 3 struct LNode* next; // 需要定义一个 LNode 结构指针,即指向后继节点的节点指针 4 }LNode, *LinkList. 第 4 行中的 LNode 和 *LinkList 是可选的,但如果有了它们,以后再定义节点和指针变量会更方便,而且不必在 LNode 前面添加 struct 关键字,而是可以直接这样定义变量。 LNode l1, l2; // 定义节点变量。 LinkList p1, p2; // 定义指针变量。 与上述 typedef 关键字定义的单一链表数据类型的方法相同: struct LNode{ struct LNode* next; //定义指针变量 struct LNode* next; } } 如果使用这种方法定义链表节点的类型,则在定义节点变量和指针变量时,必须在 LNode 前面加上 struct 关键字,即 struct LNode l1, l2; // 定义节点变量 struct LNode *p1, *p2; //define pointer variables. 这两种方法的效果是一样的,都是定义一个包含整数变量数据字段和后续指针字段的单一链表节点类型。 (2)通过表头插入的函数构建一个链表,并返回 LinkList 类型表头指针变量 L。 算法的基本思想:一个有头节点的单链表有两类节点,头节点和元素节点,头节点通常不存储数据,用 L 表示,元素节点存储数据,用 s 表示。 2.1 定义头节点指针变量 L 和元素节点 s
-
分析线性表(链表)头部插入法和尾部插入法的区别和优缺点--尾部插入法:
-
逆转链表的两种方法(表头插入法和就地逆转法,图文并茂,一目了然) - I. 就地逆转法
-
数据结构:逆转单向链表的表头插入法(附原理解释和代码实现)
-
单链表头部插入法和尾部插入法详解与实现(C 语言) - 用头部插入法建立单链表
-
详细解释相邻链表的构造 [表头插入法和表尾插入法
-
头部插入法和尾部插入法的 GO 单链表