Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >单链表的头插法与尾插法详解及实现(C语言)[通俗易懂]

单链表的头插法与尾插法详解及实现(C语言)[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-08-30 13:53:44
发布于 2022-08-30 13:53:44
5.5K03
代码可运行
举报
运行总次数:3
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

单链表的建立有头插法和尾插法

首先是定义一个结构体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h> 
#include <stdbool.h>
#define ElemType int 

typedef struct LNode{ 
   
	ElemType Data;            //数据域
	struct LNode *Next;      //指针域
}LNode,*LinkList

其次是主函数,用来输入和输出我们的链表; 我们通常用头指针来标识一个单链表,如单链表L。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void PrintList(LinkList L)
{ 
   
    LinkList p;
    p=L->Next
    printf("链表元素如下:\n");
    while(p!=NULL)
    { 
   
        printf("%d ",p->Data);
        p=p->Next;
    }
    printf("\n");
}
int main()
{ 
   
	LinkList L;//结构变量L即表示整个链表,也是头指针指向头结点
	printf("尾插法建立单链表,输入值(9999结束)\n")
    L=CreateList_Head(L);
    PrintList(L);
    printf("头法建立单链表,输入值(9999结束)\n")
    L=CreateList_Tail(L);
    PrintList(L);
	return 0;
}

头插法建立单链表

头插法会使输入的数据插入到链表的表头,输出数据时的数据与读入的数据时相反的,如,以1 2 3 4 5 6 7 8 9建立链表,输出的结果是9 8 7 6 5 4 3 2 1 。第一个元素会始终在链表的尾部 1.建立一个空表,此时头指针L指向头结点,L->Next=NULL,如图

2.while的第一次循环,插入第一个结点,进行如下操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	s->Data=x;         数据域插入值        
	          
	s->Next=L->Next;          
	L->Next=s;            
	第一个结点的指针域,等于头指针的指针域等于NULL,
	表示链尾。然后将节点插入到链表中,这两步的顺序一定不能相反。

3.while的n次循环,如图

头插法代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LinkList CreateList_Head(LinkList L)
{ 
   
	LinkList s;int x;
	L = (LNode*)malloc(sizeof(LNode));     //创建头结点 
	L->Next=NULL;                          
	scanf("%d",&x);                       
	while(x!=9999){ 
                                
		s=(LNode*)malloc(sizeof(LNode));  
		s->Data=x;                           
		s->Next=L->Next;                      
		L->Next=s;                          //插入结点
		scanf("%d",&x);
	}
	return L;
}

尾插法建立单链表

尾插法使每次的数据插入到链尾,保证了输入数据的顺序与链表顺序的一致性,如 输入1 2 3 4 5 6 7 8 9,这样的数据在链表也同样以 1 2 3 4 5 6 7 8 9 保存 1.

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//2.尾插法
LinkList CreateList_Tail(LinkList L)
{ 
   
	int x;
	L = (LNode*)malloc(sizeof(LNode));
	LNode *s,*r=L;
	scanf("%d",&x);
	while(x!=9999){ 
                                
		s=(LNode*)malloc(sizeof(LNode));     //创建新的结点 
		s->Data=x;                           
		r->Next=s;                      
		r=s;
		scanf("%d",&x);
	}
	r->Next=NULL;
	return L;
 } 

跑起来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h> 
#include <stdbool.h>
#define ElemType int 
typedef struct LNode{ 
   
	ElemType Data;
	struct LNode *Next;
}LNode,*LinkList;

//1.链表的创建 (头插法) 
LinkList CreateList_Head(LinkList L)
{ 
   
	LinkList s;int x;
	L = (LNode*)malloc(sizeof(LNode));    
	L->Next=NULL;                          
	scanf("%d",&x);                       
	while(x!=9999){ 
                                
		s=(LNode*)malloc(sizeof(LNode));  
		s->Data=x;                           
		s->Next=L->Next;                      
		L->Next=s;
		scanf("%d",&x);
	}
	return L;
}
//2.尾插发 
LinkList CreateList_Tail(LinkList L)
{ 
   
	int x;
	L = (LNode*)malloc(sizeof(LNode));
	LNode *s,*r=L;
	scanf("%d",&x);
	while(x!=9999){ 
                                
		s=(LNode*)malloc(sizeof(LNode));     //创建新的结点 
		s->Data=x;                           
		r->Next=s;                      
		r=s;
		scanf("%d",&x);
	}
	r->Next=NULL;
	return L;
 } 


void PrintList(LinkList L)
{ 
   
    LinkList p;
    p=L->Next; 
    printf("链表元素如下:\n");
    while(p!=NULL)
    { 
   
        printf("%d ",p->Data);
        p=p->Next;
    }
    printf("\n");
}
int main()
{ 
   
	LinkList L;//结构变量L即表示整个链表,也是头指针指向头结点
	printf("尾插法建立单链表,输入值(9999结束)\n"); 
    L=CreateList_Head(L);
    PrintList(L);
    printf("头法建立单链表,输入值(9999结束)\n");
    L=CreateList_Tail(L);
    PrintList(L);
	return 0;
}

结果

——————————-这里是分界线—————————————

感谢评论区反映,箭头指向的这里,两个方法调用写反了。 第一个应该是L=CreateList_Tail(L); 第二个应该是L=CreateList_Head(L);

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144557.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言单链表实现初始化、创建、增、删、查等基本操作(详细)
LNode *L ;             //声明一个指向单链表第一个结点的指针 (强调这是一个结点用LNode*)
莫浅子
2022/11/18
1.7K0
数据结构实验之链表
1、线性表: 线性表是最基本的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
LucianaiB
2025/05/28
830
数据结构实验之链表
单链表反转的分析及实现
我先画一个单链表,这个单链表有4个元素。我的思路就是,每次把第二个元素提到最前面来。比如下面是第一次交换,我们先让头结点的next域指向结点a2,再让结点a1的next域指向结点a3,最后将结点a2的
猿人谷
2018/01/17
2.3K0
单链表反转的分析及实现
【数据结构】C语言实现单链表的基本操作
大家好,很高兴又和大家见面啦!!! 在上一篇中,我们详细介绍了单链表的两种创建方式——头插法与尾插法,相信大家现在对这两种方式都已经掌握了。今天咱们将继续介绍单链表的基本操作——查找、插入与删除。在开始今天的内容之前,我们先通过尾插法创建一个单链表,如下所示:
蒙奇D索隆
2023/12/29
6660
【数据结构】C语言实现单链表的基本操作
两个非递增的有序链表的合并
已知两个带头结点的非递增有序的单链表A和B,设计算法将两个单链表合并成一个非递增有序的单链表C.要求单链表C仍使用原来两个链表的存储空间
别团等shy哥发育
2023/02/27
9250
数据结构-线性表
线性表是具有相同数据类型的n(n≥0)个数据元素的有限 序列,其中n为表长,当n = 0时线性表是一个空表。若用L命名线性表,则其一般表示为:
计蒙不吃鱼
2025/06/12
750
数据结构-线性表
数据结构(3)单链表
前前后后看了四天左右吧,一方面把单链表过了几遍,另一方面也补全了一些基础,诸如 &引用,结构体指针,封装 等等内容,感觉难点不是代码怎么敲,而是要想明白每个操作的逻辑以及一些容易忽略的边界条件,为什么要有这些边界条件,没有这个条件会影响到哪些特殊情况?想明白这些很重要。
mumumu
2022/12/26
2870
数据结构(3)单链表
单链表的算法
静默虚空
2018/01/05
7180
数据结构代码题-链表
2.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。
愷龍
2023/10/16
4300
数据结构代码题-链表
PTA 7-3 jmu-ds-单链表的基本运算(15 分)
Kindear
2017/12/29
8780
【数据结构】详细剖析线性表
经过这段时间的学习与分享,想必大家跟我一样都已经对线性表的相关内容比较熟悉了。为了更好的巩固线性表相关的知识点,下面我们一起将线性表这个章节的内容梳理一遍吧。
蒙奇D索隆
2024/01/01
3020
【数据结构】详细剖析线性表
【数据结构】第二章——线性表(5)
大家好,很高兴又和大家见面啦!!! 在上个章节中,咱们介绍了单链表的基本概念,以及如果初始化带头结点的单链表与不带头结点的单链表,相信大家现在对这一块内容都是比较熟悉的了。下面我们先来一起回顾一下单链表的初始化,为了方便理解,这里我们还是通过数据域为整型且带有头结点的单链表来进行介绍;
蒙奇D索隆
2023/12/28
4930
【数据结构】第二章——线性表(5)
《数据结构》 单链表常用操作代码集合
Ps:每段代码中,添加了Solo署名的是博主自己写的,其余来自课本或老师。 //单链表存储结构 typedef struct Node //结点类型定义 { ElemType data; struct Node *next; //LinkList为结构体指针类型 } Node, *LinkList; //初始化单链表 InitList(LinkList *L) { *L = (LinkList)malloc(sizeof(Node)); //建立头结点 (*L)->ne
Steve Wang
2018/02/05
1.3K0
c++单链表的基本操作(全)
俩个基本插入方法 #include <bits/stdc++.h> using namespace std; typedef struct LNode { int date; //节点的数据域 struct LNode *next; //节点的指针域 }LNode,*LinkList; // LinkList 为指向结构体LNode的指针类型 bool Initlist_L(LinkList &L) //构造一个空的单链表L { L = new
莫浅子
2022/11/18
6670
c++单链表的基本操作(全)
链表代码详解
空间动态分配,减少空间浪费 但在存取删除时需要从头结点开始遍历,时间复杂度为O(n) 插入删除操作需要修改指针
学编程的小程
2023/10/11
1650
2024重生之回溯数据结构与算法系列学习(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
盛透侧视攻城狮
2024/10/22
900
2024重生之回溯数据结构与算法系列学习(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构-线性表链式存储
姓王者
2024/11/09
1190
【趣学C语言和数据结构100例】41-45
42.(约瑟夫环问题)有 n 个人围成一圈,顺序排号。从第 1 个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位,用指针+数组实现。
LucianaiB
2024/10/27
960
【趣学C语言和数据结构100例】41-45
单链表
线性表的链式表示和实现       线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以使不连续的)。因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai的存储映像,称为结点。      结点包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称做指针或链。n
猿人谷
2018/01/17
1K0
单链表
链式存储
#define TRUE 1 #define ERROR 0 #define MAX_SIZE 100 #define OK 1 /**链式存储 * 1、节点:数据域,指针域组成一个节点 * 2、链表:n个节点由指针链组成一个链表 * 3、单链表、双链表、循环链表 * * 4、不带头结点 * 5、带头结点 * 6、顺序存取 * */ class LianList{ typedef struct{ char num[8]; char name[8];
lascyb
2022/01/13
4530
相关推荐
C语言单链表实现初始化、创建、增、删、查等基本操作(详细)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验