1 方法一:生成链表 计算节点个数 找到中间
2 方法二:Status GetMidNode(LinkList L, ElemType *e) //用两个指针 快指针是慢指针移动速度的两倍 快指针移动到结尾 则慢指针移动到中央 (这种方法是第一种方法速度三倍)
3 {
4 LinkList search, mid;
5 mid = search = L;
6
7 while (search->next != NULL)
8 {
9 //search移动的速度是 mid 的2倍
10 if (search->next->next != NULL)
11 {
12 search = search->next->next;
13 mid = mid->next;
14 }
15 else
16 {
17 search = search->next;
18 }
19 }
20
21 *e = mid->data;
22 return OK;
23 }
24 纯自己实现的代码 嘻嘻 建立了一个20个结点的链表
25 其中相关的time函数 srand rand函数在知识点中查阅
26 #include<stdio.h>
27 #include<stdlib.h>
28 #include<time.h>
29
30 #define LEN sizeof(LinkList)
31
32 LinkList *ListInit();
33 LinkList *creatList(LinkList *L);
34 void printList(LinkList *L);
35 int ListLength(LinkList *L);
36 int GetMidNode(LinkList *L);
37 void releaseList(LinkList *L);
38
39 typedef struct Node
40 {
41 int data;
42 struct Node *next;
43 }LinkList;
44
45 LinkList *ListInit()
46 {
47 LinkList *L;
48
49 L = (LinkList *)malloc(LEN);
50 if(L == NULL)
51 {
52 printf("内存分配失败!");
53 exit(1);
54 }
55 L->next = NULL;
56 return L; //创建头结点并返回
57 }
58
59 LinkList *creatList(LinkList *L)
60 {
61 LinkList *p;
62 LinkList *q;
63 int n = 20;
64 int temp = 0;
65 srand(time(0));
66
67 for(int i = 0; i< 20; i++)
68 {
69 temp++;
70 p = (LinkList *)malloc(LEN);
71 p->data = rand()%100;
72
73 if(temp == 1)
74 {
75 L->next = p;
76 }
77 else
78 {
79 q->next = p;
80 }
81 q = p;
82 }
83 q->next =NULL;
84 return L;
85 }
86
87 int ListLength(LinkList *L)
88 {
89 LinkList *p;
90 int i = 0;
91
92 p = L->next;
93 while(p != NULL)
94 {
95 i++;
96 p = p->next;
97 }
98 return i;
99 }
100
101 void printList(LinkList *L)
102 {
103 LinkList *p;
104 p = L->next;
105 while(p != NULL)
106 {
107 printf("%d ",p->data);
108 p = p->next;
109 }
110 }
111
112 int GetMidNode(LinkList *L) //search的移动速度是mid的两倍
113 {
114 LinkList *search;
115 LinkList *mid;
116 int mid_data;
117
118 mid = search = L;
119 while(search->next != NULL)
120 {
121 if(search->next->next != NULL)
122 {
123 search = search->next->next;
124 mid = mid->next;
125 }
126 else
127 {
128 search = search->next;
129 }
130 }
131 mid_data = mid->data;
132 return mid_data;
133 }
134
135 void releaseList(LinkList *L)
136 {
137 LinkList *temp;
138
139 while(L != NULL)
140 {
141 temp = L;
142 L = L->next;
143 free(temp);
144 }
145 }
146
147 int main(void)
148 {
149 LinkList *L;
150 int num;
151 int midnode;
152 L = ListInit();//创建头结点并且返回
153
154 creatList(L); //创建随机数据链表
155 printf("生成随机数据链表:\n");
156 printList(L); //查看链表
157 printf("\n");
158 num = ListLength(L); //测量长度
159 printf("链表长度是:%d\n",num);
160 midnode = GetMidNode(L);//获得中间结点的值
161 printf("中间结点的值是:%d\n",midnode);
162 releaseList(L);//释放内存
163 return 0;
164 }