

我想问一下exchange函数中,如果前面元素个数大于后面len-m个元素,那互换的时候前面位置也放不开后面元素呀


对于你的问题,可能是题目描述不清晰带来的误解
exchange
原地逆置算法是一种常见的算法,用于将数组中的元素逆置,也就是把第一个元素和最后一个元素交换,把第二个元素和倒数第二个元素交换,以此类推,直到整个数组逆序。
用下面的例子说明如何通过三次逆置到达交换的目的
12345678
m为3
第一次逆置
321 45678
第二次逆置
321 87654
第三次逆置
45678123
原帖代码如下
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000005
typedef struct
{
int data[MAXSIZE];
int listSize;
} seqlist;
void init_list(seqlist *list, int len) // 初始化并创建顺序表
{
list->listSize = len;
for (int i = 0; i < list->listSize; i++)
{
scanf("%d", &list->data[i]);
}
}
void exchange(seqlist *list, int n, int m) // 逆置函数
{
int i, j;
for (i = n,j = m; i <= j; i++, j--)
{
int t = list->data[i];
list->data[i] = list->data[j];
list->data[j] = t;
}
}
int main()
{
int len;
seqlist* list;
int t;
list = (seqlist*)malloc(sizeof(seqlist));
scanf("%d", &len);
init_list(list, len);
scanf("%d", &t);
while(t--)
{
int m;
scanf("%d", &m);
// 注意数组下标
exchange(list, 0, m-1); // 逆置前m个
exchange(list, m, list->listSize-1); // 逆置后len-m个
exchange(list, 0, list->listSize-1); // 整体逆置
for (int i = 0; i < list->listSize; i++)
{
if (i == list->listSize-1)
{
printf("%d\n", list->data[i]);
}
else
{
printf("%d ", list->data[i]);
}
}
}
}