单链表(排序,归并排序)

#include <bits/stdc++.h>
typedef int ElemType;
#define Status int
#define ERROR 0
#define OK 1
using namespace std;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
Status GetElem_L(LinkList L,int i,ElemType &e)
{
    LinkList p=L->next;
    int j=1;
    while(p&&j<i)
    {
        p=p->next;
        if(!p)
            return ERROR;
        j++;
    }
    e=p->data;
    return OK;

}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
    LinkList p=L;
    int j=0;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
        if(!p)return ERROR;
    }
    LinkList s=(LinkList)malloc(sizeof(LNode));
    s->next=p->next;p->next=s;
    s->data=e;
    return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
    LinkList p=L;
    int j=0;
    while(p&&j<i-1)
    {
        p=p->next;j++;
        if(!p) return ERROR;
    }
    LinkList q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
    return OK;
}
void mpsort(LinkList &LL)
{
    int a[1000],cnt=0;
    LinkList p=LL->next;
    while(p)
    {
        a[cnt++]=p->data;
        p=p->next;
    }
    sort(a,a+cnt);
    LinkList q=(LinkList)malloc(sizeof(LNode));
    q->next=NULL;
    for(int i=0;i<cnt;i++)
        ListInsert_L(q,i+1,a[i]);
    LL=q;
    //free(q);
}
void Mergelist(LinkList &La,LinkList &Lb,LinkList &Lc)
{
    LinkList pa,pb,pc;
    pa=La->next;
    pb=Lb->next;
    int cnt=1;
    while(pa&&pb)
    {
        if((pa->data)<=(pb->data))
        {
            ListInsert_L(Lc,cnt++,pa->data);
            pa=pa->next;
        }
        else
        {
            ListInsert_L(Lc,cnt++,pb->data);
            pb=pb->next;
        }
    }
    while(pa)
    {
        ListInsert_L(Lc,cnt++,pa->data);
        pa=pa->next;
    }
    while(pb)
    {
        ListInsert_L(Lc,cnt++,pb->data);
        pb=pb->next;
    }
}
int main()
{
    LinkList L=(LinkList)malloc(sizeof(LNode));
    LinkList L1=(LinkList)malloc(sizeof(LNode));
    LinkList L2=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    L1->next=NULL;
    L2->next=NULL;
    for(int i=1;i<8;i++)
        ListInsert_L(L,1,i);
    for(int i=5;i<13;i++)
        ListInsert_L(L1,1,i);
    mpsort(L);
    mpsort(L1);
    LinkList p=L->next;
    while(p)
    {
        cout<<p->data<<' ';
        p=p->next;
    }
    cout<<endl;
    p=L1->next;
    while(p)
    {
        cout<<p->data<<' ';
        p=p->next;
    }
    cout<<endl;
    Mergelist(L,L1,L2);
    p=L2->next;
    while(p)
    {
        cout<<p->data<<' ';
        p=p->next;
    }
    cout<<endl;
    return 0;
}
posted @ 2018-03-20 09:56  ffgcc  阅读(268)  评论(0编辑  收藏  举报