【数据结构】链表的应用-两个有序单链表合并

例题2-7:请设计算法,将两个按值递增有序的单链表合并成一个按值递增有序的单链表

进行了:原地处理和异地处理

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define LElemType int
using namespace std;
typedef struct LNode{
    LElemType data;
    struct LNode *next;
    LNode ( LElemType Data=0, struct LNode *Next=NULL){
        data=Data;
        next=Next;
    }
}LNode,*LinkList;
void InitLinkList(LinkList &L){
    L=new LNode ;
}
void CreateLinkList_Tail(LinkList &L, int n=0){  //尾插法
    L=new LNode ;
    LinkList pre=L,tmp;
    LElemType Data;
    for (int i=0;i<n;i++){
        printf("请输入第%d个元素的data : \n",i+1);
        cin>>Data;
        tmp=new LNode (Data);
        pre->next=tmp;
        pre=tmp;
    }
}
void CreateLinkList_Head(LinkList &L, int n=0){ //头插法
    L=new LNode;
    LinkList Tail,tmp;
    LElemType Data;
    for(int i=0;i<n;i++){
        printf("请输入第%d个元素的data : \n",i+1);
        cin>>Data;
        tmp=new LNode(Data);
        tmp->next=L->next;
        L->next=tmp;
    }
}
int ListIsEmpty(LinkList &L){
    if(L->next){
        return 1;
    }
    return 0;
}
int ListLength(LinkList &L){
    int Len=0;
    LinkList p=L->next;
    while(p){
        //printf("%d\n",p->data);
        Len++;
        p=p->next;
    }
    return Len;
}
void OutputLinkList(LinkList &L){
    LinkList p=L->next;
    while(p){
        printf("%d%c",p->data,p->next==NULL?'\n':' ');
        p=p->next;
    }
}
void GetElem(LinkList L,int pos,LElemType &e){
    int i=1;
    LinkList p=L->next;
    while(p&&i<pos){
        i++;
        p=p->next;
    }
    if( i > pos || !p){
        printf(" \"GetElem\" pos is error\n");
        return ;
    }
    e=p->data;
}
LElemType LocateElem(LinkList L,LElemType e){
    int j=1;
    LinkList p=L->next;
    while(p&&p->data!=e){
        j++;
        p=p->next;
    }
    if(!p){
        printf("\" LocateElem \" not exist E : %d \n",e);
        return 0;
    }
    return j;
}
void ListInsert(LinkList &L,int i,LElemType e){
    int j=0;
    LinkList p=L,s;
    while(p&&j<i-1){
        j++;
        p=p->next;
    }
    if(!p||j>i-1){
        printf("\" ListInsert \"index : %d error!\n",i);
        return;
    }
    s=new LNode(e,p->next);
    p->next=s;
}
void ListDelete(LinkList &L, int i ,LElemType &e){
    int j=0;
    LinkList p=L,s;
    while(p->next&&j<i-1){
        j++;
        p=p->next;
    }
    if(!(p->next)||j>i-1){
        printf("\" ListDelete \" index: %d error!\n",i);
        return ;
    }
    s=p->next;
    e=s->data;
    p->next=s->next;
    delete s;
}
void Array_List(LinkList &L,int a[],int n){
    InitLinkList(L);
    LinkList p,Pre=L;
    for(int i=0;i<n;i++){
        p=new LNode(a[i]);
        Pre->next=p;
        Pre=p;
    }
}
void ListMerge_Diff(LinkList La,LinkList Lb,LinkList &Lc){ //异地处理
    InitLinkList(Lc);
    LinkList Pre=Lc,pa=La->next,pb=Lb->next,p;
    while(pa&&pb){
        p=new LNode( pa->data<=pb->data?pa->data:pb->data,NULL);
        Pre->next=p;
        Pre=p;
        pa->data<=pb->data?pa=pa->next:pb=pb->next;
    }
    while(pa){
        p=new LNode(pa->data,NULL);
        Pre->next=p;
        Pre=p;
        pa=pa->next;
    }
    while(pb){
        p=new LNode(pb->data,NULL);
        Pre->next=p;
        Pre=p;
        pb=pb->next;
    }
}
void ListMerge(LinkList La,LinkList Lb,LinkList &Lc){ //原地处理
    LinkList Pre=La;
    Lc=Pre;
    LinkList pa=La->next;
    LinkList pb=Lb->next;
    while(pa&&pb){
        if(pa->data<=pb->data){
            Pre->next=pa;Pre=pa;pa=pa->next;
        }else{
            Pre->next=pb;Pre=pb;pb=pb->next;
        }
    }
    Pre->next=(pa!=NULL?pa:pb);
    delete Lb;
}
int main()
{
    int a[]={1,3,5,7};
    int b[]={2,4,6,8};
    LinkList La,Lb,Lc;
    Array_List(La,a,4);
    Array_List(Lb,b,4);
    puts("La:");OutputLinkList(La);
    puts("Lb:");OutputLinkList(Lb);
    ListMerge_Diff(La,Lb,Lc);
    puts("La+Lb:(Diff)");OutputLinkList(Lc);

    ListMerge(La,Lb,Lc);
    puts("La+Lb:");OutputLinkList(Lc);
    return 0;
}

 

 

猜你喜欢

转载自blog.csdn.net/Z_sea/article/details/85086533