试设计一个算法,用尽可能少的辅助空间将顺序表中前 m 个元素和后 n 个元素进行互换,即将线性表(a1,a2,……am,b1,b2……bn)改变成(b1,b2……bn,a1,a2,……am)。假设函数invert(S,i,j)作用是将数组S中下标自i到j的元素逆置,请调用该函数完成该题算法。
void exchange ( SqList &A,int m )
{ // 本算法实现顺序表中前m个元素和后n个元素的互换
}
// 在exchange ( SqList &A,int m )中调用自定义函数invert(S,i,j) 最终实现顺序表中前 m 个元素和后 n 个元素进行互换
#include <stdio.h>
#define NUM 100
typedef int DT;
typedef struct {//线性表结构体
DT data[NUM];
int length;
}SeqList;
void InitList(SeqList& L) {//初始化函数
L.length = 0;
}
void Input(SeqList& L, DT number) {//输入数据函数
if (L.length == NUM)//判断合法性
{
printf("输入数据个数超过最大长度%d!\n", NUM);
return;
}
L.data[L.length++] = number;//输入数据 并让length自增
}
void Invert(SeqList& L, int i, int j) {//逆置函数 逆置下标从i到j的所有元素
if (i >= L.length || i < 0 || j >= L.length || j < 0 || i > j) {
printf("输入下标不合法!");
return;//判断合法性
}
int temp;
while (i < j) {
temp=L.data[i];
L.data[i] = L.data[j];
L.data[j] = temp;
i++;
j--;
}
}
void exchange(SeqList& L, int m) {//交换函数
if (m > L.length){
printf("前m项不能超过数组的最大长度!");
return;
}
Invert(L, 0, L.length - 1);//利用Invert函数实现交换
Invert(L, 0, L.length - m-1);
Invert(L, L.length - m , L.length - 1);
}
int main() {
SeqList L;
InitList(L);
int num, member, i,m;
printf("请输入您要插入顺序表的数的个数(不要超过%d个)\n", NUM);
scanf_s("%d", &num);
printf("请输入您要插入顺序表的%d个数\n", num);
for (i = 0; i < num; i++) {
scanf_s("%d,", &member);
Input(L, member);
}
printf("请输入您要后移的m个数\n");
scanf_s("%d,", &m);
exchange(L, m);
printf("交换后结果如下\n");
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
return 0;
}