01---链表.c (19级电科一班刘子琦、陈辉、徐超杰,李新玖共同制作)

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
 
//定义节点结构体 
typedef struct _node{
	int value;                //定义链表一个节点的数据域 
	struct _node *next;       //定义链表一个节点的指针域 
}Node,Date;                   //两个链表的名字 

//函数声明
void ShowMenu();
Node *choosen();
Date *choosed(); 
Node *nadd();
Node *nsort(Node *phead);
Node *nprint(Node *phead);
Node *ndelet1(Node *phead);
Node *ninsert(Node *phead);
Node *ndelet0(Node *phead);
Date *dadd();
Date *dsort(Date *phead);
Date *dprint(Date *phead);
Date *ddelet1(Date *phead);
Date *dinsert(Date *phead);
Date *ddelet0(Date *phead);
Node *ndconnect(Node *pnhead,Date *pdhead);
 
int main()
{
	printf("***********************************************\n");
	printf("19级电科一班刘子琦、陈辉、徐超杰,李新玖共同制作\n");
	printf("***********************************************\n");
	ShowMenu();				  //调用函数 
	return 0;
}

void ShowMenu()				  //菜单 
{ 
	Node *nhead,*ndhead,*p;
	Date *dhead;
	char i;
	printf("选择链表,输入‘n’或者‘d’\n输入‘L’为两个链表连接并输出(警告:需要先创建链表)\n输入‘H’退出:");
	while( i != 'H' )
	{
		scanf("%c",&i);
		switch(i)                                      //调用函数 
		{
			case('n'):nhead = choosen();break;
			case('d'):dhead = choosed();break;
			case('L'):ndhead = ndconnect(nhead,dhead);
						for( p=ndhead ; p ; p=p->next )       //遍历链表并输出          
							{
								printf("%d\n", p->value );				       	 
							}
						printf("\n"); break;
			case('H'):break;
		}
	}
}

Node *choosen()
{     
	Node *head,*phead;  
	char i;
	printf("输入I为输入数据。\n输入R为链表排序。\n输入O为输出数据。\n输入S为查找和删除数据。\n输入E为插入数据。\n输入D为删除链表。\n输入G为退出\n");
	while(i != 'G')
	{
		scanf("%c",&i);
		switch(i)                               //调用函数 
		{
			case('I'):head = phead = nadd();break;
			case('R'):head = nsort(phead);break;
			case('O'):head = nprint(phead);break;
			case('S'):head = ndelet1(phead);break;
			case('E'):head = ninsert(phead);break;
			case('D'):head = ndelet0(phead);break;
			case('G'):printf("已退出。\n");break;
		}
	}
	return phead;
}

Date *choosed()
{
	Date *head,*phead;
	char i;
	printf("输入I为输入数据。\n输入R为链表排序。\n输入O为输出数据。\n输入S为查找和删除数据。\n输入E为插入数据。\n输入D为删除链表。\n输入G为退出\n");
	while(i != 'G')
	{
		scanf("%c",&i);
		switch(i)                                        //调用函数 
		{
			case('I'):head = phead = dadd();break;
			case('R'):head = dsort(phead);break;
			case('O'):head = dprint(phead);break;
			case('S'):head = ddelet1(phead);break;
			case('E'):head = dinsert(phead);break;
			case('D'):head = ddelet0(phead);break;
			case('G'):printf("已退出。\n");break;
		}
	}
	return phead;
} 

Node *nadd()
{
	int number;
	Node *phead = NULL;                                  //初始化 
	do{
		printf("输入数据,输入-1结束:");                 //输入数据 
		scanf("%d",&number);
		if(number != -1)
		{
			Node *p=(Node*)malloc(sizeof(Node));         //申请内存空间 
			p -> value = number;                         //将刚输入的数据存入新建节点的数据域中 
			p -> next = NULL;                            //新建节点指针域初始化 
			Node *last = phead;               			 //定义并初始化指向下一个节点的指针 
			if(last)                                     //判断该指针是否为空 
			{
				while(last -> next)                      //判断该指针指向的节点的指针域是否为空 
				{
					last = last -> next;		         //使该指针指向下一个节点 
				}
				last -> next = p;                        //将指针p的值赋给last指针 
			}else
			{
				phead = p;                    			 //使头指针指向第一个节点 
			}
		}
	}while(number != -1);                                //判断输入的数据是否为-1 
	return phead;
}

