数据结构单链表操作实验报告.docx
《数据结构单链表操作实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构单链表操作实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构单链表操作实验报告
上机实验报告
课程名称:
数据结构A实验题目:
实验一单链表操作
专业班级:
学号:
姓名:
完成日期:
2017年10月11日成绩:
一.实验内容、目的和要求
1.实验内容
单链表的创建、合并和输出。
【扩展内容】以顺序表为存储结构实现类似的功能要求。
2.实验目的
1.熟悉用VisualC++进行程序设计的方法。
2.掌握单链表的创建、查找、插入和合并等运算
3.实验要求
本实验要求实现以下功能:
1.从键盘输入顺序任意的5个整数,按有序插入的要求生成第一个有序单链表,将该
链表输出显示。
2.再从键盘输入顺序任意的5个整数,按有序插入的要求生成第二个有序单链表,将该
链表输出显示。
3.将这两个有序单链表合并成一个有序单链表,要求使用两个单链表的原有空间进行合
并,将生成的有序单链表输出显示。
程序中使用的数据结构及符号说明
表示结点类
表示单链表类
表示构造函数
表示析构函数
表示排序函数
表示输入函数
表示输出函数
表示返回头结点
表示合并链表
classNode
classLinkList
LinkList();
~LinkList();
voidSort();
voidInput();
voidOutput();
Node*Gethead();
voidadd(LinkList&d);
主流程图
输入函数流程图
输出函数流程图
合并函数流程图
.程序主要模块的功能说明
1)输入函数voidInput();
Node*p=Gethead();
for(inti=1;i<=5;i++)
p->next=newNode;
p=p->next;
cin>>p->date;
cout<}
先将头节点赋值给p,然后进入for循环,依次执行定义一个新的节点,newNode将它
赋值给p结点指针指向的下一个结点p->next,再将p结点指针指向的下一个结点p->next
赋值给p结点。
然后依次输入,结点指针的数据。
进而实现了将需要输入的数据存储到单
链表中。
(2)输出函数voidOutput();
{
cout<<"排序后的整数为"<Node*p=Gethead()->next;
while(p!
=NULL)
{
cout<date<<"";
p=p->next;
}
cout<}
将头结点指针指向的下一个结点赋值给p指针,进入while判断,当结点不为空的时候,cout
屏幕输出结点数据。
再将p指针指向的下一个结点赋值给p,直到退出while。
这个函数实
现了将数据输出到屏幕。
(3)排序函数voidSort();
{
Node*p1=Gethead()->next;
Node*p2=p1->next;
ints=0;
Node*p=p1;
for(inti=1;i<=4;i++)
{
p=p1;
p2=p1->next;
for(intj=1;j<=5-i;j++)
{
if(p->date>p2->date)
p=p2;
p2=p2->next;
}
s=p1->date;
p1->date=p->date;
p->date=s;
p1=p1->next;
}
首先设置两个指针p1,p2,其中p1指向链表头结点的下一个结点,p2指向p1的下一个结
点。
设置一个指针p,将p1的地址赋给p,比较p指针和p2指针所指向的值,若指针P所
指向的值大于指针p2所指向的值,则调换两者的值;若小于则进行下一轮比较,直到所有
数据都比完为止。
这个函数实现了将输入的数据进行排序。
(4)合并函数voidadd(LinkList&d)
{
Node*p1=Gethead()->next;
Node*p2=d.Gethead()->next;
Node*p,*q;
q=Gethead();while(p2!
=NULL){
if((p1==NULL)||(p2->date)<=(p1->date)){
p=newNode;
p->date=p2->date;
p->next=p1;q->next=p;q=p;
p2=p2->next;
}else
{
p1=p1->next;
q=q->next;
}
}
}
要将两个单链表中的数据合并,并按顺序从小到大输出。
在原有链表的空间,将两个单链表
中的数据依次进行插入操作。
五.程序运行时的初值和运行结果
【测试数据】
输入第一组整数:
2345117834
输出的有序单链表应为:
11,23,34,45,78
输入第二组整数:
9013456610
输出的有序单链表应为:
10,13,45,66,90
合并两个单链表,输出合并后的结果应为:
10,11,13,23,34,45,45,66,78,90
六.收获及体会
在这次的数据结构实验中,我尝试进行了单链表的创建、查找、插入和合并等运算,
将课堂中,课本里面学到的相关知识进行了实践,但是毕竟纸上得来终觉浅,在实验过程中
发现了知识的漏洞,而且发现了自己对于C++中的模板这一块的知识掌握不到位,甚至可以
说很欠缺,所以在这一次的实验中,我没有采用类模板,而是直接运用了类的相关知识,我
想我接下来应该在课下好好补一补模板的相关知识。
七.源程序
#includeusingnamespacestd;
classNode//定义结点类
{public:
intdate;
Node*next;
Node();
~Node();
};Node:
:
Node()
{next=NULL;
}Node:
:
~Node()
{}
classLinkList//定义链表类
{public:
LinkList();//构造函数
~LinkList();//析构函数
voidInput();//输入函数
voidOutput();//输出函数
voidSort();//排序函数
Node*Gethead();//返回头结点
voidadd(LinkList&d);//合并链表
private:
Node*head;
};
LinkList:
:
~LinkList()
{}
voidLinkList:
:
Input()//输入函数
{
cout<<"请输入五个整数"<Node*p=Gethead();
for(inti=1;i<=5;i++){
p->next=newNode;
p=p->next;
cin>>p->date;
Node*p=Gethead()->next;while(p!
=NULL)
{
cout<date<<"";
p=p->next;
}
cout<}
voidLinkList:
:
Sort()//排序函数
{
Node*p1=Gethead()->next;
Node*p2=p1->next;
ints=0;
Node*p=p1;
for(inti=1;i<=4;i++){
p=p1;
p2=p1->next;
for(intj=1;j<=5-i;j++){
if(p->date>p2->date)
p=p2;
p2=p2->next;
Node*LinkList:
:
Gethead()
returnhead;
}
voidLinkList:
:
add(LinkList&d)//合并函数
{
Node*p1=Gethead()->next;
Node*p2=d.Gethead()->next;
Node*p,*q;
q=Gethead();
while(p2!
=NULL){
if((p1==NULL)||(p2->date)<=(p1->date)){
p=newNode;
p->date=p2->date;
p->next=p1;
q->next=p;
q=p;
p2=p2->next;
}else{
p1=p1->next;
q=q->next;}}
}
voidmain()
{
LinkLista,b;
a.Input();
a.Output();
b.Input();
b.Output();
a.add(b);
a.Output();