单链表头插入法和尾插入法说明(C 语言版)--表头插入法和尾插入法比较
最编程
2024-06-11 13:26:31
...
头插法建立链表的算法简短易懂,但是生成链表的结点顺序与原来输入的顺序相反,而用尾插法建立链表可使输入和生成的结点顺序相同
为什么会这样呢?
根据上面的头插法和尾插法的算法,我们很容易知道,当用头插法依次插入值分别为1,2,3,4,5的结点(也叫做元素)后,单链表会如下图所示:
但是用尾插法同样插入值分别为1,2,3,4,5的结点后,单链表却会如下图所示:
而在这两个链表中,输出链表中各个元素的值只能从已知的头结点head开始遍历,所以分别用头插法和尾插法创建链表后,依次输出的元素的值刚好是相反的
验证小例子:
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
struct node* next;
int data;
}LinkList;
//定义LinkList为struct node类型,即struct node可直接用LinkList来表示,方便定义
//头插法创建单链表
int main (void)
{
int i, len = 5;
//len表示链表的长度
LinkList* head, * s;
//head为LinkList*类型的指针变量,表示头指针
head = (LinkList*)malloc (sizeof (LinkList));
//malloc (sizeof (LinkList))意思是让系统分配内存大小为sizeof (LinkList)的空间
head->next = NULL;
//令头指针的所指向结点的指针域为空
for (i = 0; i < len; i++)
{
s = (LinkList*)malloc (sizeof (LinkList));
printf ("请输入该元素的值:");
scanf ("%d", &s->data);
s->next = head->next;
head->next = s;
}
//以下代码是为了将单链表中各个元素的值依次打印出来
LinkList* q;
q = (LinkList*)malloc (sizeof (LinkList));
q = head->next;
while (q != NULL)
{
printf ("%d", q->data);
q = q->next;
}
return 0;
}
结果:
请输入该元素的值:1
请输入该元素的值:2
请输入该元素的值:3
请输入该元素的值:4
请输入该元素的值:5
54321
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
struct node* next;
int data;
}LinkList;
//尾插法创建单链表
int main (void)
{
int i, len = 5;
LinkList* head,* s,* tail;
//tail表示尾指针
head = (LinkList*)malloc (sizeof (LinkList));
tail = head;
for (i = 0; i < len; i++)
{
s = (LinkList*)malloc (sizeof (LinkList));
printf ("请输入该元素的值:");
scanf ("%d", &s->data);
s->next = NULL;
tail->next = s;
tail = s;
}
//以下代码是将单链表中各个元素的值依次打印出来
LinkList* q;
q = head->next;
while (q != NULL)
{
printf ("%d", q->data);
q = q->next;
}
return 0;
}
结果:
请输入该元素的值:1
请输入该元素的值:2
请输入该元素的值:3
请输入该元素的值:4
请输入该元素的值:5
12345
下一篇: 创建链表:页眉插入与页尾插入
推荐阅读
-
单链表头插入法和尾插入法说明(C 语言版)--表头插入法和尾插入法比较
-
链表学习:链表表头插入法和表尾插入法以及 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
-
单链表头部插入法和尾部插入法详解与实现(C 语言) - 用头部插入法建立单链表
-
详细解释相邻链表的构造 [表头插入法和表尾插入法
-
单链表的表头插入法和表尾插入法详解与实现 (C) [简单易懂]