Node *nsort( Node *phead )
{
	Node *p,*tail,*q;                                    //定义结点指针 
	p = q = tail = NULL;								 //初始化 
	if(phead == NULL || phead->next == NULL)     		 //排除空链表和单节链表 
	{
		printf("无需排序。\n");
		return;
	}
	while(phead != tail)                       			 //外循环 
	{
		int Ischange = 0;                                //定义判断变量 
		p = phead;                              	   	 //使p指针指向头节点 
		q = p->next;                                     //使q指针指向第二节节点 
		while(q != tail)                                 //内循环 
		{
			if(p->value > q->value)                      //比较 
			{
				int number = q->value;                   //将两个节点调换 
				q->value = p->value;
				p->value = number;
				Ischange = 1;
			}
			p = p->next;                                 //向后移动 
			q = q->next;                                 //向后移动 
		}
		if(!Ischange)
		{
			printf("排序完成!\n");
			return;
		}
		tail = p;                                        //尾节点指针向前移动 
	}
	printf("排序完成!\n");								 //提示
	return phead; 
}

Node *nprint( Node *phead )
{
	Node *p = NULL;                                      //定义结点指针并初始化 
	for( p=phead ; p ; p=p->next )						 //循环遍历链表 
	{
		printf("%d\n", p->value );					      
	}
	printf("\n");
	return phead;
}

Node *ndelet1( Node *phead )
{
	int number,sam;
	printf("输入要查找的值:");
	scanf("%d", &number );
	int isFound = 0;                                    //定义判断变量 
	Node *p,*q;                                         //定义结点指针 
	for( q=NULL , p=phead ; p ; q=p , p=p->next)
	{
		if(p->value == number)                          //判断是否符合要找的数据 
		{
			printf("找到了。\n");					    //遍历链表查找 
			isFound = 1;
			break; 
		}
	}
	if( !isFound )
	{
		printf("没找到。\n");
	}
	if( isFound == 1 )
	{
		printf("是否删除?删除输入1,否则输入0.\n");
		scanf("%d",&sam);
		switch(sam)
		{
			case(1):for( q=NULL , p=phead ; p ; q=p , p=p->next)
					{
						if(p->value == number)
						{
							if( q )
							{
								q->next = p->next;					//删除一个节点并连接剩下的节点 
							}else{
								phead = p->next;
							}
							free(p);
							printf("删除完成!\n");
							break;
						}
					}
					break;
			case(0):break;
			default:printf("无效!\n");
		}
	}
	return phead;  
}

Node *ninsert( Node *phead )                                //插入节点函数 
{
	int number,a;
	printf("输入要插入的值:");
	scanf("%d",&number);
	Node *p=(Node*)malloc(sizeof(Node));                   //申请新节点空间 
	p->value = number;                                     //将输入的数据存入新节点数据域 
	p->next = NULL;                                        //初始化新节点指针域 
	Node *q,*i;                                            //定义结点指针 
	printf("输入想要插入的到节点后面的节点的值:");
	scanf("%d",&a);
	for( q=NULL , i=phead ; i ; q=i , i=i->next)  		   //遍历链表查找 
	{
		if(i->value == a)
		{
			p->next = i->next;                             //将新节点指针域存入下一个节点指针值 
			i->next = p;                                   //将找到的节点的指针域存入新节点指针值 
			break;
		}
	}
	printf("插入完成!\n");
	return phead;
}

Node *ndelet0( Node *phead )
{
	Node *q,*p;                                             //定义结点指针 
	for( p = phead ; p ; p=q )                     			//遍历链表 
	{
		q = p -> next;					                    //全部删除 
		free(p);
	}
	printf("删除完成!\n"); 
	return phead;
} 

Date *dadd()                                 
{
	int number;
	Date *phead = NULL;                                     //初始化 
	do{
		printf("输入数据,输入-1结束:");                   //输入数据 
		scanf("%d",&number);
		if(number != -1)
		{
			Date *p=(Date*)malloc(sizeof(Date));           //申请内存空间
			p -> value = number;                           //将刚输入的数据存入新建节点的数据域中 
			p -> next = NULL;                              //新建节点指针域初始化 
			Date *last = phead;                 		   //定义并初始化指向下一个节点的指针
			if(last)                                       //判断该指针是否为空
			{
				while(last -> next)                        //判断该指针指向的节点的指针域是否为空 
				{
					last = last -> next;		           //使该指针指向下一个节点 	 
				}
				last -> next = p;                          //将指针p的值赋给last指针
			}else
			{
				phead = p;                      		   //使头指针指向第一个节点
			}
		}
	}while(number != -1);                                  //判断输入的数据是否为-1
	return phead;
}

