本文共 2488 字,大约阅读时间需要 8 分钟。
02-线性结构1 两个有序链表序列的合并(15 分)
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。 函数接口定义: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#include 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 NULLList Merge( List L1, List L2 ) { List pa,pb,pc,L; L = (List)malloc(sizeof(struct Node)); pa=L1->Next; pb=L2->Next; pc = L; 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->Next = pa ? pa : pb; L1->Next = NULL; L2->Next = NULL; return L; }
附上一开始我的代码(只得了2分。。。):
List Merge( List L1, List L2 ){ List p1 = L1; List p2 = L2; List rear,front,temp; rear = (List)malloc(sizeof(struct Node)); front = rear; while(p1 && p2){ switch(Compare(p1->Data, p2->Data)){ case 1: attach(p2->Data,&rear); p2 = p2->Next; break; case -1: attach(p1->Data,&rear); p1=p1->Next; break; case 0: attach(p1->Data,&rear); p1 = p1->Next; p2 = p2->Next; break; } } for(;p1;p1->Next) attach(p1->Data,&rear); for(;p2;p2->Next) attach(p2->Data,&rear); rear->Next = NULL; temp = front; front = front->Next; free(temp); return front;}void attach(int a, List *pRear){ List p; p = (List)malloc(sizeof(struct Node)); p -> Data = a; p -> Next = NULL; (*pRear)->Next = p; *pRear = p; free(p);}int Compare(int a,int b){ if(a>b) return 1; if(a