• 《数据结构教程》(李春葆 主编)课后习题【练习题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:
    ");
    20     while(scanf("%d",&n)!=EOF){
    21         if(n==0) break;
    22         printf("请输入n个数:
    ");
    23         Input(a,n);
    24         printf("这n个数的平均数为:
    ");
    25         printf("%.2lf
    ",GetAve(a,n));
    26         printf("
    ");
    27         printf("请输入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] 重新建立一个链表
    ");
    196     printf("[2] 求以h为头指针的单链表的节点个数
    ");
    197     printf("[3] 正向显示以h为头指针的单链表的所有节点值
    ");
    198     printf("[4] 反向显示以h为头指针的单链表的所有节点值
    ");
    199     printf("[5] 删除以h为头指针的单链表中值为x的第一个节点
    ");
    200     printf("[6] 删除以h为头指针的单链表中值为x的所有节点
    ");
    201     printf("[7] 删除以h为头指针的单链表中最大节点值
    ");
    202     printf("[8] 删除以h为头指针的单链表中最小节点值
    ");
    203     printf("[0] 按其他键退出
    ");
    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("你要输入多少个数据?
    ");
    216             scanf("%d",&n);    //输入链表大小
    217             printf("请依次输入数据:
    ");
    218             for(i=1;i<=n;i++) 
    219                 scanf("%d",&a[i]);    
    220             head = LinkedListCreat(head,a,n);
    221             printf("链表建立成功!
    ");
    222             break;
    223 
    224         case 2:    //求以h为头指针的单链表的节点个数
    225             printf("单链表的节点个数为:%d
    ",GetNodeNum(head));
    226             break;
    227 
    228         case 3:    //正向显示以h为头指针的单链表的所有节点值
    229             printf("链表中元素依次为(正向):
    ");
    230             PrintForward(head);
    231             printf("
    ");
    232             break;
    233 
    234         case 4:    //反向显示以h为头指针的单链表的所有节点值
    235             printf("链表中元素依次为(反向):
    ");
    236             PrintReverse(head);
    237             printf("
    ");
    238             break;
    239 
    240         case 5:    //删除以h为头指针的单链表中值为x的第一个节点
    241             printf("输入你要删除的元素的值?
    ");
    242             scanf("%d",&x);
    243             if(DeleteFirstX(head,x))
    244                 printf("删除成功!
    ");
    245             else 
    246                 printf("删除失败!
    ");
    247             printf("链表中元素依次为(正向):
    ");
    248             PrintForward(head);
    249             printf("
    ");
    250             break;
    251 
    252         case 6:    //删除以h为头指针的单链表中值为x的所有节点
    253             printf("输入你要删除的元素的值?
    ");
    254             scanf("%d",&x);
    255             n = GetNodeNum(head);
    256             DeleteAllX(head,x);
    257             i = GetNodeNum(head);
    258             if(n!=i)
    259                 printf("删除成功!
    ");
    260             else
    261                 printf("删除失败!
    ");
    262             printf("链表中元素依次为(正向):
    ");
    263             PrintForward(head);
    264             printf("
    ");
    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("删除成功!
    ");
    273             else
    274                 printf("删除失败!
    ");
    275             printf("链表中元素依次为(正向):
    ");
    276             PrintForward(head);
    277             printf("
    ");
    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("删除成功!
    ");
    286             else
    287                 printf("删除失败!
    ");
    288             printf("链表中元素依次为(正向):
    ");
    289             PrintForward(head);
    290             printf("
    ");
    291             break;
    292 
    293         default:
    294             printf("Bye~
    ");
    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

  • 相关阅读:
    计算两个日期相差的天数
    获取当前星期几
    window下重置mysql用户密码
    window下安装mysql
    oracle用户密码过期如何处理?
    awk
    RunLoop
    通知中心
    KVO
    多线程
  • 原文地址:https://www.cnblogs.com/yym2013/p/3689877.html
Copyright © 2020-2023  润新知