您的位置:首页 > 编程语言 > C语言/C++

C语言快慢指针

2015-08-21 21:16 399 查看
#include <stdio.h>
#include <stdlib.h>
#include<time.h>/*用到了time函数,所以要有这个头文件*/
#define FALSE 0
#define TRUE 1
typedef int Status;
typedef int ElemType;

typedef struct Node
{
ElemType data;// 数据域
struct Node* next;
}Node;
typedef struct Node* LinkList;//取别名,则Node*等于LinkList

LinkList InitList()//创建头结点
{
LinkList L;
L = (LinkList)malloc(sizeof(Node));
if(L==NULL)             //小心别漏这个
{
printf("申请头结点失败!\n");
return NULL;
}
L->next = NULL;
return L;
}

void CreateListTial(LinkList *L,int n)//尾插法建立单链表
{
LinkList p,s;
int i;
srand((unsigned)time(NULL));/*播种子*/
*L = (LinkList)malloc(sizeof(Node));
s = *L;
for (i=0;i<n;i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;//产生随机数
s->next = p;
s = p;
}
s->next = NULL;//这个不能丢,否则代码出错,不是完整的链表
}

void PrintList(LinkList L)//输出单链表
{
LinkList p;
p = L->next;
while (p != NULL)
{
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}

Status GetMidNode(LinkList L,ElemType *e)
{
LinkList search,mid;
mid = search = L;//快慢指针都指向头结点
while (search->next != NULL)
{
if (search->next->next != NULL)//快指针是两个两个移动
{
search = search->next->next; //一开始指向第二个元素
mid = mid->next;             //一开始指向第一个元素
}
else    //当链表有奇数个元素时,执行else
{
search = search->next; //这时候快指针移动一个位置
mid = mid->next;       //慢指针也是移动一个位置
}
}
*e = mid->data;
return TRUE;
}

int main()
{
ElemType e;
LinkList num = InitList();
CreateListTial(&num,9);
PrintList(num);
printf("使用快慢指针\n");
GetMidNode(num,&e);
printf("输出中间元素是:%d\n",e);
CreateListTial(&num,10);
PrintList(num);
printf("使用快慢指针\n");
GetMidNode(num,&e);
printf("输出中间元素是:%d\n",e);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针