• 数据结构 【实验2 顺序表其它操作】


      实验要求:

    实验2  顺序表其它操作
    实验目的
    1.进一步掌握在线性表的顺序存储结构上的一些其它操作。
    实验内容
    程序1
    已知一个线性表,用另辟空间和利用原表两种方法把线性表逆置。
    设计要求:在程序中构造三个子程序分别为
    SeqList reverse(SeqList A)           /*顺序表的就地逆置 */
    void ListTraverse(SeqList L)          /* 遍历顺序表 */
    SeqList create(int n)                 /* 建立顺序表 */
     
    程序2
    已知两个非递减有序的线性表LA和LB,将LA和LB合并成一个线性表LC,LC也非递减有序。
    设计要求:在程序中构造三个子程序分别为
    SeqList MergeSeqList(SeqList La,SeqList Lb)  /*合并顺序表*/
    void ListTraverse(SeqList L)                    /* 遍历顺序表 */
    SeqList create()                                  /* 建立顺序表 */
     
    程序3
    已知两个非递减有序的线性表LA和LB,长度分别为m和n,假设LA的空间足够大,利用原表LA,将LA和LB合并成一个仍然非递减有序的线性表。要求时间复杂度为O(m+n)。
    设计要求:在程序中构造三个子程序分别为
    SeqList MergeSeqList(SeqList La,SeqList Lb,int m,int n)
    /*合并顺序表*/
    void ListTraverse(SeqList L)          /* 遍历顺序表 */
    SeqList create()                        /* 建立顺序表 */
     
    程序4
    约瑟夫环问题:任给正整数N和K,按下述方法可以得到1,2, …,n的一个置换,将数字1,2,…,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。然后从他在顺时针方向的下一个数字继续报数,如此下去,直到所有的数字全部出列为止。例如N=10,K=3,则正确的出列顺序应为3,6927185104。
    设计要求:在程序中构造一个子程序为
    void Js(int n,int k)               /*按正确的输出次序输出约瑟夫环中的元素*/
    

      参考代码:

      1 /*
      2 程序1
      3 已知一个线性表,用另辟空间和利用原表两种方法把线性表逆置。
      4 设计要求:在程序中构造三个子程序分别为
      5     SeqList reverse(SeqList A)           //顺序表的就地逆置
      6     void ListTraverse(SeqList L)         //遍历顺序表
      7     SeqList create(int n)                //建立顺序表
      8 */
      9 
     10 #include <stdio.h>
     11 #include <stdlib.h>
     12 
     13 //顺序表的大小
     14 #define MAXSIZE 1000
     15 
     16 //顺序表的存储数据类型
     17 typedef int DateType;
     18 
     19 typedef struct{
     20     DateType data[MAXSIZE];
     21     int length;
     22 }SeqList;
     23 
     24 SeqList reverse1(SeqList A)           //顺序表的就地逆置
     25 {
     26     int i;
     27     for(i=0;i<A.length/2;i++){
     28         DateType t;        //前后元素交换位置
     29         t = A.data[i];
     30         A.data[i] = A.data[A.length-i-1];
     31         A.data[A.length-i-1] = t;
     32     }
     33     printf("逆置成功
    ");
     34     return A;
     35 }
     36 SeqList reverse2(SeqList A)           //顺序表的另辟空间逆置
     37 {
     38     SeqList B;
     39     int i;
     40     for(i=A.length-1;i>=0;i--)
     41         B.data[A.length-i-1] = A.data[i];
     42     B.length = A.length;
     43     printf("逆置成功
    ");
     44     return B;
     45 }
     46 void ListTraverse(SeqList L)         //遍历顺序表
     47 {
     48     int i;
     49     for(i=0;i<L.length;i++)
     50         printf("%d ",L.data[i]);
     51     printf("
    ");
     52 }
     53 SeqList create(int n)                //建立顺序表
     54 {
     55     SeqList sq;    //分配顺序表的空间
     56     sq.length = n;
     57     return sq;
     58 }
     59 
     60 int Menu()
     61 {
     62     int in;
     63     printf("[1] 请先创建一个顺序表
    ");
     64     printf("[2] 遍历输出当前顺序表
    ");
     65     printf("[3] 对顺序表进行就地逆置
    ");
     66     printf("[4] 对顺序表用创建一个新表的方法进行逆置
    ");
     67     printf("[5] 按其它建退出
    ");
     68     scanf("%d",&in);
     69     return in;
     70 }
     71 SeqList Reply(SeqList sq,int in)
     72 {
     73     int t;
     74     switch(in){
     75         case 1:    //创建顺序表
     76             printf("你要创建一个多大的顺序表?(含有多少个元素)
    ");
     77             scanf("%d",&t);    //输入顺序表大小
     78             sq = create(t);    //创建顺序表
     79             printf("请给顺序表赋值
    ");
     80             for(t=1;t<=sq.length;t++){
     81                 printf("请输入顺序表的第%d个元素:
    ",t);
     82                 scanf("%d",&sq.data[t-1]);
     83             }
     84             break;
     85         case 2:    //遍历顺序表
     86             ListTraverse(sq);
     87             break;
     88         case 3:    //就地逆置
     89             sq = reverse1(sq);
     90             break;
     91         case 4:    //创建一个新表逆置
     92             sq = reverse2(sq);
     93             break;
     94         default://退出程序
     95             printf("Bye~
    ");
     96             exit(1);
     97     }
     98     return sq;
     99 }
    100 int main()
    101 {
    102     int in;    //存储输入命令
    103     SeqList sq;
    104     sq.length = 0;
    105     while(1){
    106         in = Menu();
    107         sq = Reply(sq,in);    //响应命令
    108         system("pause");
    109         system("cls");
    110     }
    111     return 0;
    112 }
      1 /*
      2 程序2
      3 已知两个非递减有序的线性表LA和LB,将LA和LB合并成一个线性表LC,LC也非递减有序。
      4 设计要求:在程序中构造三个子程序分别为
      5     SeqList MergeSeqList(SeqList La,SeqList Lb)  //合并顺序表
      6     void ListTraverse(SeqList L)                 //遍历顺序表
      7     SeqList create()                             //建立顺序表
      8 */
      9 
     10 #include <stdio.h>
     11 #include <stdlib.h>
     12 
     13 //顺序表的大小
     14 #define MAXSIZE 1000
     15 
     16 //顺序表的存储数据类型
     17 typedef int DateType;
     18 
     19 typedef struct{
     20     DateType data[MAXSIZE];
     21     int length;
     22 }SeqList;
     23 
     24 SeqList La,Lb,Lc;
     25 
     26 SeqList MergeSeqList(SeqList La,SeqList Lb)  //合并顺序表
     27 {
     28     SeqList Lc;
     29     int i = 0,j = 0,k = 0;
     30     while(i!=La.length && j!=Lb.length){    //依次将La和Lb中较小的元素放入Lc中
     31         if(La.data[i] < Lb.data[j])
     32             Lc.data[k++] = La.data[i++];
     33         else
     34             Lc.data[k++] = Lb.data[j++];
     35     }
     36     while(j!=Lb.length)
     37         Lc.data[k++] = Lb.data[j++];
     38     while(i!=La.length)
     39         Lc.data[k++] = La.data[i++];
     40     Lc.length = La.length + Lb.length;
     41     printf("合并顺序表成功!
    ");
     42     return Lc;
     43 }
     44 void ListTraverse(SeqList L)         //遍历顺序表
     45 {
     46     int i;
     47     for(i=0;i<L.length;i++)
     48         printf("%d ",L.data[i]);
     49     printf("
    ");
     50 }
     51 SeqList create(int n)                //建立顺序表
     52 {
     53     SeqList sq;    //分配顺序表的空间
     54     sq.length = n;
     55     return sq;
     56 }
     57 
     58 int Menu()
     59 {
     60     int in;
     61     printf("[1] 请创建顺序表 La
    ");
     62     printf("[2] 请创建顺序表 Lb
    ");
     63     printf("[3] 对La 和 Lb进行合并
    ");
     64     printf("[4] 输出顺序表 La
    ");
     65     printf("[5] 输出顺序表 Lb
    ");
     66     printf("[6] 输出顺序表 Lc
    ");
     67     printf("[7] 按其它建退出
    ");
     68     scanf("%d",&in);
     69     return in;
     70 }
     71 void Reply(int in)
     72 {
     73     int t;
     74     switch(in){
     75         case 1:    //创建顺序表 La
     76             printf("你要创建一个多大的顺序表?(含有多少个元素)
    ");
     77             scanf("%d",&t);    //输入顺序表大小
     78             La = create(t);    //创建顺序表
     79             printf("请给顺序表赋值
    ");
     80             for(t=1;t<=La.length;t++){
     81                 printf("请输入顺序表的第%d个元素:
    ",t);
     82                 scanf("%d",&La.data[t-1]);
     83             }
     84             break;
     85         case 2:    //创建顺序表 Lb
     86             printf("你要创建一个多大的顺序表?(含有多少个元素)
    ");
     87             scanf("%d",&t);    //输入顺序表大小
     88             Lb = create(t);    //创建顺序表
     89             printf("请给顺序表赋值
    ");
     90             for(t=1;t<=Lb.length;t++){
     91                 printf("请输入顺序表的第%d个元素:
    ",t);
     92                 scanf("%d",&Lb.data[t-1]);
     93             }
     94             break;
     95         case 3:    //对La和Lb进行合并
     96             Lc = MergeSeqList(La,Lb);
     97             break;
     98         case 4:    //遍历顺序表
     99             ListTraverse(La);
    100             break;
    101         case 5:    //遍历顺序表
    102             ListTraverse(Lb);
    103             break;
    104         case 6:    //遍历顺序表
    105             ListTraverse(Lc);
    106             break;
    107         default://退出程序
    108             printf("Bye~
    ");
    109             exit(1);
    110     }
    111 }
    112 int main()
    113 {
    114     int in;    //存储输入命令
    115     La.length = 0;
    116     Lb.length = 0;
    117     Lc.length = 0;
    118     while(1){
    119         in = Menu();
    120         Reply(in);    //响应命令
    121         system("pause");
    122         system("cls");
    123     }
    124     return 0;
    125 }
      1 /*
      2 程序3
      3 已知两个非递减有序的线性表LA和LB,长度分别为m和n,假设LA的空间足够大,利用原表LA,将LA和LB合并成一个仍然非递减有序的线性表。要求时间复杂度为O(m+n)。
      4 设计要求:在程序中构造三个子程序分别为
      5 SeqList MergeSeqList(SeqList La,SeqList Lb,int m,int n)  //合并顺序表
      6 void ListTraverse(SeqList L)          // 遍历顺序表
      7 SeqList create()                      // 建立顺序表
      8 */
      9 
     10 #include <stdio.h>
     11 #include <stdlib.h>
     12 
     13 //顺序表的大小
     14 #define MAXSIZE 1000
     15 
     16 //顺序表的存储数据类型
     17 typedef int DateType;
     18 
     19 typedef struct{
     20     DateType data[MAXSIZE];
     21     int length;
     22 }SeqList;
     23 
     24 SeqList La,Lb,Lc;
     25 
     26 SeqList MergeSeqList(SeqList La,SeqList Lb,int m,int n)  //利用原表LA合并顺序表
     27 {
     28     int i = La.length - 1,j = Lb.length - 1,k = m + n - 1;
     29     while(i>=0 && j>=0){    //将较大的元素放到后面
     30         if(La.data[i] > Lb.data[j])
     31             La.data[k--] = La.data[i--];
     32         else
     33             La.data[k--] = Lb.data[j--];
     34     }
     35     while(i>0)
     36         La.data[k--] = La.data[i--];
     37     while(j>0)
     38         La.data[k--] = Lb.data[j--];
     39     La.length = m + n;
     40     printf("合并顺序表成功!
    ");
     41     return La;
     42 }
     43 
     44 void ListTraverse(SeqList L)         //遍历顺序表
     45 {
     46     int i;
     47     for(i=0;i<L.length;i++)
     48         printf("%d ",L.data[i]);
     49     printf("
    ");
     50 }
     51 SeqList create(int n)                //建立顺序表
     52 {
     53     SeqList sq;    //分配顺序表的空间
     54     sq.length = n;
     55     return sq;
     56 }
     57 
     58 int Menu()
     59 {
     60     int in;
     61     printf("[1] 请创建顺序表 La
    ");
     62     printf("[2] 请创建顺序表 Lb
    ");
     63     printf("[3] 对La 和 Lb进行合并
    ");
     64     printf("[4] 输出顺序表 La
    ");
     65     printf("[5] 输出顺序表 Lb
    ");
     66     printf("[6] 输出顺序表 Lc
    ");
     67     printf("[7] 按其它建退出
    ");
     68     scanf("%d",&in);
     69     return in;
     70 }
     71 void Reply(int in)
     72 {
     73     int t;
     74     switch(in){
     75         case 1:    //创建顺序表 La
     76             printf("你要创建一个多大的顺序表?(含有多少个元素)
    ");
     77             scanf("%d",&t);    //输入顺序表大小
     78             La = create(t);    //创建顺序表
     79             printf("请给顺序表赋值
    ");
     80             for(t=1;t<=La.length;t++){
     81                 printf("请输入顺序表的第%d个元素:
    ",t);
     82                 scanf("%d",&La.data[t-1]);
     83             }
     84             break;
     85         case 2:    //创建顺序表 Lb
     86             printf("你要创建一个多大的顺序表?(含有多少个元素)
    ");
     87             scanf("%d",&t);    //输入顺序表大小
     88             Lb = create(t);    //创建顺序表
     89             printf("请给顺序表赋值
    ");
     90             for(t=1;t<=Lb.length;t++){
     91                 printf("请输入顺序表的第%d个元素:
    ",t);
     92                 scanf("%d",&Lb.data[t-1]);
     93             }
     94             break;
     95         case 3:    //对La和Lb进行合并
     96             Lc = MergeSeqList(La,Lb,La.length,Lb.length);
     97             break;
     98         case 4:    //遍历顺序表
     99             ListTraverse(La);
    100             break;
    101         case 5:    //遍历顺序表
    102             ListTraverse(Lb);
    103             break;
    104         case 6:    //遍历顺序表
    105             ListTraverse(Lc);
    106             break;
    107         default://退出程序
    108             printf("Bye~
    ");
    109             exit(1);
    110     }
    111 }
    112 int main()
    113 {
    114     int in;    //存储输入命令
    115     La.length = 0;
    116     Lb.length = 0;
    117     Lc.length = 0;
    118     while(1){
    119         in = Menu();
    120         Reply(in);    //响应命令
    121         system("pause");
    122         system("cls");
    123     }
    124     return 0;
    125 }
     1 /*
     2 程序4
     3 约瑟夫环问题:任给正整数N和K,按下述方法可以得到1,2, …,n的一个置换,将数字1,2,…,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。然后从他在顺时针方向的下一个数字继续报数,如此下去,直到所有的数字全部出列为止。例如N=10,K=3,则正确的出列顺序应为3,6,9,2,7,1,8,5,10,4。
     4 设计要求:在程序中构造一个子程序为
     5 void Js(int n,int k)               //按正确的输出次序输出约瑟夫环中的元素
     6 */
     7 
     8 #include <stdio.h>
     9 #include <stdlib.h>
    10 
    11 //顺序表的大小
    12 #define MAXSIZE 1000
    13 
    14 //顺序表的存储数据类型
    15 typedef int DateType;
    16 
    17 typedef struct{
    18     DateType data[MAXSIZE];
    19     int length;
    20 }SeqList;
    21 
    22 SeqList sq;
    23 
    24 SeqList create(int n)                //建立顺序表
    25 {
    26     SeqList sq;    //分配顺序表的空间
    27     sq.length = n;
    28     return sq;
    29 }
    30 
    31 
    32 /* 检查顺序表是否为空 */
    33 
    34 int ListEmpty(SeqList L)
    35 {
    36     if(L.length==0)    //是空的
    37         return 1;
    38     else    //不是空的
    39         return 0;
    40 }
    41 
    42 
    43 /* 从顺序表中删除元素 */
    44 
    45 void ListDelete(SeqList* L,int i)  
    46 {
    47     int j;
    48     for(j=i;j<L->length;j++){    //向前覆盖 
    49         L->data[j-1] = L->data[j];    
    50     }
    51     L->length--;    //长度减1
    52     return ;
    53 }
    54 
    55 void Js(int n,int k)    //按正确的输出次序输出约瑟夫环中的元素
    56 {
    57     int t = 0;
    58     printf("约瑟夫环中的元素:
    ");
    59     while(!ListEmpty(sq)){
    60         t = (t + k - 1) % sq.length;
    61         printf("%d ",sq.data[t]);
    62         ListDelete(&sq,t+1);
    63     }
    64     printf("
    ");
    65 }
    66 
    67 int main()
    68 {
    69     int n,k;
    70     printf("请输入N和K:(输入 0 0 停止)
    ");
    71     while(scanf("%d%d",&n,&k)!=EOF){
    72         if(n==0 && k==0) break;
    73         sq = create(n);
    74         printf("请给顺序表赋值
    ");
    75         int t;
    76         for(t=1;t<=sq.length;t++){
    77             scanf("%d",&sq.data[t-1]);
    78         }
    79         Js(n,k);    //按正确的输出次序输出约瑟夫环中的元素
    80         printf("
    ");
    81         printf("请输入N和K:(输入 0 0 停止)
    ");
    82     }
    83     return 0;
    84 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    PHP数组操作,数组排序,数组元素操作,数组元素定位
    提高PHP编程效率的53个要点
    javascript的一些简单的应用
    数字时钟
    一个限定变量范围的小技巧
    windows编程学习——1 关闭窗口不退出
    比木马NB多了
    模拟时钟
    恶搞程序——黑屏
    用白色画笔再画一遍,代替擦除
  • 原文地址:https://www.cnblogs.com/yym2013/p/3622882.html
Copyright © 2020-2023  润新知