1. 程式人生 > >兩個有序連結串列序列的合併 (20 分)

兩個有序連結串列序列的合併 (20 分)

7-90 兩個有序連結串列序列的合併 (20 分)

已知兩個非降序連結串列序列S1與S2,設計函式構造出S1與S2合併後的新的非降序連結串列S3。

輸入格式:

輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用−1表示序列的結尾(−1不屬於這個序列)。數字用空格間隔。

輸出格式:

在一行中輸出合併後新的非降序連結串列,數字間用空格分開,結尾不能有多餘空格;若新連結串列為空,輸出NULL

輸入樣例:

1 3 5 -1
2 4 6 8 10 -1

輸出樣例:

1 2 3 4 5 6 8 10

答案:

單鏈表實現

#include<iostream>
#include <bits/stdc++.h>

#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int Elemtype;
typedef int Status;

typedef struct LNode
{
    Elemtype data;
    struct LNode *next;
} LNode,*LinkList;

Status List_Create(LinkList &CL)
{
    LinkList rear;
    CL = (LinkList)malloc(sizeof(LNode));
    if(!CL)
        exit(OVERFLOW);
    CL->next = NULL;
    rear = CL;// //初始時頭結點為尾節點,rear指向尾巴節點
    //rear->next = NULL;
    int t;
    while(scanf("%d",&t))
    {
        if(t!=-1)
        {
            LinkList p = (LinkList)malloc(sizeof(LNode));
            p->data = t;
            rear->next = p;
            rear = p;
        }
        else
            break;
    }
    rear->next = NULL;
    return 0;
}


Status List_Merge(LinkList &L1,LinkList &L2,LinkList &L3)
{
    LinkList pa = L1->next,pb = L2->next,pc;
    L3 = pc = L1;
    while(pa&&pb)
    {
        if(pa->data <= pb->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
        //pc = pc->next;
    }
    pc->next = pa?pa:pb;
    return OK;
}

void List_Print(LinkList &CL)
{
    LinkList p = CL->next;
    bool flag = true;
    if(!p)
        printf("NULL");
    else
    {
        while(p)
        {
            if(flag)
            {
                printf("%d",p->data);
                flag = false;
            }
            else
                printf(" %d",p->data);
            p = p->next;
        }
    }
}



int main()
{
    LinkList A,B,C;
    List_Create(A);
    List_Create(B);
    List_Merge(A,B,C);
    List_Print(C);
}