线性表应用:建立一个随机数 链表获得中间结点

  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 }

 

posted @ 2020-03-14 11:37  Xxaj5  阅读(285)  评论(0编辑  收藏  举报