zoukankan      html  css  js  c++  java
  • 数据结构 【实验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

  • 相关阅读:
    ffmpeg rtmp推流 视频转码
    java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
    nginx stream 流转发,可以转发rtmp、mysql访问流,转发rtmp、jdbc请求
    java web http 转https 通过nginx代理访问
    linux 服务器磁盘挂载
    novnc 通过websockify代理 配置多点访问
    linux 文件服务 minio 安装部署配置
    AOP实现原理,手写aop
    java 泛型
    JAVA反射getGenericSuperclass()用法
  • 原文地址:https://www.cnblogs.com/yym2013/p/3622882.html
Copyright © 2011-2022 走看看