您的位置:首页 > 理论基础 > 数据结构算法

实现两个有序链表的合并

2016-03-28 23:31 561 查看
实现两个链表的合并

编译环境Vc 6.0

///////----------a.cpp

#include <iostream>

#include "a.h"

using namespace std;

void ListAdd(LinkList<int> *List1,LinkList<int> *List2,LinkList<int> *List3);

void Print(const int &c)

{
cout<<c<<" ";

}

int main()

{

    LinkList<int> List1;
LinkList<int> List2;
LinkList<int> List3;
int i=0,j=0;
int m,n;

    while(i<5)

    {
cin>>m;

        List1.Append(m);
i++;
}
while(j<5)

    {
cin>>n;

        List2.Append(n);
j++;
}

    /*List1.Traverse(Print);
List2.Traverse(Print);*/

ListAdd(&List1,&List2,&List3);   ////////----------函数调用,实参传的是链表的地址????
List3.Traverse(Print); 
return 0;

}

void ListAdd(LinkList<int> *List1,LinkList<int> *List2,LinkList<int> *List3)/////--------函数实现,虚参为指针,指向链表的首地址

{
////函数实现部分,定义三个LinkNode指针
LinkNode<int> *p=List1->head->next,*q=List2->head->next;
LinkNode<int> *s=List3->head;
while(p!=NULL&&q!=NULL)
{
if((p->data)<(q->data))
{
s->next=p;
s=p;
p=p->next;
}
else
{
s->next=q;
s=q;
q=q->next;
}
} //////----------两个有序链表的合并部分
if(p)
{
s->next=p;
}
if(q)
{
s->next=q;
} ///////-----------如果上面的while部分结束,还有链表元素剩余,可以直接剩下的元素

}

template <class ElemType>

struct LinkNode

{

    ElemType data;

    LinkNode<ElemType> *next;

};

///////////----------a.h

template <class ElemType>

class LinkList

{

//类成员都为公有,便于类体外函数的访问

public :

    int len;

    LinkNode<ElemType> *head;

    LinkNode<ElemType> *tail;

    LinkList();

    bool Append(ElemType &e);

    void Traverse(void (*visit)(const ElemType &e)) const;  ////------注意此遍历函数

//void ListAdd(LinkList<ElemType> *List1,LinkList<ElemType> *List2,LinkList<ElemType> *List3);

};

template <class ElemType>

LinkList<ElemType>::LinkList()

{

    len=0;

    head=tail=new LinkNode<ElemType>;

    head->next=NULL;

}

template <class ElemType>

bool LinkList<ElemType>::Append(ElemType &e)

{

    LinkNode<ElemType> *q;

    q=new LinkNode<ElemType>;

    q->data=e;

    tail->next=q;

    tail=q;

    tail->next=NULL;

    len++;

    return true;

}

template <class ElemType>

void LinkList<ElemType>::Traverse(void (*visit)(const ElemType &e)) const

{
LinkNode<ElemType> *p=head->next;
while(p)
{
visit(p->data);
p=p->next;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息