单链表实现查找中间结点
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
用户输入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
相关文章推荐
- 单链表的排序(快排和冒泡实现)以及查找中间结点
- 数据结构(四)之单链表查找中间结点
- cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针
- 单链表操作之查找中间结点
- 【Java】实现一个算法,删除单链表中间的某个结点,假定你只能访问该结点
- (学习java)写一个完整的程序,实现随机生成20个元素的链表,快速查找中间结点的值并显示
- 单链表之查找单链表的中间结点
- 实现一个算法,删除单链表中间的某个结点,假定你只能访问该结点
- 单链表的逆置和中间结点的查找
- cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针
- 单链表的创建和遍历、求单链表中节点的个数、查找单链表中的中间结点、判断单链表是否有环、取出有环链表中环的长度,删除有序链表中的重复结点
- 建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
- 数据结构(四)之单链表查找中间结点
- 单链表的创建、插入、删除、销毁以及查找中间结点
- 单链表查找倒数第i个结点,linux纯C实现
- 计算带头结点单链表的长度 计算单链表的长度,实现单链表的打印
- 查找单链表的中间节点,要求只能遍历一次链表
- 数据结构 单链表实现前插、后插、前删、后删、显示、查找等等
- 【c++版数据结构】之单链表的实现(带头结点以及尾节点)
- 面试题——查找单链表的中间节点