数据结构与算法——有序链表合并

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mozha_666/article/details/79681210

要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

#include <stdio.h>
#include <stdlib.h>

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

/*
尾部插入结点 
*/ 
void Attach(ElementType x,List* rear){
    List temp;
    temp = (List)malloc(sizeof(struct Node));
    temp->Data = x;
    temp->Next = NULL;
    (*rear)->Next = temp;
    *rear = temp;
} 
/*
读入链表 
*/
List Read(){
    int n,x;
    List L,rear,temp;
    L = (List)malloc(sizeof(struct Node));
    L->Next = NULL;
    rear = L;
    //输入链表结点的个数 
    scanf("%d",&n);
    while(n--){
        scanf("%d",&x);
        Attach(x,&rear);    
    }
    return L;
}
/*
打印链表 
*/ 
void Print(List L){
    if(!L->Next){
        printf("NULL\n");
        return ;
    }
    List p = L->Next;
    while(p){
        printf("%d ",p->Data); 
        p = p->Next;
    }
    printf("\n");
} 
/*
比较数值大小 
*/ 
int Compare(int a,int b){
    if(a>b){
        return 1;
    }
    if(a<b){
        return -1;
    }
    if(a == b){
        return 0;
    }
}
/*
合并链表
*/
List Merge( List L1, List L2 ){
    List L,rear,temp,p1,p2;
    L = (List)malloc(sizeof(struct Node));
    L->Next = NULL;
    rear = L;
    p1 = L1->Next;
    p2 = L2->Next;
    while(p1 && p2){
        switch(Compare(p1->Data,p2->Data)){
            case 1:{
                rear->Next = p2;
                rear = p2;
                p2 = p2->Next;
                break;
            }
            case -1:{
                rear->Next = p1;
                rear = p1;
                p1 = p1->Next;
                break;
            }
            case 0:{
                rear->Next = p1;
                rear = p1;
                p1 = p1->Next;
                temp = p2;
                p2 = p2->Next;
                free(temp);
                break;
            }
            default:{
                break;
            }
        }
    } 
    if(p1){
        rear->Next = p1;
    }
    if(p2){
        rear->Next = p2;
    }
    L1->Next = NULL;
    L2->Next = NULL;
    return L;

} 

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

这里写图片描述
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/mozha_666/article/details/79681210
今日推荐