數據結構習題——4單鏈表的歸併

time_limit

3000MS

memory_limit

10000KB

description

假設兩個按元素值非遞減有序排列的線性表A和B,均以單鏈表作爲存儲結構,試編寫程序,將A表和B表歸併成一個按元素值非遞增有序排列的線性表C,並要求利用原表(即A表和B表的)結點空間存放表C。

input

第一行輸入兩個正整數m,n(m,n<=100),用空格分開,表示線性表A和B中元素個數,其後兩行分別輸入單鏈表A和B。

output

輸出單鏈表C。

sample_input

5 5

1 3 7 12 16

2 6 7 13 20

sample_output

20 16 13 12 7 7 6 3 2 1

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;

typedef struct Node{
    ElemType a;
    struct Node *next;
}LNode,*Linklist;

Linklist listInit(int n)
{
    Linklist head,p,q;
    int i;
    head=(LNode *)malloc(sizeof(LNode));
    p=head;
    for(i=0;i<n;i++){
        q=(LNode *)malloc(sizeof(LNode));
        scanf("%d",&q->a);
        p->next=q;
		p=q;
    }
	q->next=NULL;
    return head;
}

void listdaozhi(Linklist head)
{
    int tdata;
    Linklist p ,q ,t;
    p=head->next;
    if(!p)return;
    q=p->next;
    if(!q)return;
    t=q->next;
    if(!t){
        tdata=p->a;
        p->a=q->a;
        q->a=tdata;
        return;
    }
    p->next=NULL;
    while(t!=NULL){
        q->next=p;
        head->next=q;

        p=q;
        q=t;
        t=t->next;
    }
    head->next=q;
    q->next=p;
}

void mergeList(Linklist la,Linklist lb,Linklist* lc)
{				//由於定義鏈表時不夠完善,導致要用二維指針
    Linklist pa,pb,pc,head;
    head=pc=la;
    pa=la->next;
    pb=lb->next;
    while(pa&&pb){
        if(pa->a>pb->a){
            pc->next=pa;
            pc=pc->next;
            pa=pa->next;
        }
        else{
            pc->next=pb;
            pc=pc->next;
            pb=pb->next;
        }
    }
    if(pa)  pc->next=pa;
    else pc->next=pb;
    *lc=head;
}

void listshow(Linklist head)
{
    int i=0;
    Linklist p;
    p=head->next;
    while(p!=NULL){
        if(i!=0)printf(" ");
        printf("%d",p->a);
        p=p->next;
        i++;
    }
    printf("\n");
}
int main()
{
    Linklist la,lb;
    Linklist *lc;
	int n,m;
	scanf("%d%d",&m,&n);

    la=listInit(m);
    lb=listInit(n);

    listdaozhi(la);
    listdaozhi(lb);

    lc=(Linklist *)malloc(sizeof(LNode));
    mergeList(la,lb,lc);

    listshow(*lc);

	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章