单向链表详述

单向链表

#include <stdio.h>
#include <stdlib.h>
struct list  	//结构体做链表
{
	int date;	//链表数据
	struct list *next;	//下一链表的地址,类型为struct list指针,名字为next
};

struct list* creat();			//创建链表函数
void input(struct list *head);	//输入数据函数
void output(struct list *head);	//输出数据函数
void insert(struct list *head);	//插入数据函数
void myexit(struct list *head);	//退出程序函数
void main()		
{
	int i,num;
	struct list *head=NULL;		//建立链表头,使之为空
	for(i=0;;i++)
	{
		printf("1.创建新链表\n");
		printf("2.输入数据\n");
		printf("3.输出当前链表\n");
		printf("4.插入数据\n");
		printf("0.退出");
		putchar('\n');
		scanf("%d",&num);
		switch (num)			//switch函数实现功能选择
		{
		case 1:
			head=creat();		//后面的就是以此开辟的head来运行
			break;
		case 2:
			input(head);	
			break;
		case 3:
			output(head);
			break;
		case 4:
			insert(head);
			break;
		case 0:
			myexit(head);
		default :
			printf("无效\n");
		}
	}
}
struct list* creat()		//注:返回值类型为你定义的结构体
{
	char anser;
	struct list *head;
	printf("是否创建新链表y/n\n");
	scanf(" %c",&anser);
	if(anser=='y'|| anser=='Y')
	{
		head=malloc(sizeof(struct list));	//开辟一个大小为list的空间
		return head;						//返回该地址给主函数的链表头
	}
	else
		exit(0);
}
void input(struct list *head)
{
	int i;
	struct list *p;
	p=head;						//使p指向链表头
	printf("输入0表示结束\n");	//控制输入结束
	for(i=0;;i++)
	{
		printf("输入数据\n");
		p->next =malloc(sizeof(struct list));	//开辟p的下一个结构体并将地址传给next
		p=p->next ;							//使p指向开辟的空间
		scanf(" %d",&p->date );				//输入值并判断是否为0
		if(p->date ==0)
		{
			p->next =NULL;					//结束就使下一个链表为空
			break;
		}
	}
}
void output(struct list *head)
{
	int i;
	struct list *p;
	p=head->next ;
	for(i=0;;i++)
	{
		printf("%d  ",p->date );
		p=p->next ;
		if(p->next ==NULL)			//下个链表为空时就结束
			break;
	}
	printf("\n\n\n");
}
void insert(struct list *head)
{
	int add,i;
	char anser;
	struct list *p=NULL,*pr=NULL;
	printf("是否插入\n");
	scanf(" %c",&anser);
	if(anser=='Y' || anser=='y')
	{
		printf("在哪个数后插入\n");
		scanf("%d",&add);
		p=head;				//p为链表头地址
		for(i=0;;i++)
		{
			p=p->next ;		//p指向下一个链表(head内没有数据)
			if(p->date == add)		//找到数据
			{
				pr=p->next ;		//记住下一个链表的位置
				p->next =malloc(sizeof(struct list));	//开辟下一个链表
				p=p->next ;								//使当前的next指向开辟的空间
				printf("输入要插入的数据\n");
				scanf("%d",&p->date );
				p->next =pr;					//使开辟的链表的next与开始记住的链表连接
				break;
			}
			else if(p->next  ==NULL)
		{
			printf("没有找到\n");
			break;
			}
		}
		output(head);
	}
	else
		exit(0);
}
void myexit(struct list *head)		/*注:开辟的空间都要释放,会占用系统内存,虽然程序该程序结束时会自动释放,
									 但是会影响以后编写软件时的习惯,造成不良后果,所以开辟的空间一定要释放*/
{
	struct list *p=head,*pr;
	while(p!=NULL)
	{
		pr=p;
		p=p->next ;
		free(pr);
	}
	exit(0);
}

在这里插入图片描述
在这里插入图片描述





当时没有做界面优化,所以有些难看,删除和插入类似,就没有写。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值