题目:
编写一个程序,实现随机生成20个元素的链表(尾插法或头插法任意),
用利用快慢指针的方法快速查找中间结点的值并显示。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/****************************************************/
/*链表声明*/
/****************************************************/
typedef int ElementType;
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
struct Node
{
ElementType Element;
Position Next;
};
/********************************************************************/
/*创建链表*/
/********************************************************************/
List Create_LinkList()
{
Position Head; //头节点
Head=(Position)malloc(sizeof(Node));
if(Head==NULL)
{
printf("动态内存分配失败,程序结束!\n");
exit(-1);
}
Position Tail=Head;
Tail->Next=NULL;
srand((unsigned)time(NULL)); //根据系统时钟产生随机种子
for(int i=0;i<20;i++)
{
Position New=(Position)malloc(sizeof(Node));
if(New==NULL)
{
printf("动态内存分配失败,程序结束!\n");
exit(-1);
}
New->Element=rand()%20;
Tail->Next=New;
Tail=New;
Tail->Next=NULL;
}
return Head;
}
/********************************************************************/
/*遍历链表*/
/********************************************************************/
void Traverse_LinkList(Position L)
{
Position p=L->Next; //注意
while(p!=NULL)
{
printf("%d ",p->Element);
p=p->Next;
}
printf("\n");
}
/********************************************************************/
/*利用快慢指针的方法输出链表的中间元素(标尺的思想)*/
/********************************************************************/
void PrintMidCell(List L)
{
Position Search,Mid;
Search=Mid=L;
while(Search->Next != NULL)
{
if(Search->Next->Next != NULL)
{
Mid=Mid->Next;
Search=Search->Next->Next;
}
else
{
Search=Search->Next;
}
}
printf("这个链表的中间元素是%d ",Mid->Element);
printf("\n");
}
/********************************************************************/
/*主函数*/
/********************************************************************/
int main()
{
Position Head;
Head=Create_LinkList();
Traverse_LinkList(Head);
PrintMidCell(Head);
return 0;
}