数据结构实验报告 有序表合并
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验有序表合并姓名:窦晓磊班级:软件工程142
学号:********** 试验时间:2015.10.11
1.问题描述
把两个有序表归并为一个有序表。
2.数据结构设计
链表结点的结构为:
Typedef struct Node{
T data;
Node *next;
};
3.算法设计
(1)表的输入和输出。
设计一个输入输出函数Node *CreateList()。
Step1:设计指针。
Node *q, //工作指针,存储head
*Head, //头指针
*p; //工作指针,存储数据
int size, //用于存储有序表元素的个数
n; //元素的输入
Step2:利用指针进行输入。
q=Head=new Node; //建立头结点
利用循环输入
for(int i=1;i<=n;i++)
{
p=new Node; //建立结点
cin>>n; //输入元素
p->data=n; //将输入的元素赋值给链表
Head->next=p; //尾指针后移
Head=p; //指向下一个结点
Head=p;
}
Head->next=NULL; //设置尾指针
Head=q;
Step3:输出。
for(p=Head->next;p!=NULL;p=p->next)
cout<
Return Head; //返回Head所指的链表
(2)合并算法
1’初始化
Step1:设置工作指针pa、pb,分别指向两个有序表LA、LB的首元结点。
Node *pa,*pb; //工作指针pa,pb
pa=LA->next;pb=LB->next;
Step2:生成新表LC的头结点,工作指针pc指向LC。
Node *pc;
LC=pc;
2’只要pa和pb有所指,循环执行下列操作。
While(pa!=NULL&&pb!=NULL)
Step1:生成一新结点,链到LC表尾,pc指向它。
LC=new Node;
如果pa->data<=pb->data:pc->data=pa->data;pa后移。if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next; //指针后移
}
否则:pc->data=pb->data;pb后移。
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
Step2:如果pb空,把pa开始的结点依次复制到pc
if(pa!=NULL)
{
pc->next=pa;
}
Step3:如果pa空,把pb开始的结点依次复制到pc。while(pb!=NULL)
{
pc->next=pb;
}
4.运行与测试
(1)运行程序,A表输入11,22,33,44。B表输入1,13,17,39。
A表输入11,B表输入1,13,17,39。
A表输入11,22,33,44,B表输入1。A表输入11,22,33,44,B表为空
A表为空,B表输入1,13,17,39
A表为空,B表为空。
A表输入55,B表输入1 13 17 39
5.调试记录及收获。
1.在合并的函数里while后面少了{}导致程序在输出A表B表之后无法进行下去。
2.一开始输入输出函数在主函数里,发现太繁琐,所以把输入输出提取出来,做了一个新函数。
收获:程序可以用简洁的程序取代繁琐的程序。通过本次实验对链表的理解更加深刻。