兩個有序連結串列序列的合併 (20 分)
阿新 • • 發佈:2018-12-23
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); }