作者 DS课程组
单位 浙江大学
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
8 3
1 2 3 4 5 6 7 8
输出样例:
4 5 6 7 8 1 2 3
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
leftreverse
函数的使用思路:
- 保存要移动的元素:将数组的前
m
个元素保存到一个临时数组中。 - 左移剩余元素:将数组中的剩余元素(从第
m
个元素开始)向左移动m
个位置。这可以通过将每个元素复制到它前面m
个位置的位置来实现。 - 将保存的元素放回数组:将临时数组中的元素放回原数组的末尾。
main 函数按照以下步骤执行:
- 初始化顺序表。
- 输入顺序表的最大容量和要左移的位数。
- 循环输入顺序表的元素。
- 对顺序表进行循环左移。
- 显示循环左移后的顺序表内容。
- 销毁顺序表并释放内存。
C程序如下:
#include<stdio.h>
#include<stdlib.h>
// 定义ElemType为int类型,用于表示顺序表中的元素类型
typedef int ElemType;
// 定义顺序表的结构体
typedef struct _SeqList {
ElemType* Data; // 指向数组元素的指针
int length; // 当前顺序表的长度
int size; // 顺序表的最大容量
} SeqList;
// 初始化顺序表
void InitList(SeqList* List, int n) {
List->Data = (ElemType*)malloc(n * sizeof(ElemType)); // 为顺序表分配内存
if (List->Data == NULL) {
printf("Memory allocation failed"); // 如果内存分配失败,打印错误信息
exit(EXIT_FAILURE); // 退出程序
}
List->length = 0; // 初始化顺序表长度为0
List->size = n; // 设置顺序表的最大容量为n
}
// 销毁顺序表,释放内存
void DestroyList(SeqList* List) {
free(List->Data); // 释放顺序表占用的内存
}
// 向顺序表添加元素
void AppendList(SeqList* List, int Elem) {
List->Data[List->length] = Elem; // 将元素放入顺序表的当前末尾位置
List->length++; // 顺序表长度加1
}
// 显示顺序表的内容
void DispList(SeqList* List) {
printf("%d", List->Data[0]); // 打印第一个元素
for (int i = 1; i < List->length; i++) {
printf(" %d", List->Data[i]); // 打印后续的元素,并在每个元素前加上空格
}
}
// 循环左移顺序表的函数(但当前实现有误)
void leftreverse(SeqList *list, int m) {
for (int i = 0; i < m; i++) {
int empt = list->Data[0]; // 取出第一个元素
for (int j = 0; j < list->length - 1; j++) {
list->Data[j] = list->Data[j + 1]; // 将后续元素前移
}
list->Data[list->length - 1] = empt; // 将取出的第一个元素放到末尾
}
}
int main() {
ElemType number; // 用于临时存储输入的元素
SeqList Nums; // 定义顺序表变量
int n; // 用于存储顺序表的最大容量
scanf("%d", &n); // 从输入读取顺序表的最大容量
InitList(&Nums, n); // 初始化顺序表
int move; // 用于存储需要循环左移的位数
scanf("%d", &move); // 从输入读取需要循环左移的位数
for (int i = 0; i < n; i++) {
scanf("%d", &number); // 从输入读取元素
AppendList(&Nums, number); // 将元素添加到顺序表中
}
leftreverse(&Nums, move); // 对顺序表进行循环左移
DispList(&Nums); // 显示循环左移后的顺序表内容
DestroyList(&Nums); // 销毁顺序表,释放内存
return 0;
}