C语言实现--逆序创建链表(头插法)

写在前面:


        关于“链表”的分析等,如果存在疑惑,想要探究过程,请读者参见下面 两篇 文章

                                  “链表(详解)- C++(顺序创建链表-尾插法)”

                                  “链表(详解)- C++(逆序创建链表-头插法)”

        之后再回到这个页面看C语言实现“链队列”, 为提高效率在这里不再重复进行分析介绍,C++与C语言分析过程相同,两者代码实现主要区别在于“编程语法”上,读者可以对比两篇文章中的代码部分体会。

代码实现


        说明:采用C语言,编译环境为DevC++。

//导入头文件
#include<malloc.h>
#include<stdio.h>

typedef struct Lnode{ 
	int data;//数据域 (可以根据需要修改 数据域 数据类型) 
	struct Lnode *next;//指针域
}Lnode,*Linklist;

//逆序创建链表 
void Createlist(Linklist &L){
	Linklist p;
	L=(Lnode *)malloc(sizeof(Lnode));//分配空间
	L->next=NULL;
	p=(Lnode *)malloc(sizeof(Lnode));
	printf("请输入数据,以“-10000”结束:\n");
	scanf("%d",&p->data);
	while(p->data !=-10000){
		p->next=L->next;
		L->next=p;
		p=(Lnode *)malloc(sizeof(Lnode));
		scanf("%d",&p->data);
	}
}

//输出
void Printlist(Linklist L){
	printf("\n表中的数据为:\n");
	Linklist p;
	p=L->next;
	while(p != NULL){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");//换行
}

//插入
void Insertlist(Linklist &L,int i,char e){
	Linklist p;
	Linklist s;
	int k=1;
	p=L->next;
	while(p && k<i-1){ 
		p=p->next;
		k++;
	}
	s=(Lnode *)malloc(sizeof(Lnode));
	s->data=e;
	s->next=p->next;
	p->next=s;
}

//删除 
void Deletelist(Linklist &L,int i){
	Linklist p;
	Linklist s;
	int e;
	int k=1;
	p=L->next;
	while(p && k<i-1){
		p=p->next;
		k++;
	}
	s=p->next;
	p->next=s->next;
	e=s->data;
	printf("被删除的数据元素为:%d\n",e);
}


//主函数
int main(){
	Linklist L;
	int i;
	int e;
	int d;
	Createlist(L);
	Printlist(L);
	printf("第几个位置后插入元素:");
	scanf("%d",&i);
	printf("插入的新 数据 为:");
	scanf("%d",&e);
	Insertlist(L,i,e);//调用插入函数
	printf("插入新字符后的表格数据如下\n");
	Printlist(L);//输出线性表中的数据
	printf("输入删除第几个元素:");
	scanf("%d",&d);
	Deletelist(L,d);//调用插入函数
	printf("删除元素后表格数据如下\n");
	Printlist(L);//输出线性表中的数据
}

运行结果

 

写在最后:

        读两遍下来,如果仍然有不清楚的地方,可在评论区留言。

        如果你有其他感到困惑的问题,欢迎留言。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值