数据结构习题——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;
}

猜你喜欢

转载自blog.csdn.net/qq_41858784/article/details/82180282