本节代码主要来自王道单科18页的综合应用题。

 

八、已知在一维数组A[m+n]中依次存放着两个线性表(a1,a2,a3,....am)和(b1,b2,b3,...bn)。试编写一个函数,将数组中 两个顺序表的位置互换,即将(b1,b2,b3,...bn)放在(a1,a2,a3,....am)前面。

 

要特别注意exchange里面的Reverse函数的顺序。分两种情况:

第一种:先逆置两边的元素,再逆置所有元素。

    Reverse1(A,0,m-1);    此时前面为线性表A,元素依然是m个
    Reverse1(A,m,m+n-1);
    Reverse1(A,0,m+n-1); 

第二种:先逆置所有元素,再逆置两边元素。

    

    Reverse1(A,0,m+n-1); 
    Reverse1(A,0,n-1);     经过逆置后前面为线性表B,元素是n个
    Reverse1(A,n,m+n-1);
    

 

 

核心代码:

void Reverse1(Sqlist &L,int left,int right){
    //自己写的代码 
    if(left>=right||right>=MaxSize) return ;//容易忘记 
    int i,j;
    ElemType temp;
    for(i=left,j=right;i<j;i++,j--){
        temp=L.data[i];
        L.data[i]=L.data[j];
        L.data[j]=temp;
    }
}

void exchange1(Sqlist &A,int m,int n){
    Reverse1(A,0,m-1);
    Reverse1(A,m,m+n-1);
    Reverse1(A,0,m+n-1); 
}
void Reverse2(Sqlist &L,int left,int right){
    //书上的代码 
    if(left>=right||right>=MaxSize)return;
    int mid=(left+right)/2;
    ElemType temp;
    for(int i=0;i<=mid-left;i++){
        temp=L.data[left+i];
        L.data[left+i]=L.data[right-i];
        L.data[right-i]=temp;
    } 
} 

void exchange2(Sqlist &A,int m,int n){
    Reverse2(A,0,m-1);
    Reverse2(A,m,m+n-1);
    Reverse2(A,0,m+n-1); 
}

 

全部代码:

#include<stdio.h>
#define true 1
#define false 0
#define MaxSize 100          
#define ElemType int
#define Status int 


typedef struct{
    ElemType data[MaxSize];        
    int length;           
}Sqlist;

//构造一个空的线性表L 
void InitList(Sqlist &L){
    L.length=0;
}


bool ListInsert(Sqlist &L,int i,ElemType e){ 
//将元素e插到顺序表L中第i个位置 
    if(i<1||i>L.length+1)
        return false;
    if(L.length>=MaxSize)
        return false;
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
    return true;
}

void ListLoad(Sqlist L){
    if(L.length==0){
        printf("当前顺序表为空\n");
        return;
    }
    printf("当前顺序表元素为:");
    for(int i=0;i<L.length;i++)
        printf("%d ",L.data[i]);
    printf("\n");
    return;
}

void Reverse1(Sqlist &L,int left,int right){
    //自己写的代码 
    if(left>=right||right>=MaxSize) return ;//容易忘记 
    int i,j;
    ElemType temp;
    for(i=left,j=right;i<j;i++,j--){
        temp=L.data[i];
        L.data[i]=L.data[j];
        L.data[j]=temp;
    }
}

void exchange1(Sqlist &A,int m,int n){
    Reverse1(A,m,m+n-1);
    Reverse1(A,0,m-1);
    Reverse1(A,0,m+n-1); 
}

void Reverse2(Sqlist &L,int left,int right){
    //书上的代码 
    if(left>=right||right>=MaxSize)return;
    int mid=(left+right)/2;
    ElemType temp;
    for(int i=0;i<=mid-left;i++){
        temp=L.data[left+i];
        L.data[left+i]=L.data[right-i];
        L.data[right-i]=temp;
    } 
} 

void exchange2(Sqlist &A,int m,int n){
    Reverse2(A,m,m+n-1); 
    Reverse2(A,0,m-1);
    Reverse2(A,0,m+n-1);
}


int main(){
    Sqlist T;
    InitList(T);
    ListInsert(T,1,9);
    ListInsert(T,1,8);
    ListInsert(T,1,7);
    ListInsert(T,1,7);
    ListInsert(T,1,5);
    ListInsert(T,1,5);
    ListInsert(T,1,5);
    ListInsert(T,1,1);    
    ListInsert(T,1,1);    
    ListLoad(T);
    exchange1(T,4,5);
    printf("我的代码转换结果 "); 
    ListLoad(T);
    exchange2(T,4,5);
    printf("书上的代码转换结果 "); 
    ListLoad(T);
} 

 

 

 

posted on 2018-06-02 19:55  TinyRick  阅读(377)  评论(0编辑  收藏  举报