数据结构 【实验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

你可能感兴趣的:(数据结构)