Description
顺序表的移位是循环移位,例如顺序表:
1
,
2
,
3
,
4
,
5
,
6
。如果左移
1
位,即原
来的头元素移动到末尾,其它元素向左移
1
位,变成
2
,
3
,
4
,
5
,
6
,
1
。同理,
如果右移
1
位,即原来的尾元素移动到头,其它元素向右移
1
位,变成
6
,
1
,
2
,
3
,
4
,
5
。以下是移位的多个例子:
原数据:
1
,
2
,
3
,
4
,
5
,
6
左移
3
位:
4
,
5
,
6
,
1
,
2
,
3
,与原数据对比
右移
4
位:
3
,
4
,
5
,
6
,
1
,
2
,与原数据对比
请编写程序实现顺序表的循环移位操作
Input
第
1
行输入
n
表示顺序表包含的
n
个数据
第
2
行输入
n
个数据,数据是小于
100
的正整数
第
3
行输入移动方向和移动的位数,左移方向为
0
,右移方向为
1
第
4
行输入移动方向和移动的位数,左移方向为
0
,右移方向为
1
注意:移动操作是针对上一次移动后的结果进行的
Output
第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开
第二行输出第一次移位操作后,顺序表内的所有数据,数据之间用空格隔开
第三行输出第二次移位操作后,顺序表内的所有数据,数据之间用空格隔开
Sample Input
511 22 33 44 550 21 4
Sample Output
11 22 33 44 5533 44 55 11 2244 55 11 22 33
思路:
在move函数里,用dir参数(0和1)区分向左移还是向右移,step表示移动位数。
左移:用变量t保存第一个数据,然后while中循环一次,就将第一个数后的数据都左移一位,再将t赋值给顺序表最后一位。
右移:先将顺序表整体位移step位,然后将超出顺序表的数据移动到前面空缺的位置。
AC代码:
#include<iostream>
using namespace std;
#define ok 0
#define error -1
class SeqList {
private:
int* list;
int maxsize;
int size;
public:
SeqList() {
maxsize = 1000;
size = 0;
list = new int[maxsize];
}
~SeqList() {
delete[]list;
}
void set(int length) {
this->size = length;
for (int i = 0; i < length; i++) {
cin >> *(list + i);
}//初始化数组
list_display();
}
void list_display() {
for (int i = 0; i < size; i++) {
cout << list[i];
if (i != size - 1) {
cout << " ";
}
}
cout << endl;
}
void list_display2() {
for (int i = 0; i < size; i++) {
cout << list[i];
if (i != size - 1) {
cout << " ";
}
}
}
void move(int dir, int step) {
if (dir == 0) {
while (step--) {
int t = 0;
t = *(list);
for (int i = 1; i < size; i++) {
*(list + i - 1) = *(list + i);
}
*(list + size - 1) = t;
}
}
else {
for (int i = size; i >= 0; i--) {
*(list + i + step) = *(list + i);
}
for (int i = 0; i < step; i++) {
*(list + i) = *(list + i + size);
}
}
}
};
int main() {
int t;
cin >> t;
SeqList p;
p.set(t);
int d, s;
cin >> d >> s;
p.move(d, s);
p.list_display();
cin >> d >> s;
p.move(d, s);
p.list_display2();
}