任务描述
编写顺序表的逆置操作函数。
相关知识
关于逆置,有一种非常暴力的解决方法,就是单独开辟一个同等大小的顺序表,然后新表从前往后遍历,同时原表从后往前遍历,依次赋值,最后得到的就是逆置后的顺序表。但这种方法的空间复杂度为O(n),所以并不能这么做。
顺序表的就地逆置,只需让顺序表中的数据元素头尾依次交换即可,即交换第一个元素和最后一个元素,第二个和倒数第二个,依此类推,这种方法的空间复杂度为O(1)。
编程要求
根据提示,在编辑器 Begin-End 区间补充代码,完成顺序表的逆置操作函数的定义:
void Reverse(SqList *&L); //将顺序表就地逆置
测试说明
将对编写的代码进行如下测试:
代码文件
#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType elem[MaxSize];
int length;
} SqList;
/*****顺序表的基本操作*****/
int ListEmpty(SqList *L)
{
return(L->length==0);
}
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
int ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if (i<1 || i>L->length+1)
return 0;
i--; /*将顺序表位序转化为elem下标*/
for (j=L->length;j>i;j--) /*将elem[i]及后面元素后移一个位置*/
L->elem[j]=L->elem[j-1];
L->elem[i]=e;
L->length++; /*顺序表长度增1*/
return 1;
}
void DispList(SqList *L)
{
int i;
if (ListEmpty(L)) return;
for (i=0;i<L->length;i++)
printf("%d ",L->elem[i]);
printf("\n");
}
void Reverse(SqList *&L)
{
for(int i=0;i<L->length/2;i++){
int m=L->elem[i];
L->elem[i]=L->elem[L->length-1-i];
L->elem[L->length-1-i]=m;
}
}
int main() //main() function
{ // 调用对应的函数,完成顺序表的建立,然后进行逆置
/********** Begin **********/
SqList *L;
printf("(1)初始化顺序表L\n");
InitList(L);
printf("(2)输入顺序表的长度M:\n");
scanf("%d",&L->length);
printf("(3)依次插入M个元素\n");
for(int i=0;i<L->length;i++){
scanf("%d",&L->elem[i]);
}
printf("(4)输逆置前顺序表:\n");
DispList(L);
Reverse(L);
printf("(5)逆置后顺序表:\n");
DispList(L);
/********** End **********/
}