顺序表应用4:元素位置互换之逆置算法
Problem Description
注意:先将顺序表元素调整为符合要求的内容后,再做输出,输出过程只能用一个循环语句实现,不能分成两个部分。
Input
之后输入n行,每行先输入整数len与整数m(分别代表本表的元素总数与前半表的元素个数),之后输入len个整数,代表对应顺序表的每个元素。
Output
Example Input
2 10 3 1 2 3 4 5 6 7 8 9 10 5 3 10 30 20 50 80
Example Output
4 5 6 7 8 9 10 1 2 3 50 80 10 30 20
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
#define LISTINCREASMENT 100 /*每次分配元素的个数*/
#define LISTSIZE 10 /*顺序存储的最大个数*/
#define OVERFLOW -1
#define OK 1
using namespace std;
typedef int ElemType;
typedef struct /*顺序表元素的的定义*/
{
ElemType * elem;
int length;
int listsize;
} Sqlist;
int SqInitial(Sqlist &L) /*初始化线性表*/
{
L.elem=(ElemType *) malloc (LISTSIZE*sizeof(ElemType));
if (! L.elem) exit(OVERFLOW); //存储分配失败
L.length=0;
L.listsize=LISTSIZE;
return OK;
}
int ListInsert(Sqlist &L,int i,ElemType e) /*插入元素*/
{
if(i<1|| i > L.length+1) exit(-1);
if(L.length>=L.listsize)
{
ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREASMENT)
*sizeof(ElemType));
if(!newbase) return OVERFLOW;// 当前存储空间已满
L.elem=newbase;
L.listsize+=LISTINCREASMENT; /*表的容量不足分配内存*/
}
ElemType * q=&(L.elem[i-1]);
ElemType * p;
for(p=&(L.elem[L.length-1]); p>=q; --p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
void ListDelete(Sqlist &L,int i,ElemType &e) //删除线性表中第i个位置上的元素
{
if(i<1||i>L.length) exit(-1);
else
{
e=L.elem[i-1];
for(;i<L.length;i++)
{
L.elem[i-1]=L.elem[i];
}
L.length--;
}
}
ElemType GetElem(Sqlist &L,int i)
{
if(i<1||i>L.length) exit(-1);
else
{
return L.elem[i-1];
}
}
void display(Sqlist &L)
{
int i;
for(i=0;i<L.length-1;i++)
{
cout<<L.elem[i]<<" ";
}
cout<<L.elem[i]<<endl;
}
void Retrograde(Sqlist &L,int m,int n) //逆置
{
int i,t,j;
//cout<<"m=="<<m<<" n=="<<n<<endl;
for(i=m,j=n;i<=j;i++,j--) //i指向首元素,j指向尾元素,通过i++,和j--向中心靠拢
{
//cout<<"L.elem[i]=="<<L.elem[i]<<" L.elem[n-i]=="<<L.elem[i]<<endl;
t = L.elem[i];
L.elem[i] = L.elem[j];
L.elem[j] = t;
}
}
int main()
{
Sqlist L;
int t =1 ,d,n,len,m;
cin>>n;
while(n--)
{
SqInitial(L);
//printf("构建长度为len的顺序表。\n");
cin>>len>>m;
for(t=1; t<=len; t++) /*构建长度为n的顺序表*/
{
//printf("Please input the %dth list elem:",t);
scanf("%d",&d);
ListInsert(L,t,d);
}
Retrograde(L,0,len-1);
Retrograde(L,len-m,len-1);
Retrograde(L,0,len-m-1);
display(L);
}
return 0;
}