顺序表应用4:元素位置互换之逆置算法

题目描述

一个长度为len(1<=len<=1000000)的顺序表, 数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1<=m<=len),设计一个时间复杂度为O(N)、空间复杂度为O(1)的算法,改变原来的顺序表,把顺序表中原来在前的m个元素放到表的后段,后len-m个元素放到表的前段。
注意:先将顺序表元素调整为符合要求的内容后,再做输出,输出过程只能用一个循环语句实现,不能分成两个部分。

输入

  第一行输入整数n,代表下面有n行输入;
之后输入n行,每行先输入整数len与整数m(分别代表本表的元素总数与前半表的元素个数),之后输入len个整数,代表对应顺序表的每个元素。

输出

  输出有n行,为每个顺序表前m个元素与后(len-m)个元素交换后的结果

示例输入

2
10 3 1 2 3 4 5 6 7 8 9 10
5 3 10 30 20 50 80

示例输出

4 5 6 7 8 9 10 1 2 3
50 80 10 30 20


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define LISTINCREASMMENT 100        //定义一个最大初始内存100
#define LISTSIZE 10                 //每次增加内存空间10
#define OK 1
#define OVERFLOW -1

typedef int ElemType;               //将ElemType定义成int型

//顺序表的定义
typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
}Sqlist;                            //定义别名Sqlist

/*初始化表*/
int SqInitial(Sqlist &L)
{
    L.elem=(ElemType *)malloc(LISTINCREASMMENT*sizeof(ElemType));//分配存储空间
    if(!L.elem)exit(OVERFLOW);      //初始化失败则结束进程
    L.length=0;                     //初始化表长
    L.listsize=LISTINCREASMMENT;    //表容量空间
    return OK;
}

/*建立顺序表*/
int ListInsert(Sqlist &L,int i,ElemType e)
{
    if(i<1||i>L.length+1)
        printf("ERROR!");           //插入位置不合理
    if(L.length>=L.listsize)        //空间不足
    {
        ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREASMMENT)*sizeof(ElemType));//建�表
        if(!newbase)                //空间已满
            return OVERFLOW;        //返回溢出
        L.elem=newbase;             //表容量不足分配内存
        L.listsize=L.listsize+LISTSIZE;   //一次增加10内存以存储数据
    }
    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 purg(Sqlist &L,int l,int r)
{
    int i,t,j;
    for(i=l-1,j=r-1;i<(l+r)/2;i++)
    {
        t=L.elem[i];
        L.elem[i]=L.elem[j];
        L.elem[j]=t;
        j--;
    }
}
/*销毁表*/
void DestroyList(Sqlist &L)
{
    delete[]L.elem;
    L.listsize=0;
    L.length=0;
}

/*读表*/
void TraverseList(Sqlist &L)
{
    int i;
    for(i=1;i<=L.length;i++)
    {
        if(i==L.length)printf("%d\n",L.elem[i-1]);
        else printf("%d ",L.elem[i-1]);
    }
}
int main()
{
    Sqlist L;
    int i,d,n,t,j,m;
    scanf("%d",&t);
    for(j=1;j<=t;j++)
    {
        SqInitial(L);
        scanf("%d %d",&n,&m);                      //所建表的长度
        for(i=1;i<=n;i++)
        {
            scanf("%d",&d);
            ListInsert(L,i,d);                //插入元素进入表中
        }

        purg(L,1,n);
       // TraverseList(L);                              //
        purg(L,1,n-m);
        //TraverseList(L);
        purg(L,n-m+1,n);
        //printf("%d\n",L.length);                //读表长
        /*读表*/
        TraverseList(L);

        DestroyList(L);                         //表读完一次销毁
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值