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

单链表的头插法与尾插法详解及实现(C语言)[通俗易懂]单链表的建立有头插法和尾插法首先是定义一个结构体#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#defineElemTypeinttypedefstructLNode{ ElemTypeData;//数据域 structLNode*Ne…

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

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

首先是定义一个结构体

#include <stdio.h>
#include <stdlib.h> 
#include <stdbool.h>
#define ElemType int 

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

其次是主函数,用来输入和输出我们的链表;
我们通常用头指针来标识一个单链表,如单链表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;
}

头插法建立单链表

头插法会使输入的数据插入到链表的表头,输出数据时的数据与读入的数据时相反的,如,以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的第一次循环,插入第一个结点,进行如下操作
在这里插入图片描述

	s->Data=x;         数据域插入值        
	          
	s->Next=L->Next;          
	L->Next=s;            
	第一个结点的指针域,等于头指针的指针域等于NULL,
	表示链尾。然后将节点插入到链表中,这两步的顺序一定不能相反。

3.while的n次循环,如图
在这里插入图片描述

头插法代码如下

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.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码实现

//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;
 } 

跑起来

#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.net/144557.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月19日 上午10:40
下一篇 2022年5月19日 上午11:00


相关推荐

  • 豆包能不能查看搜索记录的具体时间吗

    豆包能不能查看搜索记录的具体时间吗

    2026年3月12日
    3
  • pycharm直接(快速)运行 flask[通俗易懂]

    pycharm直接(快速)运行 flask[通俗易懂]先注意的是,需要新建的是flaskproject,修改你的project名字,并且选择pycharm帮你搭建一个虚拟环境还是使用你自己过去搭建好了的虚拟环境在app.py文件下,右键直接运行即可会弹出一个地址,点击即可…

    2022年8月26日
    8
  • Java中如何声明数组「建议收藏」

    Java中如何声明数组「建议收藏」Java语言声明数组有两种形式,以一维数组为例:数组类型 数组名 []; 这种方式是C语言书写习惯数组类型 [] 数组名; 这种方式是Java书写习惯数组的声明方法:数组类型[]数组名={em1,em2,em3,…,emN};//声明数组的时候初始化,一共N个元素,例如:int[]array={3,5,4,8,12,5};//一共六个元素数组类型[]数组名=n

    2022年6月2日
    35
  • 双线性插值算法的详细总结

    双线性插值算法的详细总结原文出处 http blog csdn net xjz article details 最近在做视频拼接的项目 里面用到了图像的单应性矩阵变换 在最后的图像重映射 由于目标图像的坐标是非整数的 所以需要用到插值的方法 用的就是双线性插值 下面的博文主要是查看了前辈的博客对双线性插值算法原理进行了一个总结 在这里也感谢一些大牛的博文 http

    2026年3月18日
    2
  • 河北对口计算机专业一分一档6,河北高考一分一档表出炉,616分成“名校坎”,多数学生是白折腾…

    河北对口计算机专业一分一档6,河北高考一分一档表出炉,616分成“名校坎”,多数学生是白折腾…文/喵喵萌宝教育记(原创文章,欢迎转载分享)真正能够决定孩有没有“大学命”的不是成绩,而是孩子在全省的排名。这句话相信所有经历过高考的人一定不会感到陌生,毕竟每年的招生人数有限,势必会选择排名靠前的考生优先录取。这也导致各地每年的“一分一档线”成为家长的新关注热点。可对于21年的河北考生来说,今年的“一分一档线”却成为了孩子名校梦的破碎现场,即使拿下600多的高分,学生也很难获得名校的入场券。河北…

    2022年7月13日
    195
  • shell编程100例「建议收藏」

    shell编程100例「建议收藏」1、编写helloworld脚本#!/bin/bash#编写helloworld脚本echo”HelloWorld!”2、通过位置变量创建Linux系统账户及密码#!/bin/bash#通过位置变量创建Linux系统账户及密码#$1是执行脚本的第一个参数,$2是执行脚本的第二个参数useradd”$1″echo”$2″|…

    2022年7月16日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号