数据结构-归并链表方法二

/*
问题描述:A和B是两个单链表(带头结点) 
其中元素递增有序,设计一个算法,将A,B归并成一个按元素值非递减有序的链表C
C由A,B中的结点构成 
*/ 

#include<stdio.h>
#include<malloc.h>

typedef struct LNode{
    int data;
    struct LNode* next;
}LNode,*LinkList; 

//头插法构建单链表(输出时与创建顺序相反) 
void init1(LinkList &L){
    //一定要给L动态开辟空间,并且让 L->next = NULL;
    L = (LinkList)malloc(sizeof(LinkList));
    L->next = NULL;
    LinkList s;
    int x;
    scanf("%d",&x);
    while(x!=-1){
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);
    }
} 

//尾插法构建单链表
void  init2(LinkList &L){
    L = (LinkList)malloc(sizeof(LinkList));
    L->next = NULL;
    LinkList s,r;
    r = L;
    int x;
    scanf("%d",&x);
    while(x!=-1){
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = x;
        r->next = s;
        r = s;
        scanf("%d",&x);
    }
    s->next = NULL;
}

void merge(LinkList a,LinkList b,LinkList &c){
    LinkList p = a->next;
    LinkList q = b->next;
    LinkList r;
    c = a;
    c->next = NULL;
    free(b);
    r = c;
    while(p!=NULL&&q!=NULL){
        if(p->data<=q->data){
            r->next = p;
            p = p->next;
            r = r->next;
        }else{
            r->next = q;
            q = q->next;
            r = r->next;    
        }
    } 
    r->next = NULL;
    if(p!=NULL){
        r->next = p;
    }
    if(q!=NULL){
        r->next = q;
    }
}
 
//输出链表中的元素
void show(LinkList L){
    LinkList p = L->next; 
    while(p){
        printf("%d   ",p->data);
        p = p->next;
    }
} 

int main(){
    LinkList a,b,c; 
    printf("请输入链表a的元素:"); 
    init2(a);
    printf("\n"); 
    printf("请输入链表b的元素:"); 
    init2(b);
    printf("\n"); 
    merge(a,b,c);
    show(c);
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/nnyst/p/11121507.html