数据结构试验12文档格式.docx
《数据结构试验12文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构试验12文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
//析构函数
voidInsert(inti,Tx);
//在单链表中第i个位置插入元素值为x的结点
TDelete(inti);
//在单链表中删除第i个结点
intLocate(Tx);
//求单链表中值为x的元素序号
voidPrintList();
//遍历单链表,按序号依次输出各元素
private:
T>*first;
//单链表的头指针
};
再次,设计单链表类LinkList的构造函数和析构函数。
用头插法或尾插法建立单链表。
头插法建立单链表的算法如下:
头插法建立单链表
temlate<
LinkList:
:
LinkList(Ta[],intn)
{
first=newNode<
;
first->
next=NULL;
//初始化一个空链表
for(i=0;
i<
n;
i++)
{
s=newNode<
s->
data=a[i];
//为每个数组元素建立一个结点
next=first->
next;
//插入到头结点之后
next=s;
}
析构函数用于释放单链表中所有结点,算法如下:
单链表的析构函数算法~LinkList
template:
~LinkList()
p=first;
//工作指针P初始化
while(p)//释放单链表的每一个结点的存储空间
q=p;
//暂存被释放结点
p=p->
//工作指针P指向被释放结点,使单链表不断开
deleteq;
最后,对所建立的单链表设计插人、删除、查找等基本操作的算法。
(l)插人算法
单链表插人算法Insert
template<
voidLinkList:
Insert(inti,Tx)
j=0;
while(p&
&
j<
i-1)
{
p=p->
//工作指针P后移
j++;
if(!
p)throw“位置”;
else{
data=x;
//向内存申请一个结点s,其数据域为x
next=p->
//将节点s插入到结点p之后
p->
(2)删除算法
单链表的删除算法Delete
Template<
TLinkList:
Delete(inti)
p=first;
//工作指针p初始化
While(p&
i-1)//查找第i-1个结点
}
if(!
p||!
next)throw“位置”;
//结点p不存在或结点p的后继结点不存在
else{
q=p->
next;
x=q->
data;
//暂存被删结点
next=q->
//摘链
deleteq;
returnx;
(3)查找算法
单链表查找算法Locate
template<
intLinkList:
Locate(Tx)
p=first->
j=1;
while(p&
data!
=x)
//工作指针p后移
j++;
if(p)returnj;
elsereturn0;
4.实验程序
//以下为头函数,文件名为LinkList.h
#ifdefLinkList_H
#defineLinkList_H
template<classT>
structNode
Tdata;
Node<
T>
*next;
//此处<
也可以省略
};
classLinkList
Public:
LinkList(Ta[],intn);
~LinkList();
voidInsert(inti,Tx);
//在单链表中第i个位置播入元素为x的结点
TDelete(inti);
intLocate(Tx);
voidPrintList();
//遍历单链表,按序号依次输出各元素
private:
*first;
};
#endif
//以下为头函数LinkList.h中LinkList类的成员函数按规定定义,文件名为LinkList.cpp
#include"
LinkList.h"
LinkList<
*first;
first=newNode<
next=NULL;
for(inti=0;
n;
i++)
*s;
s=newNode<
;
data=a[i];
s->
//插入到头结点之后
next=s;
}
~LinkList()
T>*p,*q;
p=first;
q=p;
//工作指针P指向被释放结点的下一个结点,//使单链表不断开
}
voidLinkList<
*p;
intj;
p=first;
//工作指针p初始化
while(P&
P=P->
j++;
if(!
p)throw”位置”,
else{
*s;
s=newNode<
data=x;
//向内存申请一个结点:
,其数据域为x
next=p->
//结点s插人到结点p之后
P->
next=s;
TLinkList<
*p;
intj;
P=first;
j=0;
while(p“j<
I-1)//查找第i-1个结点
p=p->
j++;
P||!
P->
//结点P不存在或结点P的后继结点不存在
else{
*q;
intx;
q=p->
data;
next=q->
deleteq;
returnx;
intLinkList<
{
,p;
j=1;
if(p)returnj;
elsereturn0;
PrintList()
while(p)
cout<
<p->
data<
<endl;
p=p->
//以下为主函数
#include<
iostream.h>
//引用输入输出流库函数的头文件
usingnamespacestd;
#include”LinkList.cpp”//引用单链表类的声明和定义
voidmain()
intr[]={1,2,3,4,5};
LinkList<
int>
a(r,5);
<
”执行插人操作前数据为:
”<
endl;
a.PrintList();
//显示链表中所有元素
try
a.Insert(2,5);
catch(char*s)
<s<
cout<<”执行插人操作后数据为:
”<<endl;
//显示链表中所有元素
cout<<”值为5的元素位置为:
”;
a.Locate(5)<<endl;
//查找元素5,并返回在单链表中位置
cout<<”执行删除操作前数据为:
a.PrintList();
a.Delete
(1);
//删除元素4
”执行删除操作后数据为:
思考题:
为单链表的结点设计一个结点类,重新实现单链表基本操作的验证。
实 验 二二叉树操作验证
二叉树操作验证
1.实验目的
(1)掌握二叉树的逻辑结构
(2)掌握二叉树的二叉链表存储结构;
(3)掌握基于二叉链表存储的二叉树的遍历操作的实现。
2.实验内容
(1)建立一棵含有n个结点的二叉树,采用二叉链表存储;
(2)前序(或中序、后序)遍历该二叉树。
3.实现提示
二叉链表的结点结构如图所示。
lchild
data
rchild
图二叉树的结点结构
二叉链表的结点用C++中的结构类型描述为:
structBiNode
BiNode<
*lchild,*rchil