链表的应用

在这里插入图片描述
链表功能
可操作有:
1.初始化或重置链表
2.销毁链表
3.链表中数据元素个数
4.所指位序的元素值
5.链表已存在元素
6.请输入元素,求直接前驱
7.请输入元素,求直接后驱
8.在第i个位置插入元素
9.删除第i个元素
10.输出所输入的链表元素
11.初始化并输入链表
12.退出
13.清空链表

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct Sqlist{
	int Data;//node数据
	struct Sqlist *next;//下一个node地址
}Sqlist;
static int sum=0,i=0;//sum为链表长度,i方便循环查找 
bool decide=false;//来判断是否初始化
void Display();//主屏幕显示
Sqlist *Start_restart();//初始化或重置
void Delet(Sqlist *head);//销毁链表
void Add(Sqlist *p,int n,int nums);//添加节点
void Remove(Sqlist *p,int n);//移除节点
void Cha_Zhao(Sqlist *p,int n);//查找节点位置的数字
void Zhao_wei(Sqlist *p,int nums);//查找某数字的位置
void Qian_Qu(Sqlist *p,int nums);//找前驱
void Hou_Qu(Sqlist *p,int nums); //找后驱
void Print(Sqlist *p);//打印数字
Sqlist *Scanf(Sqlist *p);//初始化并输入数字
void Clear(Sqlist *p);//清除链表中数字和节点
int main()
{
	Display();
	Sqlist *head; 
	int n=0, nums=0;//输入的位置和要插入的数字 
	int num=0;
	scanf("%d",&num);
	while(true)
	{
		if(decide==false)
		{
			if((num==1)||(num==11) ) 
			 {} 
			else 
			{
				num=14;
			}
		}
		switch(num)
		{
			case 1:
				head=Start_restart();
				break;
			case 2:
			    Delet(head);
				break;
			case 3:
				printf("有%d个数字\n",sum);
				break;
			case 4:
				printf("输入所指位置:"); 
				scanf("%d",&n);
				if(n<=sum&&n>0)
				Cha_Zhao(head,n);
				else
				printf("输入位置不合理\n"); 
				break;
			case 5:
				printf("输入所指数字:"); 
				scanf("%d",&nums);
				Zhao_wei(head,nums);
				break;
			case 6:
				printf("输入所指找前驱的数字:"); 
				scanf("%d",&nums);
			    Qian_Qu(head,nums);
			   
				break;
			case 7:
				printf("输入所指找后驱的数字:"); 
				scanf("%d",&nums);
			    Hou_Qu(head,nums);
				break;
			case 8:
				printf("输入插入位置和数字:"); 
				scanf("%d %d",&n,&nums);
				if(n<=sum+1&&n>=1)
				Add(head,n,nums);
				else
				printf("要插入的位置不合理!!!\n");
				break;
			case 9:
				printf("输入删除位置:"); 
				scanf("%d",&n);
				if(n<=sum&&n>=1)
				 Remove(head,n);
				else
				printf("要删除的位置不合理!!!\n");
				break;
			case 10:
				if(sum>0)
				Print(head);
				else
				printf("没有数字!!!\n");
				break;
			case 11:
				head=Scanf(head);
				break;
			case 12:
				printf("你选择退出!!!\n");
				Delet(head);
				return 0;
			case 13:
				Clear(head);
				break;
			case 14:
				printf("没有初始化或数不合法!!!\n");
				break;
			default:
				printf("你输入的数字不合法!!!\n");
				break;		
		}
		system("PAUSE");
		system("CLS");
		printf("\n");
		Display();
		scanf("%d",&num);
	 } 
	
	
	
	return 0;
 } 
 void Display()
 {
 	printf("可操作有:\n");
 	printf("*****************************************************************\n");
 	printf("**************1.初始化或重置链表           **********************\n");
 	printf("**************2.销毁链表                   **********************\n");
 	printf("**************3.链表中数据元素个数         **********************\n");
 	printf("**************4.所指位序的元素值           **********************\n");
 	printf("**************5.链表已存在元素             **********************\n");
	printf("**************6.请输入元素,求直接前驱     **********************\n");
	printf("**************7.请输入元素,求直接后驱     **********************\n");
	printf("**************8.在第i个位置插入元素        **********************\n");
	printf("**************9.删除第i个元素              **********************\n");
	printf("**************10.输出所输入的链表元素      **********************\n");
	printf("**************11.初始化并输入链表          **********************\n");
	printf("**************12.退出                      **********************\n");
	printf("**************13.清空链表                  **********************\n");
	printf("*****************************************************************\n");	
	printf("请输入你的选择:");
 }
