1. 程式人生 > >PTA-線性結構1 兩個有序連結串列序列的合併

PTA-線性結構1 兩個有序連結串列序列的合併

本題要求實現一個函式,將兩個連結串列表示的遞增整數序列合併為一個非遞減的整數序列。

函式介面定義:


List Merge( List L1, List L2 );
其中List結構定義如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 儲存結點資料 */
    PtrToNode   Next; /* 指向下一個結點的指標 */
};
typedef PtrToNode List; /* 定義單鏈表型別 */
L1和L2是給定的帶頭結點的單鏈表,其結點儲存的資料是遞增有序的;函式Merge要將L1和L2合併為一個非遞減的整數序列。應直接使用原序列中的結點,返回歸併後的連結串列頭指標。

裁判測試程式樣例:

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 細節在此不表 */
void Print( List L ); /* 細節在此不表;空連結串列將輸出NULL */

List Merge( List L1, List
L2 ); int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } /* 你的程式碼將被嵌在這裡 */

輸入樣例

3
1 3 5
5
2 4 6 8 10

輸出樣例:

1 2 3 4 5 6 8 10
NULL
NULL

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *
PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 細節在此不表 */ void Print( List L ); /* 細節在此不表;空連結串列將輸出NULL */ List Merge( List L1, List L2 ); int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } //初始化 List ListInit() { List PtrL; PtrL=(List)malloc(sizeof(struct Node)); //申請結點空間 if(PtrL==NULL){ printf("申請空間失敗"); //判斷是否有足夠的空間 } PtrL->Next=NULL; return PtrL; } //尾插法建立單鏈表(帶頭結點) List ListCreate(int n) { List head; head=ListInit(); //初始化一個空連結串列 List r; r = head; //r始終指向終端結點,開始時指向頭結點 while(n--){ int m; scanf("%d",&m); //讀入資料 List p; p=(List)malloc(sizeof(struct Node)); //申請新的結點空間 p->Data=m; //結點的資料域賦值 r->Next=p; //將結點插入到表頭head-->|1|-->|2|-->NULL r=p; } r->Next=NULL; return head; } //讀取資料 List Read() { int n; List Ptr; scanf("%d",&n); Ptr = ListCreate(n); return Ptr; } //輸出函式 void Print( List L ) { if(L->Next==NULL){ printf("NULL\n"); }else{ while(L->Next!=NULL) { List tmp = L->Next; if(tmp->Next==NULL) printf("%d\n",tmp->Data); else printf("%d ",tmp->Data); L = tmp; } } } List Merge( List L1, List L2 ) { List L3 = (List)malloc(sizeof(struct Node));//申請結點空間 L3->Next = NULL; //List L3 = ListInit(); List tail,tmp1,tmp2; tail = L3; //tail始終指向終端結點,開始時指向頭結點 tmp1 = L1->Next; //L1,L2都帶頭結點 tmp2 = L2->Next; while(tmp1&&tmp2) { if(tmp1->Data <= tmp2->Data){ //比較兩個單鏈表中結點資料域大小 tail->Next = tmp1; tail = tmp1; tmp1 = tmp1->Next; }else{ tail->Next = tmp2; tail = tmp2; tmp2 = tmp2->Next; } } tail->Next = tmp1 ? tmp1 : tmp2; //當tmp1不為空時,全接在tail後面,否則tmp2全接在tail後面 L1->Next = NULL; //L1,L2置空 L2->Next = NULL; return L3; }

上面是整個程式的實現,但是題目只要求提交Merge函式就好了。