数据结构实验报告 有序表合并

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<data;

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.一开始输入输出函数在主函数里,发现太繁琐,所以把输入输出提取出来,做了一个新函数。

收获:程序可以用简洁的程序取代繁琐的程序。通过本次实验对链表的理解更加深刻。

相关文档
最新文档