采用单链表结构编程实现:两个有序单链表的归并运算。
#include <iostream>
#define ERROR 0
#define OK 1
#include <stdlib.h>
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
void CreatList(LinkList &L,int n)
{
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(int i=n; i>0; i--)
{
p=(LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
Status GetElem_L(LinkList &L,int i,ElemType &e)
{
LinkList p;
p=L;
int j=0;
while(p&&j<i)
{
p=p->next;
j++;
if(j==i)
break;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList p;
p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return ERROR;
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
void getLinkList(LinkList &L)
{
LinkList p;
p=L;
while(p->next)
{
p=p->next;
cout<<p->data<<" ";
}
cout<<endl;
}
void MergeList(LinkList L1, LinkList L2,LinkList &L3)
{
LinkList p1,p2;
p1=L1->next;
p2=L2->next;
int i=1;
while(p1&&p2)
{
if(p1->data<p2->data)
{
ListInsert_L(L3,i,p1->data);
p1=p1->next;
}
else
{
ListInsert_L(L3,i,p2->data);
p2=p2->next;
}
i++;
}
while(p1)
{
ListInsert_L(L3,i,p1->data);
p1=p1->next;
i++;
}
while(p2)
{
ListInsert_L(L3,i,p2->data);
p2=p2->next;
i++;
}
}
int main()
{
LinkList L1,L2;
cout<<"第一个有序链表长度:"<<endl;
int n1;
cin>>n1;
cout<<"逆序输入n个元素:"<<endl;
CreatList(L1,n1);
cout<<"第二个有序链表长度:"<<endl;
int n2;
cin>>n2;
cout<<"逆序输入n个元素:"<<endl;
CreatList(L2,n2);
LinkList L3;
L3=(LinkList)malloc(sizeof(LNode));
L3->next=NULL;
cout<<"归并后的有序列表:"<<endl;
MergeList(L1,L2,L3);
getLinkList(L3);
return 0;
}