Java顺序表就地逆置_顺序表的就地逆置(带源码+解析)

问题说明

,即利用原表的存储空间将1,a2,a3,…,an) 逆置为 (an,…,a3,a2,a1),实现过程中要求只能使用一个元素的辅助空间。

实现思路

根据顺序表的长度不同,分为两种处理方式:

若顺序表为空表,或者长度仅为 1 ,根据常识判断,该顺序表即使进行逆置操作,最终结果还是其自身,所以为了提高效率,对于此类顺序表不做任何处理。

若顺序表的长度超过1 ,则需对顺序表进行就地逆置,实现过程为:设置两个变量 i 和 j ,分别初始化为顺序表的首元素和尾元素所在

代码实现

#include

#define MAXSIZE 100 //定义顺序表的最大长度

typedef int ElemType;//宏定义顺序表的数据类型

//定义顺序表

typedef struct{

ElemType data[MAXSIZE];

int length;//记录顺序表的长度

}SqList;

//创建顺序表的函数,其中 L 为外界声明的顺序表,n 为顺序表的长度

void Creat_SqList(SqList *L,int n){

int i;

L->length = n;

i = 0;

printf("input %d data:",n);

//往顺序表中输入 n 个数据

while(i < n){

scanf("%d",&L->data[i]);

i++;

}

}

//顺序表的就地逆置的实现函数,其中形参 L 为需要逆置的顺序表

void Reverse_SqList(SqList *L){

int i,j,n,t;

n = L->length;

//如果顺序表的长度为 0 或 1 ,由于逆置后还是自身,所以不需要进行逆置

if (n == 0 || n == 1){

return ;

}

//如果顺序表的长度大于2,则需要进行逆置,设置 i和 j 分别指向顺序表中第一个和最后一个数据

i = 0;

j = n-1;

//不断地交换 i 和 j 所指向的数据,直到 i>j 为止

while(i

//此时就用到的唯一一个辅助空间,用于数据之间的交换

t = L->data[i];

L->data[i] = L->data[j];

L->data[j] = t;

i++;

j--;

}

}

//顺序表的输出函数

void Print_SqList(SqList *L){

int i,n;

n = L->length;

i = 0;

printf("output %d data:",n);

while(i < n){

printf("%d ",L->data[i]);

i++;

}

}

int main(){

SqList L;//声明一个顺序表

int n;

printf("intput n: ");

scanf("%d",&n);

//根据 n 的值,对顺序表进行初始化,n值不能超过MAXSIZE的值

Creat_SqList(&L,n);

//将顺序表进行就地逆置

Reverse_SqList(&L);

//输出逆置后的顺序表

Print_SqList(&L);

return 0;

}

运行结果:

intput n: 4

input 4 data:3 2 1 4

output 4 data:4 1 2 3

代码分析:

5-8行:定义顺序表的结构体,获取数组长度,还可以使用 C 语言库中的函数。

10-20行:对声明的顺序表进行初始化

22-41行:实现顺序表的就地逆置函数

43-52行:顺序表的输出函数

53-65行:主函数,通过声明顺序表,然后调用顺序表的初始化函数、就地逆置函数以及输出函数,即可完整顺序表的就地逆置的功能。

提示:可根据实现需要,适当更改代码。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值