本题通过三次逆置实现数组循环左移,当然同样通过三次逆置可以实现数组循环右移,请读者自行体会,左移右移代码入下。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define max_size 100
typedef struct SqList {
ElemType data[max_size];
int length;
}SqList;
void initial(SqList& L) {
int len = 0;
scanf("%d", &len);
L.length = len;
for (int i = 0; i < L.length; i++) {
scanf("%d", &L.data[i]);
}
}
void printSqList(SqList L) {
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
}
//数据交换
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
//数组元素逆置
void reverse(ElemType* arr, int low, int high) {
while (low < high) {
swap(arr[low++], arr[high--]);
}
}
//修正r到合理范围(0<=r<=len)
int fix(int len,int r) {
if (r >= 0 && r <= len) {
return r;
}
return fix(len, r - len);
}
//循环左移
void ROL(SqList& L, int r) {
r = fix(L.length, r);
reverse(L.data, 0, L.length - 1);//逆置L
reverse(L.data, 0, L.length - 1 - r);//逆置前n-r个元素
reverse(L.data, L.length - r, L.length - 1);//逆置后r个元素
}
//循环右移
void LOL(SqList& L, int r) {
r = fix(L.length, r);
reverse(L.data, 0, L.length - 1);//逆置L
reverse(L.data, 0, r-1);//逆置前r个元素
reverse(L.data, r, L.length - 1);//逆置后n-r个元素
}
int main() {
SqList L;
//输入数据初始化
int r;//数组左移位数
scanf("%d", &r);
initial(L);
//循环左移
ROL(L, r);
//循环右移
//LOL(L, r);
//输出有序链表
printSqList(L);
return 0;
}