歸並鏈表(簡單方法)


/*
問題描述: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,q,s,r;
    p = a->next;
    q = b->next;
    c = (LinkList)malloc(sizeof(LinkList));
    c->next = NULL;
    r = c;
    
    while(p!=NULL&&q!=NULL){
        s = (LinkList)malloc(sizeof(LinkList));
        if(p->data<q->data){
            s->data = p->data;
            printf("=========%d\n",s->data );
            r->next = s;
            r = s;
            //只動一個指針,切記 
            p = p->next;
        }else{
            s->data = q->data;
            printf("++++++++++%d\n",s->data );
            r->next = s;
            r = s;
            //只動一個指針,切記 
            q = q->next;
        }
    }
    if(p!=NULL){
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = p->data;
        r->next = s;
        r = s;
        //只動一個指針,切記 
        p = p->next;
    }else{
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = q->data;
        r->next = s;
        r = s;
        //只動一個指針,切記 
        q = q->next;
    }
    r->next=NULL;
}
 
//輸出鏈表中的元素
void show(LinkList L){
    LinkList p = L->next; 
    while(p){
        printf("%d   ",p->data);
        p = p->next;
    }
} 

int main(){
//    LinkList L;
////    //頭插法測試 
////    init1(L);
////    //尾插法插法測試 
////    init2(L);
//    
//    show(L);
    LinkList a,b,c; 
    printf("請輸入鏈表a的元素:"); 
    init2(a);
    printf("\n"); 
    printf("請輸入鏈表b的元素:"); 
    init2(b);
    printf("\n"); 
    merge(a,b,c);
    show(c);
    return 0;
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM