单链表的头插法与尾插法详解及实现(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);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • windows未能启动0xc000000e9_win7状态0xc00000e9

    windows未能启动0xc000000e9_win7状态0xc00000e9问题:计算机无法启动,错误代码为:0xc00000e9解决方法:1、如报错所示,\Windows\System32\config\system文件丢失或损坏;2、修复此问题,需打开Windo

  • ftp文件下载工具,四款超级好用的ftp文件下载工具

    ftp文件下载工具,四款超级好用的ftp文件下载工具ftp文件下载工具是什么工具,可能有人会回答说不知道,因为一般只有从事网站管理的工作者会使用的多一点。但不是每个人生来就会的,所以刚开始肯定都会学习怎么使用。这篇文章就来告诉大家有哪些ftp文件下载工具吧。第一款:IIS7服务器管理工具说实话,这个工具算是比较好的管理工具了。里面的功能除了批量管理,还有很多别的功能,主要也是功能也比较全面,相信大多数使用的网站工作人员都比较熟悉了。它里面还能够定时上传下载、定时备份和主动更新。把你花在更新上的经历都省了。IIS7服务器管理工具除了在ftp上面有这么多的

  • 大数据:数据采集平台之Fluentd

    大数据:数据采集平台之Fluentd大数据:数据采集平台之Fluentd官网:http://docs.fluentd.org/articles/quickstartFluentd是一个开源的数据收集框架。Fluentd使用C/Ruby开发,使用JSON文件来统一日志数据。它的可插拔架构,支持各种不同种类和格式的数据源和数据输出。最后它也同时提供了高可靠和很好的扩展性。TreasureData,Inc对该产品提供支持和维…

  • String数组初始化

    String数组初始化在java中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度.。如下,1,2,3可以通过编译,4,5不行。而String是Object的子类,所以上述BCF均可定义一个存放50个String类型对象的数组。1.Stringa[]=newString[50];2.Stringb[];3.charc[];4.Stringd[50];5.char…

  • python中循环遍历for怎么用_python遍历字典的值

    python中循环遍历for怎么用_python遍历字典的值在Python中,如何使用“for”循环遍历字典?今天我们将会演示三种方法,并学会遍历嵌套字典。在实战前,我们需要先创建一个模拟数据的字典。dict_1={‘Name’:’Zara’,’Age’:7,’Class’:’First’,’Address’:’Beijing’}方法1:使用For循环+索引进行迭代在Python中遍历字典的最简单方法,是将其直接放入for循环中。Python会自动将dict_1视为字典,并允许你迭代其key键。然后,我们就可以使用索引

  • list的splice方法[通俗易懂]

    list的splice方法[通俗易懂]#include#includeusingnamespacestd;intmain(){std::listmylist1,mylist2;std::list::iteratorit;//setsomeinitialvalues:for(inti=1;i<=4;++i)mylist1.push_back(i);

发表回复

您的电子邮箱地址不会被公开。

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