问答题 顺序存储的线性表
   实验目的:
   (1)了解线性表的逻辑结构特征。
   (2)熟练掌握线性表的顺序存储结构的描述方法,及在其上实现各种基本运算的方法。
   (3)掌握和理解本实验中出现的一些基本的c语言语句。
   (4)体会算法在程序设计中的重要性。
   实验内容:
   (1)将一顺序表a中的元素逆置。要求算法仅用一个辅助结点。
   (2)求顺序表中的元素的最大值和次最大值。
   (3)试设计一个算法,仅用一个辅助结点,实现将顺序表a中的结点循环右移k位的运算。
   (4)设一顺序表中元素值递增有序。试设计一算法,将元素x插入到表中适当的位置上,并保持顺序表的有序性。
【正确答案】(1)
   #define MAXSIZE 100
   typedef struct
   { int len;
   int data[MAXSIZE];
   }SEQUENLIST;    /*顺序表结构类型定义*/
   void rev(SEQUENLIST*q)    /*逆置顺序表元素算法*/
   { int i,j,t;
       for(i=0,j=q->len-1;i<q->len/2;i++,j--)
       {t=q->data[i];
           q->data[i]=q->data[j];
           q->data[j]=t;
       }
   }
   main()    /*主函数*/
   { int i;
       SEQUENLIST a;
       a.len=7;   /*假设顺序表中有7个元素*/
       for(i=0;i<a.len;i++)    /*输入顺序表元素*/
           scanf("/%d",&a.data[i]);
       rev(&a);    /*调用逆置顺序表元素函数*/
       for(i=0;i<a.len;i++)    /*逆置后顺序表元素显示*/
           printf("/%4d",a.data[i]);
   }
   (2)
   #define MAXSIZE 100
   typedef struct
   {  int len;
       int data[MAXSIZE];
   }  SEQUENLIST;
   SEQUENLIST p;
   void sort(SEQUENLIST*q)    /*采用冒泡排序的方法对数组进行降序排序*/
   {  int i,j,t;
       for(i=0;i<q->len-1;i++)
           for(j=i+1;j<q->len;j++)
               if(q->data[i]<q->data[j])
           {t=q->data[i];q->data[i]=q->data[j];q->data[j]=t;}
   }
   main()
   { int i;
       p.len=7;
       for(i=0;i<p.len;i++)
           scanf("/%d",&p.data[i]);
       sort(&p);
       for(i=0;i<2;i++)    /*输出数组中的前两个元素值*/
           printf("/%4d",p.data[i]);
   }
   (3)
   #define MAXSIZE 100
   typedef struct
   {  int len;
       int data[MAXSIZE];
   }SEQUENLIST;    /*顺序表结构类型定义*/
   void move(SEQUENLIST*q,int k)    /*结点循环右移k位运算的算法*/
   { int i,j=0,t;
       while(j<k)
           {t=q->data[q->len-1];    /*把最后一个元素放在单元t中*/
           for(i=q->len-2;i>=0;i--)    /*从倒数第二个元素开始依次后移*/
               q->data[i+1]=q->data[i];
           q->data[0]=t;    /*把最后一个元素放在第一个元素位置*/
           j++;
           }
   }
   main()
   {  int i,k;
       SEQUENLIST a;
       a.len=5;    /*假设顺序表中有5个元素*/
       for(i=0;i<a.len;i++)    /*输入顺序表元素*/
           scanf("/%d",&a.data[i]);
       scanf("/%d",&k);    /*输入循环右移的位数k*/
       move(&a,k);    /*调用结点循环右移k位运算函数*/
       for(i=0;i<a.len;i++)    /*输出结点循环右移k位运算后的顺序表*/
           printf("/%4d",a.data[i]);
   }
   (4)
   #define MAXSIZE 100
   typedef struct
   {  int len;
       int data[MAXSIZE];
   }SEQUENLIST;    /*顺序表结构类型定义*/
   void insert(SEQUENLIST*q,int x)  /*插入元素x,保持顺序表有序性算法*/
   {  int i;
       for(i=q->len-1;q->data[i]>=x&&i>=0;i--)
           q->data[i+1]=q->data[i];
       q->data[i+1]=x;
       q->len++:
   }
   main()
   {  int i,x;
       SEQUENLIST p;
       p.len=7;    /*假设顺序表中有7个元素*/
       for(i=0;i<p.len;i++)    /*输入顺序表元素*/
           scanf("/%d",&p.data[i]);
       scanf("/%d",&x);    /*输入待插入元素x*/
       insert(&p,x);    /*调用插入元素x函数*/
       for(i=0;i<p.len;i++)    /*插入元素x后的顺序表显示*/
           printf("/%4d",p.data[i]);
   }
【答案解析】