实现两个单链表的合并并排序
思想很简单,我的思想不一定官方(没考虑时间复杂度以及代码的简易)
思想:先把一个单链表插入到另一个单链表然后在做排序
代码
#include <iostream>
#include <malloc.h>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkNode;
void InitList(LinkNode *&L)//单链表初始化
{
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
}
void CerateList(LinkNode*&L,ElemType a[],int n)//尾插法创建链表
{
LinkNode *s,*r;
r=L;
for(int i=0;i<n;i++)//创建链表的循环输入
{ cin>>a[i];//输入链表的元素
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=r->next;
r->next=s;
r=s;
}
r->next=NULL;//链表末尾指向空
}
void DispList(LinkNode *L,char X)//输出链表
{
cout<<X<<"的单链表为:";
LinkNode *p=L->next;
while(p!=NULL)//循环输出链表
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void def(LinkNode*&L,char X)//创建数组
{
int a[100],n;
cout<<"请输入单链表"<<X<<"长度:";
cin>>n;
cout<<"请输入单链表"<<X<<"的元素:";
CerateList(L,a,n);
}
void Link_sort(LinkNode *&L)//升序
{
LinkNode *q=L->next;
LinkNode *p=NULL;
ElemType x;
if(q==NULL)
return;
for(q=L->next;q->next!=NULL;q=q->next)
{
for(p=q->next;p!=NULL;p=p->next)
{
if(q->data>=p->data)
{
x=q->data;
q->data=p->data;
p->data=x;
}
}
}
}
void Union(LinkNode*&A,LinkNode*&B)//合并两个链表
{
LinkNode *p=B->next,*s;
while(p!=NULL)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=p->data;
s->next=A->next;
A->next=s;
p=p->next;
}
}
int main()
{
LinkNode *A,*B;
InitList(A);
InitList(B);
def(A,'A');
def(B,'B');
DispList(A,'A');
DispList(B,'B');
Union(A,B);
Link_sort(A);
DispList(A,'C');
return 0;
}
主要代码
合并
void Union(LinkNode*&A,LinkNode*&B)//合并两个链表
{
LinkNode *p=B->next,*s;
while(p!=NULL)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=p->data;
s->next=A->next;
A->next=s;
p=p->next;
}
}
升序
void Link_sort(LinkNode *&L)//升序
{
LinkNode *q=L->next;
LinkNode *p=NULL;
ElemType x;
if(q==NULL)
return;
for(q=L->next;q->next!=NULL;q=q->next)
{
for(p=q->next;p!=NULL;p=p->next)
{
if(q->data>=p->data)
{
x=q->data;
q->data=p->data;
p->data=x;
}
}
}
}
注意:此代码最后没有释放空间