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

7-51 兩個有序連結串列序列的合併(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 <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
    ElemType Data; /* 儲存結點資料 */
    struct LNode *Next; /* 指向下一個結點的指標 */
}LNode, *LinkList; /* 定義單鏈表型別 */
LinkList Read(void);
LinkList Merge(LinkList La, LinkList Lb);
void Print(LinkList L);


int main()
{
    LinkList La, Lb, Lc;
    La =
Read(); Lb = Read(); Lc = Merge(La, Lb); Print(Lc); return 0; } LinkList Read(void){ /* 讀入連結串列元素,以-1位結束標誌*/ LinkList L,rear, temp; ElemType data; L = (LinkList)malloc(sizeof(LNode)); /* 連結串列頭空結點*/ L->Data = -1; L->Next = NULL; rear = L; scanf("%d", &
data); while(data!=-1){ temp = (LinkList)malloc(sizeof(LNode)); temp->Data = data; //printf("Write:%d\n", temp->Data); temp->Next = NULL; rear->Next = temp; rear = rear->Next; scanf("%d", &data); } return L; /* 返回帶頭空結點的連結串列 */ } LinkList Merge(LinkList La, LinkList Lb){ /* 輸入兩個有序連結串列的頭指標,返回合併後有序連結串列的頭指標*/ LinkList L, pa, pb, rear; L = (LinkList)malloc(sizeof(LNode)); L->Data = -1; L->Next = NULL; rear = L; /* 尾插法,rear初始指向頭結點*/ pa = La->Next; pb = Lb->Next; //printf("Start Merging...\n"); while(pa&&pb){ if(pa->Data < pb->Data){ rear->Next = pa; //printf("Get:%d\n", pa->Data); pa = pa->Next; } else{ rear->Next = pb; //printf("Get:%d\n", pb->Data); pb = pb->Next; } rear = rear->Next; } while(pa){ rear->Next = pa; //printf("Get:%d\n", pa->Data); pa = pa->Next; rear = rear->Next; } while(pb){ rear->Next = pb; //printf("Get:%d\n", pb->Data); pb = pb->Next; rear = rear->Next; } rear->Next = NULL; /* 不刪除原連結串列的頭結點*/ return L; } void Print(LinkList L){ LinkList p; int tag = 1; p = L->Next; while(p){ if(tag){ /* 第一個元素前面不帶空格*/ printf("%d", p->Data); tag = 0; p = p->Next; } else{ printf(" %d", p->Data); p = p->Next; } } if(tag){ printf("NULL"); } }