快速找到未知长度单链表的中间结点--腾讯面试题--数据结构考研压轴题--快速指针--最优算法-C语言动态链生成与表增删改查

快速找到未知长度单链表的中间结点

>>写在前面
*快速找到未知长度单链表的中间结点的解法为:最优算法-快速指针
*动态链表-增删改查不是最佳,仅供萌新把玩。
*代码较长,功能完备,高度人性化,经黑盒测试,可靠耐用。
*可移植作简单成绩管理统或学生选课系统。
*操作界面全英文,可自行汉化。
*欢迎交流:QQ1758057932

>>C语言代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>		//使用time函数,生成随机数之前进行播种 

typedef struct Node		//定义结点结构 
	{
		int date;
		struct Node* next;
	};
void CreatList(Node*,int);	//建立链表(头指针,长度) 
void PrintMenu();		//输出菜单 
void PrintList(Node*);		//输出链表
void FindMidNode(Node*,int);	//快速指针法-寻找中间元素(头指针)
void InsertNode(Node*,int,int); //插入元素(头指针,位置,数值)
void DeleteNode(Node*,int);	//删除元素 
void AlterNode(Node*,int,int);	//更改元素(头指针,位置,数值) 
int SearchNode(Node*,int);	//查找,返回对应值第一次出现的位置,无则返回空值(头指针,值) 
void EmptyList(Node*);		//清空链表(头指针)
//以上所有'位置'均为:链表第'位置'个元素之后;0表示头节点之后 
int main()
{
	Node* head = (Node*)malloc(sizeof(Node));
	head->next = NULL;
	printf("Creat list.\nPLease input a length:");
	int len;scanf("%d",&len);
	while(len <= 0 || len > 30)
	{
		printf("Input Error!\nInput again,length:");
	        scanf("%d",&len);
	}
	CreatList(head,len);
	printf("OK!\n");
	PrintList(head);
	PrintMenu();
	printf("Menu:");
	int a ;
	scanf( "%d" , &a );
 	while(a)
 	{
	  	switch (a)
	  	{
		  	case 1:
		  	{
		        	FindMidNode(head,len);
		        	printf("Menu:");
		     		break;
		    	}
		 	case 2:
		    	{
		        	printf("Location(0~%d):",len);
		     		int lc,s ;
				scanf("%d",&lc);
				while(lc < 0 || lc > len)
				{
					printf("Input Error!\nInsert location:");
					scanf("%d",&lc);
				}
				printf("Insert value(0~99):");
				scanf("%d",&s);
				while(s < 0 || s > 99)
				{
					printf("Input Error!\nInsert value(0~99):");
					scanf("%d",&s);
				}
				InsertNode(head,lc,s);
				PrintList(head);
				printf("Menu:");
				break;
			}
			case 3:
			{
				printf("Delete location:");
				int lc;
				scanf("%d",&lc);
				while(lc < 1 || lc > len)
				{
					printf("Input Error!\nDelete location:");
					scanf("%d",&lc);
				}
				DeleteNode(head,lc);
				PrintList(head);
				printf("Menu:");
				break;
			}
			case 4:
			{
				printf("Alter location:");
				int lc,s;
				scanf("%d",&lc);
				while(lc < 1 || lc > len)
				{
					printf("Input Error!\nAlter location:");
					scanf("%d",&lc);
				}
				printf("Alter value(0~99):");
				scanf("%d",&s);
				while(s < 0 || s > 99)
				{
					printf("Input Error!\nAlter value(0~99):");
			  		scanf("%d",&s);
				}
				AlterNode(head,lc,s);
				PrintList(head);
				printf("Menu:");
				break;
			}
			case 5:
			{
				int s;
				printf("Search value(0~99):");
				scanf("%d",&s);
				while(s < 0 || s > 99)
				{
					printf("Input Error!\nSearch value(0~99):");
					scanf("%d",&s);
				}
				int resoult = SearchNode(head,s);
				if(!resoult)printf("Without %d.\n",s);
				else printf("%d is No.%d.\n",s,resoult);
				printf("\nMenu:");
				break;
			}
			case 6:
			{
				EmptyList(head);
				PrintList(head);
				printf("Menu:");
				break;
			}
			case 0:exit(0);
			default:printf("Input error,please intput again.\nMenu:");
		}
		scanf("%d",&a);
	}
	return 0;
}
			
/*创建链表*/ void CreatList(Node* head,int len)
{
	int s ;
	srand((unsigned)time(NULL));
	for(int i = 1 ; i <= len ; i++ )
	{
		s = rand()%100;
		Node* p = (Node*)malloc(sizeof(Node));
		p->next = head->next;
		head->next = p ;
		p->date = s;
	}
}

/*菜单*/  void PrintMenu()
{
	 printf("\n--------------------------------\n");
	 printf("Menu\n");
	 printf("1.Show mid node.\n");
	 printf("2.Insert node.\n");
	 printf("3.Delete node.\n");
	 printf("4.Alter node.\n");
	 printf("5.Search node.\n");
	 printf("6.Empty list.\n");
	 printf("0.Exit.\n");
	 printf("--------------------------------\n\n");
}

/*输出链表*/ void PrintList(Node* head)
{
	Node* k = head ;
	printf("head");
	while(k->next != NULL)
	{
		printf(" -> %d",k->next->date);
		k = k->next ;
	}
	printf("\n\n");
}

/*查找中间结点*/void FindMidNode(Node* head,int len)
{
	Node* a = head ;
	Node* b = head ;
	while(b != NULL)
	{
		a = a->next ;
		b = b->next ;
		if(b != NULL)b = b->next ;
		else break;
	}
	if((len+1)%2)
	{
		Node* c = head ;
		do{
			if( (c-> next) == (a) )break;
			else c = c->next ;
		}while(1);
		printf("Mid Node is %d or %d.\n",c->date,a->date);

	}else printf("Mid Node is %d.\n",a->date);
}


/*插入*/  void InsertNode(Node* head,int lc,int s)
{
	Node* p = (Node*)malloc(sizeof(Node));
	Node* t = head ;
	for(int i = 0 ; i < lc ; ++i)
	{
		t = t->next;
	}
	p->next = t->next ;
	t->next = p ;
	p->date = s ;
}


/*删除*/  void DeleteNode(Node* head,int lc)
{
	Node* p = head ;
	for(int i = 1 ; i < lc ; ++i)
	{
		p = p->next;
	}
	p->next = p->next->next;
	
}
	

/*更改*/  void AlterNode(Node* head,int lc,int s)
{
	Node* p = head ;
	for(int i = 1 ; i <= lc ; ++i)
	{
		p = p->next;
	}
	p->date = s;
}
	
	
/*查询*/  int SearchNode(Node* head,int s)
{
	Node* p = head->next ;
	int i = 1 ;
	while(1)
	{
		if(p->date == s || p->next == NULL)
		{
			if(p->date == s) return i;
			else return 0;
			break;
		}
		else
		{ 
			p = p->next ;
			++i ;
		}
	}
}
		
		
/*清空*/  void EmptyList(Node* head)
{
	head->next = NULL ;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值