单链表实现查找中间结点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27855219/article/details/52591135

题目:

用户输入x;

随机生成X个元素,输出中间元素。

若为奇数则输出中间,若为偶数输出中间两个数的平均值

链表实现

具体实现算法

(1)定义两个指针,首先将他们指向第一个元素

(2)快慢指针,快指针p1是慢指针p2的2倍速度。相当于p1+2,p2++;

(3)考虑可能是偶数个元素,快指针p1->next为空时,直接输出慢速度p2所指的元素,并跳出循环。

               若为奇数,直接输出慢速度p2所指的元素。

源代码如下:

/*
用户输入x;
随机生成X个元素,输出中间元素。
若为奇数则输出中间,若为偶数输出中间两个数的平均值
链表实现
*单链表的中间结点
*快慢指针都是头指针快指针是慢指针的2倍速度。
*/
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define random(x) (rand()%x)//随机数0-100

typedef int Elemtype;
typedef struct Node{
	Elemtype data;
	struct Node *next;
};
typedef struct Node * LinkList;

void ListShow(LinkList L);
void ListInsert(LinkList L, int num);
void SearchMid(LinkList L);
int ListLength(LinkList L);

void main()
{
	LinkList L;
	L = ( LinkList )malloc( sizeof (Node));//L->next为第一个元素,L为指向头结点的指针
    L->next = NULL;  
	int x,length;
	printf("\n");
	printf("请输入随机数链表的长度:\n");
	scanf("%d",&x);
	printf("\n");
	while(x--)
	{
	   ListInsert(L,random(100));
	}
	 length=ListLength(L); 
	 printf("当前链表长度为:%2d\n",length);
	 ListShow(L);
	 SearchMid(L);
}	
void ListInsert(LinkList L, int num)  //尾插法建立链表  
{   	
	LinkList temp = L;  //temp为尾指针
    LinkList new_node = NULL;  
    new_node = (LinkList)malloc(sizeof(Node));  
    if (!new_node)  
    {  
        printf("memory out of use/n");  
    }   
	while (temp->next != NULL)     //寻找尾结点
    {  
        temp = temp->next;  
    }  
    new_node->data = num;  
    new_node->next = NULL;  
	temp->next= new_node;  
	temp=new_node;   
}  
void ListShow(LinkList L)  
{  
    LinkList temp; 
	temp=L->next;
	printf("*******************当前链表元素为:************\n");
    while(temp)  
    {  
       printf("%3d\t" ,temp->data);
       temp = temp->next;  
    } 
	printf("\n");
  
}  
void SearchMid(LinkList L){
	  LinkList p1,p2,t; //p1为快指针+2,p2为慢指针+1
	  p1=p2=t=L->next;
      float Mid;
	while (p1->next != NULL)     //寻找尾结点
    {  
		t=p1->next;  
		if(t->next==NULL)
		{
			Mid=0.5*(p2->data+p2->next->data);
			printf("\n------------偶数个元素中间值为%.2f-----------------\n\n",Mid);	
			exit(0);
		}	
		else
		{
		  p1=t->next;
		  p2=p2->next;
		}		
    } 
	printf("\n------------奇数个元素中间值为%d-------------------\n\n",p2->data);
	
}
int ListLength(LinkList L)
{
	LinkList t; 
	t=L->next;
    int length=0;
	while (t->next != NULL)     //寻找尾结点
    {  
		t=t->next;  
		length++;
	}
	return length+1;
}

截图:

扫描二维码关注公众号,回复: 3970820 查看本文章

例如

(1)链表总长度为奇数9



(2)链表总长度为偶数20


猜你喜欢

转载自blog.csdn.net/qq_27855219/article/details/52591135