第1关:顺序表逆置
任务描述
本关任务:设计一个高效算法,将顺序表L
的所有元素逆置,要求算法的空间复杂度为O(1)
。
相关知识
为了完成本关任务,你需要掌握:1.顺序表的创建 2.顺序表的遍历 3. 顺序表的逆置。
编程要求
根据提示,在右侧编辑器“Begin”和 “End”之间补充代码。
测试说明
输入输出说明: 输入包含两行,第一行为元素个数n
,第二行为顺序表中的所有元素。 输出包含一行为顺序表逆置后的元素。
#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct{
int x;
int y;
}ElemType;
typedef struct{
int length;
ElemType *base;
}SeqList;
Status Init(SeqList &L)
{
L.base = new ElemType[MAXSIZE];
if(!L.base) return ERROR;
L.length = 0;
return OK;
}
Status Create(SeqList &L, int n)
{
for(int i = 0; i < n; i ++)
cin >> L.base[i].x >> L.base[i].y;
L.length = n;
return OK;
}
void Inverse(SeqList &L)
{
/********************Begin*******************/
for (int i = 0; i<L.length/2; i++){
int t = L.base[i].x;
int t1 = L.base[i].y;
L.base[i].x = L.base[L.length-i-1].x;
L.base[i].y = L.base[L.length-i-1].y;
L.base[L.length-1-i].x = t;
L.base[L.length-1-i].y = t1;
}
/********************End*********************/
}
void Show(SeqList L)
{
for(int i = 0; i < L.length; i ++)
cout << L.base[i].x << ' ' << L.base[i].y << endl;
}
int main()
{
SeqList L;
Init(L);
int n;
cin >> n;
Create(L, n);
Inverse(L);
Show(L);
return 0;
}
第2关:互换顺序表的元素
任务描述
本关任务:已知在一维数组A[m+n]
中依次存放两个线性表(a1,a2,⋯,am)
和(b1,b2,⋯,bn)
。编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,⋯,bn)
放在(a1,a2,⋯,am)
的前面。
相关知识
为了完成本关任务,你需要掌握:1.顺序表的创建 2.顺序表的遍历 3. 顺序表的逆置。
编程要求
根据提示,在右侧编辑器“Begin”和 “End”之间补充代码。
测试说明
输入输出说明: 输入包含三行,第一行为元素个数m,n
,第二行为(a1,a2,⋯,am)
,第三行为(b1,b2,⋯,bn)
。 输出包含一行为互换后的线性表。
#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct{
int length;
int *base;
}SeqList;
Status Init(SeqList &L)
{
L.base = new int[MAXSIZE];
if(!L.base) return ERROR;
L.length = 0;
return OK;
}
Status Create(SeqList &L, int n)
{
for(int i = 0; i < n; i ++)
cin >> L.base[i];
L.length = n;
return OK;
}
/********************Begin*******************/
void Exchange(int A[], int m, int n)
{
for(int i=0; i<(n+m)/2; i++)
{
int t = A[i];
A[i] = A[n+m-1-i];
A[n+m-1-i] = t;
}
for(int i = 0; i<n/2; i++)
{
int t = A[i];
A[i] = A[n-1-i];
A[n-1-i] = t;
}
int k =0;
for(int j = n; j<(n+m/2); j++)
{
int t = A[j];
A[j] = A[m+n-1-k];
A[m+n-1-k] = t;
k++;
}
}
/*******************End*********************/
void Show(SeqList L)
{
for(int i = 0; i < L.length; i ++)
cout << L.base[i] << ' ';
cout << endl;
}
int main()
{
SeqList L1, L2;
Init(L1);
Init(L2);
int n, m;
cin >> n >> m;
Create(L1, n);
Create(L2, m);
int *A = new int[n + m];
for(int i = 0; i < n; i ++)
A[i] = L1.base[i];
for(int j = 0; j < m; j ++)
A[n + j] = L2.base[j];
Exchange(A, n, m);
for(int i = 0; i < n + m; i ++)
cout << A[i] << ' ';
cout << endl;
return 0;
}
第3关:顺序表循环左移
任务描述
[2010统考真题] 本关任务:设将n(n>1)
个整数存放到一维数组R
中。设计一个在时间和空间两方面都尽可能高效的算法,将R
中保存的序列循环左移p(0<p<n)
个位置,即将R
中的数据由(x0,x1,⋯,xn−1)
和(xp,xp+1,⋯,xn−1,x0,x1,⋯,xp−1)
。
相关知识
为了完成本关任务,你需要掌握:1.顺序表的创建 2.顺序表的遍历 3. 顺序表的逆置。
编程要求
根据提示,在右侧编辑器“Begin”和 “End”之间补充代码。
测试说明
输入输出说明: 输入包含三行,第一行为元素个数n
,第二行为n
个元素,第三行为p
。 输出包含一行为变换后的线性表。
#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct{
int length;
int *base;
}SeqList;
Status Init(SeqList &L)
{
L.base = new int[MAXSIZE];
if(!L.base) return ERROR;
L.length = 0;
return OK;
}
Status Create(SeqList &L, int n)
{
for(int i = 0; i < n; i ++)
cin >> L.base[i];
L.length = n;
return OK;
}
/****************Begin*******************/
void Converse(int A[],int long1 , int p){
int B[long1]={0};
for(int i = 0; i<long1; i++){
B[i] = A[i];
}
for(int j = 0; j<long1; j++){
int c = (long1-p+j)%long1;
B[c] = A[j];
}
for(int i = 0; i<long1; i++){
A[i] = B[i];
}
}
/***************End**********************/
void Show(SeqList L)
{
for(int i = 0; i < L.length; i ++)
cout << L.base[i] << ' ';
cout << endl;
}
int main()
{
SeqList R;
Init(R);
int n;
cin >> n;
Create(R, n);
int p;
cin >> p;
Converse(R.base, R.length, p);
Show(R);
return 0;
}
第4关:顺序表合并-有序表
任务描述
本关任务:将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
相关知识
为了完成本关任务,你需要掌握:1.顺序表的创建 2.顺序表的遍历 3. 顺序表的合并。
编程要求
根据提示,在右侧编辑器“Begin”和 “End”之间补充代码。
测试说明
输入输出说明: 输入包含三行,第一行为元素个数m,n
,第二行为(a1,a2,⋯,am)
,第三行为(b1,b2,⋯,bn)
。 输出包含一行为合并后的线性表
#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct{
int length;
int *base;
}SeqList;
Status Init(SeqList &L)
{
L.base = new int[MAXSIZE];
if(!L.base) return ERROR;
L.length = 0;
return OK;
}
Status Create(SeqList &L, int n)
{
for(int i = 0; i < n; i ++)
cin >> L.base[i];
L.length = n;
return OK;
}
bool Merge(SeqList A, SeqList B, SeqList &C)
{
/********************Begin********************/
int i = 0, j = 0, k = 0;
while(i<A.length&&j<B.length){
if(A.base[i]>B.base[j]){
C.base[k] = B.base[j];
j++;
}
else {
C.base[k] = A.base[i];
i++;
}
C.length++;
k++;
}
if(i==A.length) {
for( j;j<B.length;j++ ){
C.base[k] = B.base[j];
k++;
C.length++;
}
}
else {
for(i; i<A.length; i++){
C.base[k] = A.base[i];
k++;
C.length++;
}
}
return 1;
/********************End*******************/
}
void Show(SeqList L)
{
for(int i = 0; i < L.length; i ++)
cout << L.base[i] << ' ';
cout << endl;
}
int main()
{
SeqList L1, L2, L3;
Init(L1);
Init(L2);
Init(L3);
int n1, n2;
cin >> n1 >> n2;
Create(L1, n1);
Create(L2, n2);
int flag = Merge(L1, L2, L3);
if(flag) Show(L3);
else cout << "Data Error" << endl;
return 0;
}