数据结构 【实验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("逆置成功\n");
 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("逆置成功\n");
 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("\n");
 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] 请先创建一个顺序表\n");
 64     printf("[2] 遍历输出当前顺序表\n");
 65     printf("[3] 对顺序表进行就地逆置\n");
 66     printf("[4] 对顺序表用创建一个新表的方法进行逆置\n");
 67     printf("[5] 按其它建退出\n");
 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("你要创建一个多大的顺序表?(含有多少个元素)\n");
 77             scanf("%d",&t);    //输入顺序表大小
 78             sq = create(t);    //创建顺序表
 79             printf("请给顺序表赋值\n");
 80             for(t=1;t<=sq.length;t++){
 81                 printf("请输入顺序表的第%d个元素:\n",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~\n");
 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("合并顺序表成功!\n");
 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("\n");
 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\n");
 62     printf("[2] 请创建顺序表 Lb\n");
 63     printf("[3] 对La 和 Lb进行合并\n");
 64     printf("[4] 输出顺序表 La\n");
 65     printf("[5] 输出顺序表 Lb\n");
 66     printf("[6] 输出顺序表 Lc\n");
 67     printf("[7] 按其它建退出\n");
 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("你要创建一个多大的顺序表?(含有多少个元素)\n");
 77             scanf("%d",&t);    //输入顺序表大小
 78             La = create(t);    //创建顺序表
 79             printf("请给顺序表赋值\n");
 80             for(t=1;t<=La.length;t++){
 81                 printf("请输入顺序表的第%d个元素:\n",t);
 82                 scanf("%d",&La.data[t-1]);
 83             }
 84             break;
 85         case 2:    //创建顺序表 Lb
 86             printf("你要创建一个多大的顺序表?(含有多少个元素)\n");
 87             scanf("%d",&t);    //输入顺序表大小
 88             Lb = create(t);    //创建顺序表
 89             printf("请给顺序表赋值\n");
 90             for(t=1;t<=Lb.length;t++){
 91                 printf("请输入顺序表的第%d个元素:\n",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~\n");
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("合并顺序表成功!\n");
 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("\n");
 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\n");
 62     printf("[2] 请创建顺序表 Lb\n");
 63     printf("[3] 对La 和 Lb进行合并\n");
 64     printf("[4] 输出顺序表 La\n");
 65     printf("[5] 输出顺序表 Lb\n");
 66     printf("[6] 输出顺序表 Lc\n");
 67     printf("[7] 按其它建退出\n");
 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("你要创建一个多大的顺序表?(含有多少个元素)\n");
 77             scanf("%d",&t);    //输入顺序表大小
 78             La = create(t);    //创建顺序表
 79             printf("请给顺序表赋值\n");
 80             for(t=1;t<=La.length;t++){
 81                 printf("请输入顺序表的第%d个元素:\n",t);
 82                 scanf("%d",&La.data[t-1]);
 83             }
 84             break;
 85         case 2:    //创建顺序表 Lb
 86             printf("你要创建一个多大的顺序表?(含有多少个元素)\n");
 87             scanf("%d",&t);    //输入顺序表大小
 88             Lb = create(t);    //创建顺序表
 89             printf("请给顺序表赋值\n");
 90             for(t=1;t<=Lb.length;t++){
 91                 printf("请输入顺序表的第%d个元素:\n",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~\n");
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("约瑟夫环中的元素:\n");
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("\n");
65 }
66 
67 int main()
68 {
69     int n,k;
70     printf("请输入N和K:(输入 0 0 停止)\n");
71     while(scanf("%d%d",&n,&k)!=EOF){
72         if(n==0 && k==0) break;
73         sq = create(n);
74         printf("请给顺序表赋值\n");
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("\n");
81         printf("请输入N和K:(输入 0 0 停止)\n");
82     }
83     return 0;
84 }

 

Freecode : www.cnblogs.com/yym2013

posted @ 2014-03-25 12:45  Freecode#  阅读(770)  评论(0编辑  收藏  举报