题目描述
顺序表的移位是循环移位,例如顺序表: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,与原数据对比
请编写程序实现顺序表的循环移位操作
输入
第1行输入n表示顺序表包含的·n个数据
第2行输入n个数据,数据是小于100的正整数
第3行输入移动方向和移动的位数,左移方向为0,右移方向为1
第4行输入移动方向和移动的位数,左移方向为0,右移方向为1
注意:移动操作是针对上一次移动后的结果进行的
输出
第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开
第二行输出第一次移位操作后,顺序表内的所有数据,数据之间用空格隔开
第三行输出第二次移位操作后,顺序表内的所有数据,数据之间用空格隔开
样例查看模式
正常显示查看格式
输入样例1 <-复制
输出样例1
语言: 编译选项
主题:
#include<iostream>
using namespace std;
class SeqList
{
private:
int size;
int* list;
public:
SeqList() {};
SeqList(int n, int* list)
{
this->list = new int[n];
this->size = n;
for (int i = 0; i < size; i++)
{
this->list[i] = list[i];
}
}
void move(int i, int num)
{
//左移方向为0,右移方向为1
num %= size;//得到实际要移动的距离
if (i == 0)
{
//左移相当于从第0位开始删除num个数
//删除
int* newone1 = new int[num];//接受被抛弃额的数组
for (int i = 0; i < num; i++)
{
newone1[i] = list[i];
}
//完成录取工作
for (int i = 0; i < size; i++)
{
list[i] = list[i + num];
}
//完成删除工作
int a = 0;
for (int i = size - num; i < size; i++)
{
list[i] = newone1[a];
a++;
}
}
else
{
//右移则是删除从size到size-num之间的数据
//本质上是增加
int* newone2 = new int[size - num];//接受被抛弃额的数组
int a = 0;
for (int i = size - num; i < size; i++)
{
newone2[a] = list[i];
a++;
}
for (int i = size - 1; i > size - num; i--)
{
list[i] = list[i - num];
}
//最先进的最先出
int b = 0;
for (int i = 0; i < num; i++)
{
list[i] = newone2[b];
b++;
}
}
this->list_display();
}
void list_display()
{
for (int i = 0; i < size; i++)
{
cout << list[i] << " ";
}
cout << endl;
}
};
int main()
{
int n;
cin >> n;
int* list = new int[n];
for (int i = 0; i < n; i++)
{
cin >> list[i];
}
SeqList s(n, list);
s.list_display();
int c, num;
cin >> c >> num;
s.move(c, num);
cin >> c >> num;
s.move(c, num);
return 0;
}
该文描述了一个编程问题,要求实现顺序表(数组)的循环移位功能,包括左移和右移操作。给定一个包含n个元素的顺序表,根据输入的方向(0表示左移,1表示右移)和位数,进行两次移位操作,并输出每次操作后的顺序表内容。示例代码中定义了一个SeqList类,实现了移动和显示顺序表的方法。
1093

被折叠的 条评论
为什么被折叠?



