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

 

 

七、将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表

易忘点:合并以前需要先判断一下是否大于C的最大长度。

核心代码:

bool merge(Sqlist A,Sqlist B,Sqlist &C){
    if(A.length+B.length>MaxSize) return false;  //容易忘记 
    int i=0,j=0,k=0;
    while(i<=A.length-1&&j<=B.length-1){
        if(A.data[i]<=B.data[j]){
            C.data[k++]=A.data[i++];
        }
        else C.data[k++]=B.data[j++];
    }
    while(i<=A.length-1){
        C.data[k++]=A.data[i++];
    }
    while(j<=B.length-1){
        C.data[k++]=B.data[j++];
    }
    C.length=A.length+B.length;  //第一次居然写出了C.length=A.length+B.length-2;  真的很离谱。 
    //也可以写成C.length=k+1; 
    return true;
}

 

 

 

全部代码:

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

bool merge(Sqlist A,Sqlist B,Sqlist &C){
    if(A.length+B.length>MaxSize) return false;  //容易忘记 
    int i=0,j=0,k=0;
    while(i<=A.length-1&&j<=B.length-1){
        if(A.data[i]<=B.data[j]){
            C.data[k++]=A.data[i++];
        }
        else C.data[k++]=B.data[j++];
    }
    while(i<=A.length-1){
        C.data[k++]=A.data[i++];
    }
    while(j<=B.length-1){
        C.data[k++]=B.data[j++];
    }
    C.length=A.length+B.length;  //第一次居然写出了C.length=A.length+B.length-2;  真的很离谱。 
    //也可以写成C.length=k+1; 
    return true;
}


int main(){
    Sqlist A;
    Sqlist B;
    Sqlist C;
    InitList(A);
    InitList(B);
    InitList(C); 
    ListInsert(A,1,9);
    ListInsert(A,1,8);
    ListInsert(A,1,7);
    ListInsert(A,1,4);
    ListInsert(B,1,8);
    ListInsert(B,1,5);
    ListInsert(B,1,5);
    ListInsert(B,1,1);    
    ListInsert(B,1,1);    
    ListLoad(A);
    ListLoad(B);
    if(merge(A,B,C)) {
        printf("合并成功 ");
        ListLoad(C);
    }
    else printf("合并失败 "); 
} 

 

posted on 2018-06-02 18:51  TinyRick  阅读(616)  评论(0编辑  收藏  举报