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; }
相关文章推荐
- 关于指针的一些事情
- Lua和C语言的交互详解
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C++智能指针实例详解
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- C语言进制转换代码分享
- 基于C语言fflush()函数的使用详解
- C语言单链队列的表示与实现实例详解