《數據結構教程》(李春葆 主編)課后習題【練習題5】


【5.1】

 1 #include <stdio.h>
 2 #define MAXSIZE 1000
 3 double GetAve(int a[],int n)    //求數組a[]前n個數的平均數
 4 {  5     if(n==1)  6         return a[1];  7     return (a[n]+GetAve(a,n-1)*(n-1))/n;  8 }  9 void Input(int a[],int n)    //輸入數據
10 { 11     int i; 12     for(i=1;i<=n;i++) 13         scanf("%d",&a[i]); 14 } 15 int main() 16 { 17     int n; 18     int a[MAXSIZE+1]; 19     printf("請輸入n:\n"); 20     while(scanf("%d",&n)!=EOF){ 21         if(n==0) break; 22         printf("請輸入n個數:\n"); 23  Input(a,n); 24         printf("這n個數的平均數為:\n"); 25         printf("%.2lf\n",GetAve(a,n)); 26         printf("\n"); 27         printf("請輸入n:\n"); 28  } 29     return 0; 30 }

【5.2】

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #include <stdlib.h>
 4 
 5 #define MAXSIZE 1000
 6 typedef int ElemType;  7 typedef struct node{    //定義鏈表節點類型
 8  ElemType data;  9     struct node * next;  10 } Node;  11 typedef Node *LinkedNode;  12 
 13 /*[1] 求以h為頭指針的單鏈表的節點個數 */
 14 int GetNodeNum(LinkedNode &h)  15 {  16     if(h==NULL)  17         return 0;  18     else 
 19         return GetNodeNum(h->next) + 1;  20 }  21 /*[2] 正向顯示以h為頭指針的單鏈表的所有節點值 */
 22 void PrintForward(LinkedNode &h)  23 {  24     if(h==NULL)    //鏈表到頭,結束輸出
 25         return ;  26     printf("%d ",h->data);  27     PrintForward(h->next);    //輸出下一個元素值
 28 }  29 /*[3] 反向顯示以h為頭指針的單鏈表的所有節點值 */
 30 void PrintReverse(LinkedNode &h)  31 {  32     if(h==NULL)  33         return ;  34     PrintReverse(h->next);    //鏈表跑到頭,再開始輸出
 35     printf("%d ",h->data);  36 }  37 /*[4] 刪除以h為頭指針的單鏈表中值為x的第一個節點 */
 38 bool DeleteFirstX(LinkedNode &h,ElemType x)  39 {  40     //遞歸出口
 41     if(h==NULL)  42         return false;  43     else if(h->data==x){        //第一個節點就是要找的節點,刪除
 44         if(h->next==NULL){    //只有一個節點
 45  free(h);  46             h = NULL;  47             return true;  48  }  49  LinkedNode p;  50         p = h;  51         h = h->next;  52  free(p);  53         return true;  54  }  55     else if(h->next!=NULL){  56         if(h->next->data==x){    //找到節點,刪除
 57  LinkedNode p;  58             p = h->next;  59             h->next = p->next;  60  free(p);  61             return true;  62  }  63  }  64     //遞歸體
 65     if(DeleteFirstX(h->next,x))  66         return true;  67     else 
 68         return false;  69 }  70 /*[5] 刪除以h為頭指針的單鏈表中值為x的所有節點 */
 71 void DeleteAllX(LinkedNode &h,ElemType x)  72 {  73     if(h==NULL)  74         return ;  75     if(h->data==x){        //第一個節點就是要找的節點,刪除
 76         if(h->next==NULL){    //只有一個節點
 77  free(h);  78             h = NULL;  79             return ;  80  }  81  LinkedNode p;  82         p = h;  83         h = h->next;  84  free(p);  85  DeleteAllX(h,x);  86  }  87     else if(h->next==NULL)    //遞歸出口
 88         return ;  89     else if(h->next->data==x){    //找到節點,刪除
 90  LinkedNode p;  91         p = h->next;  92         h->next = p->next;  93  free(p);  94  DeleteAllX(h,x);  95  }  96     else
 97         DeleteAllX(h->next,x);  98 }  99 
