zoukankan      html  css  js  c++  java
  • 顺序表应用4:元素位置互换之逆置算法

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

    Time Limit: 10MS Memory Limit: 570KB

    Problem Description

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

    Input

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

    Output

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

    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;
    }

  • 相关阅读:
    隐式图回溯法之八皇后问题解答
    试用O(n)来实现求出一个无序数组的中位数
    C++学习第一弹: const 指针 引用答疑
    一道面试题的解答_骑士获得金币问题
    根据已知词表选出好词(直通车)
    python3.5爬虫完成笔趣阁小说的爬取
    关于_水木社区[日经题]_10只狗鉴别1000瓶中哪一瓶药有毒_的解答思路
    数据库想法整合,多表联立交互
    [网络推广]直通车学习
    3行实现模糊匹配
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/6444615.html
Copyright © 2011-2022 走看看