Date *dsort( Date *phead )
{
	Date *p,*tail,*q;									   //定义结点指针
	p = q = tail = NULL;								   //初始化 
	if(phead == NULL || phead->next == NULL)      		   //排除空链表和单节链表 
	{
		printf("无需排序。\n");
		return;
	}
	while(phead != tail)                          		   //外循环 
	{
		int Ischange = 0;								   //定义判断变量 
		p = phead;								   		   //使p指针指向头节点 
		q = p->next;									   //使q指针指向第二个节点 
		while(q != tail)								   //内循环 
		{
			if(p->value > q->value)						   //比较 
			{
				int number = q->value;					   //将两个节点调换 
				q->value = p->value;
				p->value = number;
				Ischange = 1;
			}
			p = p->next;								   //向后移动 
			q = q->next;								   //向后移动 
		}
		if(!Ischange)
		{
			printf("排序完成!\n");
			return;
		}
		tail = p;										   //尾结点指针向前移动 
	}
	printf("排序完成!\n");								   //提示
	return phead; 
}

Date *dprint( Date *phead )
{
	Date *p = NULL;                                        //定义结点指针并初始化
	for( p=phead ; p ; p=p->next )                		   //循环遍历链表 
	{
		printf("%d\n", p->value );				 
	}
	printf("\n");
	return phead;
}

Date *ddelet1( Date *phead )
{
	int number,sam;
	printf("输入要查找的值:");
	scanf("%d", &number );
	int isFound = 0;                                      //定义判断变量 
	Date *p,*q;                                           //定义结点指针
	for( q=NULL , p=phead ; p ; q=p , p=p->next)
	{
		if(p->value == number)                            //判断是否符合要找的数据
		{
			printf("找到了。\n");                         //遍历链表查找				
			isFound = 1;
			break; 
		}
	}
	if( !isFound )
	{
		printf("没找到。\n");
	}
	if( isFound == 1 )
	{
		printf("是否删除?删除输入1,否则输入0.\n");
		scanf("%d",&sam);
		switch(sam)
		{
			case(1):for( q=NULL , p=phead ; p ; q=p , p=p->next)
					{
						if(p->value == number)
						{
							if( q )
							{
								q->next = p->next;       //删除一个节点并连接剩下的节点				 
							}else{
								phead = p->next;
							}
							free(p);
							printf("删除完成!\n");
							break;
						}
					}
					break;
			case(0):break;
			default:printf("无效!\n");
		}
	} 
	return phead; 
}

Date *dinsert( Date *phead )                         //插入节点函数 
{
	int number,a;
	printf("输入要插入的值:");
	scanf("%d",&number);
	Date *p=(Date*)malloc(sizeof(Date));                //申请新节点空间
	p->value = number;                                  //将输入的数据存入新节点数据域
	p->next = NULL;                                     //初始化新节点指针域
	Date *q,*i;                                         //定义结点指针  
	printf("输入想要插入的到节点后面的节点的值:");
	scanf("%d",&a);
	for( q=NULL , i=phead ; i ; q=i , i=i->next)  		//遍历链表查找 
	{
		if(i->value == a)
		{
			p->next = i->next;                          //将新节点指针域存入下一个节点指针值
			i->next = p;                                //将找到的节点的指针域存入新节点指针值 
			break;
		}
	}
	printf("插入完成!\n");
	return phead;
}

Date *ddelet0( Date *phead )
{
	Date *q,*p;                                         //定义结点指针
	for( p = phead ; p ; p=q )                 		    //遍历链表
	{
		q = p -> next;					                //全部删除 
		free(p);
	}
	printf("删除完成!\n");
	return phead; 
} 

Node *ndconnect( Node *pnhead,Date *pdhead ) 			 //链表连接函数                     
{
	Node *p,*tail,*q;                                    //定义结点指针
	if(pnhead == NULL)                                   //排除链表为空情况 
	{
		return pdhead;                                   //返回头节点 
	}
	if(pdhead == NULL)									 //排除链表为空情况
	{
		return pnhead;									 //返回头节点
	}
	p = pnhead;                            				 //读取头节点 
	while( p->next )									 //循环找到尾节点 
	{
		p = p->next;
	}              
	p->next = pdhead;                                    //连接                                    
	p = q = tail = NULL;								 //初始化 
	if(pnhead == NULL || pnhead->next == NULL)     		 //排除空链表和单节链表 
	{
		return pnhead;									 //返回头节点 
	}
	while(pnhead != tail)                       		 //外循环 
	{
		int Ischange = 0;                                //定义判断变量 
		p = pnhead;                              	   	 //使p指针指向头节点 
		q = p->next;                                     //使q指针指向第二节节点 
		while(q != tail)                                 //内循环 
		{
			if(p->value > q->value)                      //比较 
			{
				int number = q->value;                   //将两个节点调换 
				q->value = p->value;
				p->value = number;
				Ischange = 1;
			}
			p = p->next;                                 //向后移动 
			q = q->next;                                 //向后移动 
		}
		if(!Ischange)
		{
			return pnhead;								 //返回头节点 
		}
		tail = p;                                        //尾节点指针向前移动 
	}
	return pnhead;         								 //返回头节点                              
}

 

posted @ 2020-11-30 23:05  张同光  阅读(230)  评论(0编辑  收藏  举报