概述
单链表的建立有头插法和尾插法
首先是定义一个结构体
#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);
最后
以上就是矮小云朵为你收集整理的单链表的头插法与尾插法详解及实现(C语言)头插法建立单链表尾插法建立单链表结果的全部内容,希望文章能够帮你解决单链表的头插法与尾插法详解及实现(C语言)头插法建立单链表尾插法建立单链表结果所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复