您的位置:首页 > 理论基础 > 数据结构算法

单链表实现查找中间结点

2016-09-20 01:50 337 查看
题目:

用户输入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;
}
截图:

例如

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



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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