数据结构 【实验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,6,9,2,7,1,8,5,10,4。
设计要求:在程序中构造一个子程序为
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