14、试分别用顺序表和单链表作为存储结构,实现将线性表(ao,a1,···,an-1)就地逆置的操作,所谓“就地”,指辅助空间应为0(1)。
内容:用顺序表作为存储结构,实现将线性表(ao,a1,···,an-1)就地逆置的操作。
步骤:
1.算法分析
利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n/2个元素与第n+1-n/2个元素交换。
2.算法设计
ReverseList()算法实现就地逆置。
void ReverseList(SeqList*L){
int temp;
int i;
for(i=0;i<=L->length/2;i++){
temp=L->data[i];
L->data[i]=L->data[L->length-i];
L->data[L->length-i]=temp;
}
}
3.完整代码:
#include<stdio.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct{
int data[MAXSIZE];
int length;
}SeqList;
//创建空表
Status InitList(SeqList*L){
L->length=0;
return OK;
}
//输入顺序表
Status PustSeqList(SeqList* L){
int i;
printf("请输入顺序表长度:\n");
scanf("%d",&L->length);
printf("请输入元素:") ;
for(i=0;i<L->length;i++){
scanf("%d",&(L->data[i]));
}
return OK;
}
void ReverseList(SeqList*L){
int temp;
int i;
for(i=0;i<=L->length/2;i++){
temp=L->data[i];
L->data[i]=L->data[L->length-1-i];
L->data[L->length-1-i]=temp;
}
}
//遍历函数
Status ListTraverse(SeqList L){
int i;
for(i=0;i<L.length;i++)
printf("%d",L.data[i]);
printf("\n");
return OK;
}
int main(void){
SeqList L;
PustSeqList(&L);
ReverseList(&L);
printf("就地逆置后的顺序表为:");
ListTraverse(L);
getchar();
return 0;
}
5.运行结果