实验题目:两个有序单链表的合并
实验要求:有两个有序的单链表La,Lb,合并到La单链表中,合并 后依然有序,相同的元素只保留一个
实验代码:
#include<iostream>
using namespace std;
#define OK 1
typedef int Status;
typedef int ElemType;
//定义单链表,
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void MergeList_L(LinkList &La,LinkList &Lb); //函数声明
//单链表的初始化
Status InitList_L(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
//尾插法创建单链表
void CreateList_L(LinkList L,int n)
{
int i;
LinkList p,r;
r=L;
cout<<"请依次输入该表的各个元素:";
for(i=0;i<n;i++)
{
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
//依次输出单链表中的各个元素(逗号隔开)
void Display(LinkList L)
{
int i=0;
LNode *p;
p=L->next;
while(p)
{
if(i)
cout<<",";
cout<<p->data;
p=p->next;
i=1;
}
}
void MergeList_L(LinkList &La,LinkList &Lb)
{
LNode *pa,*pb,*p,*q;
p=La;
pa=La->next,pb=Lb->next;
q=pb;
while(pa&&pb)
{
if(pa->data<pb->data)
{
p->next=pa;
p=p->next;
pa=pa->next;
}
else if(pa->data>pb->data)
{
Lb->next=pb->next;
pb->next=pa;
p->next=pb;
p=p->next;
pb=Lb->next;
}
else
{
p->next=pa;
p=p->next;
pa=pa->next;
Lb->next=pb->next;
pb=pb->next;
}
}
p->next=pa?pa:pb;
delete Lb;
}
int main(void)
{
LinkList La;
LinkList Lb;
int n;
if(InitList_L(La)==OK) cout<<"链表La初始化成功! "<<endl;
else cout<<"内存溢出,初始化失败!"<<endl;
// LinkList LA,LB,LC;
int num_a,num_b;
cout<<"请输入有序单链表La的个数:";
cin>>num_a;
InitList_L(La); //La表的创建
CreateList_L(La,num_a); //依次往单链表La里输入数据
if(InitList_L(Lb)==OK) cout<<" 链表Lb初始化成功! "<<endl;
else cout<<"内存溢出,初始化失败!"<<endl;
cout<<"请输入有序单链表Lb的个数:";
cin>>num_b;
InitList_L(Lb); //Lb表的创建
CreateList_L(Lb,num_b); //依次往单链表La里输入数据
MergeList_L(La,Lb); //将单链表La和Lb 合并到La中
cout<<"有序单链表La,Lb合并后的元素依次为:"<<endl;
Display(La); //输出合并后的单链表La
cout<<endl;
return 0;
}
实验测试结果:
实验总结:
删除一个指针要先用一个临时指针存储
我总结要多做一些指针的练习,掌握链表中的结点插入删除操作,不要乱用指针,链表最后要让指针指向空。
要有内容,遇到的哪类问题,总结哪些经验。有关实验过程中的感悟和体会等