100 /*[6] 刪除以h為頭指針的單鏈表中最大節點值 */
101 void DeleteMaxNode(LinkedNode &h,LinkedNode c,LinkedNode p) 102 { 103     if(h==NULL) 104         return ; 105     if(c->next==NULL){    //到頭,開始刪除
106         if(p->next ==NULL){ 107  free(p); 108             h = NULL; 109             return ; 110  } 111         if(p==h && p->data > p->next->data){    //第一個節點是要刪除的節點
112             h = h->next; 113  free(p); 114             return ; 115  } 116         else{ 117             LinkedNode q = p->next; 118             p->next = q->next; 119  free(q); 120             return ; 121  } 122  } 123     if(c->next->data > p->next->data) 124         p = c; 125     DeleteMaxNode(h,c->next,p); 126 } 127 /*[7] 刪除以h為頭指針的單鏈表中最小節點值 */
128 void DeleteMinNode(LinkedNode &h,LinkedNode c,LinkedNode p) 129 { 130     if(h==NULL) 131         return ; 132     if(c->next==NULL){    //到頭,開始刪除
133         if(p->next ==NULL){ 134  free(p); 135             h = NULL; 136             return ; 137  } 138         if(p==h && p->data < p->next->data){    //第一個節點是要刪除的節點
139             h = h->next; 140  free(p); 141             return ; 142  } 143         else{ 144             LinkedNode q = p->next; 145             p->next = q->next; 146  free(q); 147             return ; 148  } 149  } 150     if(c->next->data < p->next->data) 151         p = c; 152     DeleteMinNode(h,c->next,p); 153 } 154 
155 /* 1. 初始化單鏈表 */
156 LinkedNode LinkedListInit() 157 { 158     LinkedNode head = (Node*)malloc(sizeof(Node)); 159     head->next = NULL; 160     return head; 161 } 162  
163 /* 2. 清空單鏈表 */
164 void LinkedListClear(LinkedNode &L) 165 { 166     //L為頭指針
167     while(L){    //依次清空節點,直到頭指針指向的下一個節點的地址為空
168  LinkedNode t; 169         t = L; 170         L = t->next; 171  free(t); 172  } 173     return ; 174 } 175 
176 /* 3. 用尾插法建立單鏈表 */
177 LinkedNode  LinkedListCreat( LinkedNode L,ElemType a[],int n )    //講數組a中的元素以尾插法放入鏈表中
178 { 179     int i; 180     LinkedNode p = L; 181     p->data = a[1]; 182     for(i=2;i<=n;i++){ 183         LinkedNode q = (LinkedNode)malloc(sizeof(Node)); 184         q->data = a[i]; 185         q->next = NULL; 186         p->next = q; 187         p = q; 188  } 189     return L; 190 } 191 
192 int Menu() 193 { 194     int in; 195     printf("[1] 重新建立一個鏈表\n"); 196     printf("[2] 求以h為頭指針的單鏈表的節點個數\n"); 197     printf("[3] 正向顯示以h為頭指針的單鏈表的所有節點值\n"); 198     printf("[4] 反向顯示以h為頭指針的單鏈表的所有節點值\n"); 199     printf("[5] 刪除以h為頭指針的單鏈表中值為x的第一個節點\n"); 200     printf("[6] 刪除以h為頭指針的單鏈表中值為x的所有節點\n"); 201     printf("[7] 刪除以h為頭指針的單鏈表中最大節點值\n"); 202     printf("[8] 刪除以h為頭指針的單鏈表中最小節點值\n"); 203     printf("[0] 按其他鍵退出\n"); 204     scanf("%d",&in); 205     return in; 206 } 207 LinkedNode Reply(LinkedNode head,int in) 208 { 209     int i,n,x; 210     int a[MAXSIZE+1]; 211     switch(in){ 212         case 1:    //重新建立一個鏈表
213  LinkedListClear(head); 214             head = LinkedListInit(); 215             printf("你要輸入多少個數據?\n"); 216             scanf("%d",&n);    //輸入鏈表大小
217             printf("請依次輸入數據:\n"); 218             for(i=1;i<=n;i++) 219                 scanf("%d",&a[i]); 220             head = LinkedListCreat(head,a,n); 221             printf("鏈表建立成功!\n"); 222             break; 223 
224         case 2:    //求以h為頭指針的單鏈表的節點個數
225             printf("單鏈表的節點個數為:%d\n",GetNodeNum(head)); 226             break; 227 
228         case 3:    //正向顯示以h為頭指針的單鏈表的所有節點值
229             printf("鏈表中元素依次為(正向):\n"); 230  PrintForward(head); 231             printf("\n"); 232             break; 233 
234         case 4:    //反向顯示以h為頭指針的單鏈表的所有節點值
235             printf("鏈表中元素依次為(反向):\n"); 236  PrintReverse(head); 237             printf("\n"); 238             break; 239 
240         case 5:    //刪除以h為頭指針的單鏈表中值為x的第一個節點
241             printf("輸入你要刪除的元素的值?\n"); 242             scanf("%d",&x); 243             if(DeleteFirstX(head,x)) 244                 printf("刪除成功!\n"); 245             else 
246                 printf("刪除失敗!\n"); 247             printf("鏈表中元素依次為(正向):\n"); 248  PrintForward(head); 249             printf("\n"); 250             break; 251 
252         case 6:    //刪除以h為頭指針的單鏈表中值為x的所有節點
253             printf("輸入你要刪除的元素的值?\n"); 254             scanf("%d",&x); 255             n = GetNodeNum(head); 256  DeleteAllX(head,x); 257             i = GetNodeNum(head); 258             if(n!=i) 259                 printf("刪除成功!\n"); 260             else
261                 printf("刪除失敗!\n"); 262             printf("鏈表中元素依次為(正向):\n"); 263  PrintForward(head); 264             printf("\n"); 265             break; 266 
267         case 7:    //刪除以h為頭指針的單鏈表中最大節點值
268             n = GetNodeNum(head); 269  DeleteMaxNode(head,head,head); 270             i = GetNodeNum(head); 271             if(n!=i) 272                 printf("刪除成功!\n"); 273             else
274                 printf("刪除失敗!\n"); 275             printf("鏈表中元素依次為(正向):\n"); 276  PrintForward(head); 277             printf("\n"); 278             break; 279 
280         case 8:    //刪除以h為頭指針的單鏈表中最小節點值
281             n = GetNodeNum(head); 282  DeleteMinNode(head,head,head); 283             i = GetNodeNum(head); 284             if(n!=i) 285                 printf("刪除成功!\n"); 286             else
287                 printf("刪除失敗!\n"); 288             printf("鏈表中元素依次為(正向):\n"); 289  PrintForward(head); 290             printf("\n"); 291             break; 292 
293         default: 294             printf("Bye~\n"); 295             exit(1); 296  } 297     system("pause"); 298     system("cls"); 299     return head; 300 } 301 int main() 302 { 303     int in;    //存儲輸入命令
304     LinkedNode head = NULL; 305     while(1){ 306         in = Menu(); 307         head = Reply(head,in);    //響應命令
308  } 309     return 0; 310 }

 

 

Freecode : www.cnblogs.com/yym2013


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM