您的位置:首页 > 编程语言 > C语言/C++

C/C++学习(八)两个有序链表归并为一个有序链表

2015-12-27 10:56 477 查看
假设头指针为La和Lb的单链表分别为线性表LA和LB的存储结构,现要归并La和Lb得到单链表Lc,接着C/C++学习(七)

#include <iostream>
using namespace std;



template<class T1>

class linklist

{

public:

linklist()

{

//p = new LNode;

//s = new LNode;

//q = new LNode;

L = new LNode;//申请节点空间

p = new LNode;

if(L == NULL)//判断是否有足够的空间

cout << "申请内存空间失败" <<endl;

L->next = NULL;//将next设置为空,初始化长度

flag = 0;


}

typedef struct LNode

{

T1 data;

struct LNode *next;


}LNode,*Linklist;//Linklist 指向节点的指针


//单链表的建立,头插法建立单链表

Linklist linklistCreatH()

{

while((cin >> data1) && (data1 != 0))//data1终止循环

{

    p = new LNode;//关键一步重新分配一个指针节点

p->data = data1;

p->next = L->next;

L->next = p;

}

return L;

}

//单链表的建立,头插法建立单链表

Linklist linklistCreatHLa()

{

La = new LNode;

if(La == NULL)//判断是否有足够的空间

cout << "申请内存空间失败" <<endl;

La->next = NULL;//将next设置为空,初始化长度

while((cin >> data1) && (data1 != 0))//data1终止循环

{

    p = new LNode;//关键一步重新分配一个指针节点

p->data = data1;

p->next = La->next;

La->next = p;

}

return L;

}

//单链表的建立,头插法建立单链表

Linklist linklistCreatHLb()

{

Lb = new LNode;

Lb = new LNode;

if(Lb == NULL)//判断是否有足够的空间

 cout << "申请内存空间失败" <<endl;

Lb->next = NULL;//将next设置为空,初始化长度

while((cin >> data1) && (data1 != 0))//data1终止循环

{

    p = new LNode;//关键一步重新分配一个指针节点

p->data = data1;

p->next = Lb->next;

Lb->next = p;

}

return Lb;

}

//单链表的建立,尾插法建立单链表

Linklist linklistCreatF()

{

LNode *r;

r = L;//r始终指向终端节点,开始时指向头结点

while((cin >> data1) && (data1) != 0)

   {

   p = new LNode;

p->data = data1;

r->next = p;//将节点插入到表头

r = p;

   }

r->next = NULL;

return L;

}

//获取链表元素

void GetElem_L(int i, T1 &e)

{//L带头结点的单链表指针,第i个元素存在时赋给e并返回OK,否则返回ERROR

p = L->next;//初始化,p指向第一个节点

j = 1;

while(p && j<i)

{


p = p->next;

++j;

}

if(!p || j>i)

{

cout << "error getelem!" << endl;

}

e = p->data;


}

//在链表中插入某值

Linklist ListInsert_L(int i, T1 e)

{

p = L;

j = 0;

while(p && j<i-1)

{

p = p->next;

++j;//寻找i-1节点

}

if(!p  || j>i)

{

cout << "error insert!" << endl;

    return L;

}

s = new LNode;

s->data = e;

s->next = p->next;//插入L

p->next = s;

return L;

}

//删除某值

Linklist ListDelete(int i, T1 &e)

{//删除第i个元素,并由e返回

p = L;

j = 0;

while(p->next && j<i-1)

{

p = p->next;

++j;

}

if(!(p->next) || j>i-1)

{

cout << "error delete!" << endl;

    return L;

}

q = new LNode;

q = p->next;

p->next = q->next;

e = q->data;

return L;

}

Linklist Mergelist()

{

Lc = new LNode;

/*重点分配内存,复制NULL值*/

if(Lc == NULL)//判断是否有足够的空间

cout << "申请内存空间失败" <<endl;

Lc->next = NULL;//将next设置为空,初始化长度

p = new LNode;

q = new LNode;

s = new LNode;

p = La->next;

q = Lb->next;

Lc = s = La ;

while(p&&q)

   {

if(p->data <= q->data)

   {

s->next = p;

s = p;

   p = p->next;

   }

else

   {

s->next = q;

s = q;

q = q->next;

//               if(q != NULL)

//   {

//                   cout << "." << endl;

//   }

   }


   }

s->next = p ? p : q;//插入剩余段

delete Lb;

return Lc;

}

void showdataMerge()

{

p = new LNode;

p = Lc->next;//指向头结点的下一个节点

while(p != NULL)

 {

cout << p->data << " ";

p = p->next;

 }

}

void showdata()

{

p = new LNode;

p = L->next;//指向头结点的下一个节点

while(p != NULL)

 {

cout << p->data << " ";

p = p->next;

 }

}

~linklist()

{

delete L;

delete p;

delete q;

delete s;

delete La;

 delete Lb;

}

private:

int j;

LNode *p;//

LNode *s;

LNode *q;

LNode *L;

LNode *La;

LNode *Lb;

LNode *Lc;

//    LNode *L1;

T1 data1;

T1 flag;

//    Linklist L1;

};

int main()

{

//    cout << "Hello World!" << endl;

//头插法

int data, data1;

linklist<int> *list = new linklist<int>;

cout << "(H)please enter numbers or chars or strings: " << endl;

list->linklistCreatH();

cout << "show linklist data:" << endl;

list->showdata();

cout << endl;


//尾插法

cout << "(F)please enter numbers or chars or strings: " << endl;

list->linklistCreatH();

cout << "show linklist data:" << endl;

list->showdata();

cout << endl;


//插入某值

cout << "after insert numbers or chars or strings " << endl;

list->ListInsert_L(3,10);

cout << "show linklist data:" << endl;

list->showdata();

cout << endl;


//查找某值

cout << "get numbers or chars or strings: " << endl;

list->GetElem_L(3,data);

cout << "input data: " << data << endl;

cout << endl;


//删除某值

cout << "delete numbers or chars or strings: " << endl;

list->ListDelete(4,data1);

cout << "delete data1: " << data1 << endl;

list->showdata();

cout << endl;


//两个有序链表归并为一个有序链表

cout << "(M-La)please enter numbers or chars or strings: " << endl;

list->linklistCreatHLa();



cout << "(M-Lb)please enter numbers or chars or strings: " << endl;

list->linklistCreatHLb();



list->Mergelist();

cout << "show linklist data:" << endl;

list->showdataMerge();

cout << endl;





return 0;

}


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