顺序表 其他操作

 1 实验2  顺序表其它操作

 2 实验目的

 3 1.进一步掌握在线性表的顺序存储结构上的一些其它操作。

 4 实验内容

 5 程序1

 6 已知一个线性表,用另辟空间和利用原表两种方法把线性表逆置。

 7 设计要求:在程序中构造三个子程序分别为

 8 SeqList reverse(SeqList A)           /*顺序表的就地逆置 */

 9 void ListTraverse(SeqList L)          /* 遍历顺序表 */

10 SeqList create(int n)                 /* 建立顺序表 */

11  

12 程序2

13 已知两个非递减有序的线性表LA和LB,将LA和LB合并成一个线性表LC,LC也非递减有序。

14 设计要求:在程序中构造三个子程序分别为

15 SeqList MergeSeqList(SeqList La,SeqList Lb)  /*合并顺序表*/

16 void ListTraverse(SeqList L)                    /* 遍历顺序表 */

17 SeqList create()                                  /* 建立顺序表 */

18  

19 程序3

20 已知两个非递减有序的线性表LA和LB,长度分别为m和n,假设LA的空间足够大,利用原表LA,将LA和LB合并成一个仍然非递减有序的线性表。要求时间复杂度为O(m+n)。

21 设计要求:在程序中构造三个子程序分别为

22 SeqList MergeSeqList(SeqList La,SeqList Lb,int m,int n)

23 /*合并顺序表*/

24 void ListTraverse(SeqList L)          /* 遍历顺序表 */

25 SeqList create()                        /* 建立顺序表 */

26  

27 程序4

28 约瑟夫环问题:任给正整数N和K,按下述方法可以得到1,2, …,n的一个置换,将数字1,2,…,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。然后从他在顺时针方向的下一个数字继续报数,如此下去,直到所有的数字全部出列为止。例如N=10,K=3,则正确的出列顺序应为3,692718510429 设计要求:在程序中构造一个子程序为

30 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 }

 

你可能感兴趣的:(顺序)