Sqlist* Start_restart(){
	Sqlist* head;
 	head=(Sqlist*)malloc(sizeof(Sqlist));
 	if(!head)
 	{
 		printf("初始化或重置失误\n"); 
 		return 0;
	 }
	 if(sum==0)
    	head->next=NULL;
 	else{
 		Sqlist *p1,*p2;
 		head->next=p1;
 		for(;sum>1;sum--)
 		{
 			
 			p2=p1->next;
 			free(p1);
 			p1=p2;	 
		 }
		 free(p1);
		 p1=NULL;
		 p2=NULL;	 
	 }
 	sum=0;
 	printf("初始化或重置成功\n"); 
 	decide=true;
 	return head;
 }
 void Delet(Sqlist *head)
 {
	if(sum==0)
    	free(head);
 	else{
 		Sqlist *p1,*p2;
 		p1=head->next;
 		for(;sum>1;sum--)
 		{
 			
 			p2=p1->next;
 			free(p1);
 			p1=p2;	 
		 }
		 free(p1);
		 free(head);
		 p1=NULL;
		 p2=NULL;	 
	 }
 	sum=0;
 	printf("列表删除成功!!!\n"); 
 	decide=false;
 } 
 void Cha_Zhao(Sqlist *p,int n){
 	
 	Sqlist *p1;
 	while(i!=n)
 	{
 		p1=p->next;
 		p=p1;
 		i++;
	 }
 	printf("你要找%d位置的数为%d",n,p->Data);
 	i=0;
 }
 void Zhao_wei(Sqlist *p,int nums){	
 	Sqlist *p1;
 	do
 	{
 		p1=p->next;
 		p=p1;
 		i++;
	 }while(p->Data!=nums&&i<=sum); 
	if(i<=sum)
 	printf("你要找%d位置是为%d\n",nums,i);
 	else
 	printf("你要找%d不存在位置\n",nums);
 	i=0;	
 }
 void Qian_Qu(Sqlist *p,int nums){
	Sqlist *p1,*p2;
 	do
 	{
 		p2=p1;
 		p1=p->next;
 		p=p1;
 		i++;
	 }while(p->Data!=nums&&i<sum); 
	 if(i!=1)
 	printf("你要找%d位置的前驱是为%d",nums,p2->Data);
 	else
 	  printf("输入的位置没有前驱!!!\n");
 	i=0;
 }
 void Hou_Qu(Sqlist *p,int nums){
 	Sqlist *p1;
 	do
 	{
 		p1=p->next;
 		p=p1;
 		i++;
	 }while(p->Data!=nums&&i<sum);
	 if(i<sum) 
	 {
	    p1=p->next;
 		printf("你要找%d位置的前驱是为%d",nums,p1->Data);
     }
     else
        printf("输入的位置没有后驱!!!\n");
    i=0;
 }
void Add(Sqlist *p,int n,int nums)
{
		Sqlist *node,*p1;
		node=(Sqlist*)malloc(sizeof(Sqlist));
		node->Data=nums;
		node->next=NULL;
		if(n==1&&sum==0)
		{
			p->next=node;
		}
		else if(n==1)
		{
			p1=p->next;
			p->next=node;
			node->next=p1;
		}
		else
		{
			while(i<n-1)
			{
				p1=p->next;
				i++;
				p=p1;
			}
			p1->next=node;
			node->next=p->next;
			p1=NULL; 
	    }
		i=0;
		sum++;
		printf("插在%d的%d成功\n",n,nums);
} 
void Remove(Sqlist *p,int n){	
	Sqlist *p1,*p2;
 	while(i!=n)
 	{
 		p2=p;
 		p1=p->next;
 		p=p1;
 		i++;
	 }
 	printf("你要删除%d位置的数为%d",n,p->Data);
 	p2->next=p->next;
 	free(p);
 	sum--;
 	p1=NULL;
 	p2=NULL;
 	i=0;	
}
void Print(Sqlist *p)
{
	Sqlist *node;
	printf("列表有: ");
	while(i<sum)
	{
		node=p->next;
		printf("%d\t",node->Data);
		p=node;
		i++;
	}	
	i=0;	
}
Sqlist *Scanf(Sqlist *p)
{
	if(sum>0)
	{
    	Clear(p);
		free(p);
	}
	Sqlist* head;
 	head=(Sqlist*)malloc(sizeof(Sqlist));
	int k=0,num=0;
	printf("输入负数结束\n");
	scanf("%d",&k);
	while(k>=0)
	{
		num++;
		Add(head,num,k);
		scanf("%d",&k);
	 } 	
	 decide=true;
	 return head;		
}
void Clear(Sqlist *p)
{
	Sqlist *p1;
	p1=p->next;
	while(i<sum)
	{
		p=p1;
		p1=p->next;
		free(p);
		i++;	
	}
	p1=NULL;
	sum=0;
	i=0;
	printf("清空完成!!!\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值