7-51 兩個有序連結串列序列的合併(20 分)
阿新 • • 發佈:2019-02-04
題目:
已知兩個非降序連結串列序列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");
}
}