线性表应用:建立一个随机数 链表获得中间结点
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 }