【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