兩個有序鏈表序列的合併

習題2.5 兩個有序鏈表序列的合併   (15分)

本題要求實現一個函數,將兩個鏈表表示的遞增整數序列合併爲一個非遞減的整數序列。

函數接口定義:

List Merge( List L1, List L2 );

其中List結構定義如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存儲結點數據 */
    PtrToNode   Next; /* 指向下一個結點的指針 */
};
typedef PtrToNode List; /* 定義單鏈表類型 */

L1L2是給定的帶頭結點的單鏈表,其結點存儲的數據是遞增有序的;函數Merge要將L1L2合併爲一個非遞減的整數序列。應直接使用原序列中的結點,返回歸併後的鏈表頭指針。

裁判測試程序樣例:

#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>

#define N 20

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

List Read(); 
void Print( List L ); 

List Insert( List L, ElementType X );

List Merge( List L1, List L2 );

List ClearList(List L);
List CopyLink(List src, List dst);

int main()
{
    List L1, L2, L;
    L1 = Read();
	Print(L1);
    L2 = Read();
	Print(L2);
    L = Merge(L1, L2);
	L2 = ClearList(L2);
	L1 = ClearList(L1);
    Print(L);
    Print(L1);
    Print(L2);
    return 0;
}

List Read(){
	int a[N],i,n;
	List h,p,q;

	scanf("%d", &n);
	for(i=0;i<n;i++)
		a[i]=2*i+1;

/*	for(i=0;i<n;i++)
		printf("%d ", a[i]);
	printf("\n"); */

	h=(List)malloc(sizeof(struct Node));
	h->Next=NULL;

	p=q=h;
	for(i=0;i<n;i++){
		q=(List)malloc(sizeof(struct Node));
		q->Data=a[i];
		q->Next=NULL;
		p->Next=q;
		p=q;
	}
	p->Next=NULL;

	return h;
}
void Print( List L ){
	List p;
	
	p=L->Next;
	while(p){
		printf("%d ", p->Data);
		p=p->Next;
	}
	printf("\n");

}

List Insert( List L, ElementType X ){
	List h,p,q,s;

	h=L;
	q=h;
	p=q->Next;

	s= (List)malloc(sizeof(struct Node));
	s->Data=X;

	while(p->Data<X){
		q=p;
		p=p->Next;
		if(p->Next==NULL){
			p->Next=s;
			p->Next->Next=NULL;
			return h->Next;
		}
	}
	q->Next=s;
	s->Next=p;

	return h;
}


List Merge( List L1, List L2 ){
	List h1,p1,q1,s,h2,p2,q2;
	int i=0;

	h1=(List)malloc(sizeof(struct Node));
	h1->Next=NULL;
	h1 = CopyLink(L1, h1);

	//h1=L1;
	q1=h1;
	p1=q1->Next;

	h2=L2;
	q2=h2;
	p2=q2->Next;

	while(p2!=NULL){
		s= (List)malloc(sizeof(struct Node));
		s->Data=p2->Data;
		s->Next=NULL;
		//s=p2;
		while(p1->Data<s->Data){
			q1=p1;
			p1=p1->Next;
			if(p1->Next==NULL){
				q1=p1;
				p1->Next=s;
				goto flag;
			}
		}
		q1->Next = s;
		s->Next = p1;
flag:	
		if(p2->Next==NULL)
			return h1;
		p2=p2->Next;
		q1=h1;
		p1=q1->Next;	
	}

	return h1;
}

List ClearList(List L){
	List p,q;

	p=L->Next;
	while(p){
		q=p->Next;
		free(p);
		p=q;
	}
	L->Next=NULL;
	return L;
}


List CopyLink(List S, List D)
{
    if( NULL != S->Next)
    {
        List p, q, t;
        p = S;
        q = D;
        
        while( NULL != p->Next)
        {
            p = p->Next;
			
			t= (List)malloc(sizeof(struct Node));
			t->Data=p->Data;
			t->Next=NULL;
            q->Next = t;
            q = t;
        }
        q->Next = NULL;
    }

	return D;
}




發佈了94 篇原創文章 · 獲贊 80 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章