最新数据结构c++版实验参考书Word文档下载推荐.docx
《最新数据结构c++版实验参考书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新数据结构c++版实验参考书Word文档下载推荐.docx(62页珍藏版)》请在冰豆网上搜索。
1.明确实验的目的及要求;
2.记录实验的输入数据和输出结果;
3.说明实验中出现的问题和解决过程;
4.写出实验的体会和实验过程中没能解决的问题;
六、参考书目
《数据结构》(C++语言描述)王红梅等清华大学出版社
《DATASTRUCTUREWITHC++》WilliamFord,WilliamTopp
清华大学出版社(影印版)
实验一线性表的操作
实验类型:
验证性
实验要求:
必修
实验学时:
2学时
一、实验目的:
参照给定的线性表顺序表类和链表类的程序样例,验证给出的线性表的常见算法。
二、实验要求:
1、掌握线性表顺序表类和链表类的特点。
掌握线性表的常见算法。
2、提交实验报告,报告内容包括:
目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。
三、实验内容:
1.设计一个静态数组存储结构的顺序表类,要求编程实现如下任务:
建立一个线性表,首先依次输人数据元素1,2,3,…,10,然后删除数据元素6,最后依次显示当前线性表中的数据元素。
要求采用顺序表实现,假设该顺序表的数据元素个数在最坏情况下不会超过50个。
2.设计一个带头结点的单链表类,要求:
(1)生成一个整数线性表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(2)设计一个测试主函数,实际运行验证所设计单链表类的正确性。
3.设计一个不带头结点的单链表类,要求:
(1)不带头结点单链表类的成员函数包括取数据元素个数、插入元素、删除所有值为k的元素、取数据元素。
(提示:
要考虑在第一个数据元素结点前插入和删除第一个数据元素结点时与在其他位置插入和删除其他位置结点时的不同情况。
)
(2)设计一个测试主函数,实际运行验证所设计循环单链表类的正确性。
4.设计一个带头结点的循环单链表类,实现约瑟夫环问题;
问题描述:
设编号为1,2,…,n(n>
0)个人按顺时针方向围坐-圈,每人持有一个正整数密码。
开始时任意给出一个报数上限值m从第一个人开始顺时针方向自1起顺序报数。
报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数.如此下去,直到所有人全部出列为止。
要求设计一个程序模拟此过程,并给出出列人的编号序列。
测试数据:
n=7,7个人的密码依次为3,1,7,2,4,8,4
初始报数上限值m=20
*5.设计一个带头结点的循环双向链表类,要求:
(1)带头结点循环双向链表类的成员函数包括:
取数据元素个数、插入、删除、取数据元素。
(2)设计一个测试主函数,实际运行验证所设计循环双向链表类的正确性。
*6.设计一个单链表实现一元多项式求和问题。
要求:
(1)设计存储结构表示一元多项式;
(2)设计算法实现一元多项式相加。
四、程序样例
顺序表类定义:
将该类保存在文件SeqList.h中。
constintMaxSize=100;
//100只是示例性的数据,可根据实际问题具体定义
template<
classT>
//定义模板类SeqList
classSeqList
{
public:
SeqList(){length=0;
}//无参构造函数
SeqList(Ta[],intn);
//有参构造函数
~SeqList(){}//析构函数为空
intLength(){returnlength;
}//求线性表的长度
TGet(inti);
//按位查找,取线性表的第i个元素
intLocate(Tx);
//按值查找,求线性表中值为x的元素序号
voidInsert(inti,Tx);
//在线性表中第i个位置插入值为x的元素
TDelete(inti);
//删除线性表的第i个元素
voidPrintList();
//遍历线性表,按序号依次输出各元素
private:
Tdata[MaxSize];
//存放数据元素的数组
intlength;
//线性表的长度
};
SeqList:
:
SeqList(Ta[],intn)
if(n>
MaxSize)throw"
参数非法"
;
for(i=0;
i<
n;
i++)
data[i]=a[i];
length=n;
}
TSeqList:
Get(inti)
if(i<
1&
&
i>
length)throw"
查找位置非法"
elsereturndata[i-1];
intSeqList:
Locate(Tx)
length;
i++)
if(data[i]==x)returni+1;
//下标为i的元素等于x,返回其序号i+1
return0;
//退出循环,说明查找失败
voidSeqList:
Insert(inti,Tx)
if(length>
=MaxSize)throw"
上溢"
1||i>
length+1)throw"
位置"
for(j=length;
j>
=i;
j--)
data[j]=data[j-1];
//注意第j个元素存在数组下标为j-1处
data[i-1]=x;
length++;
Delete(inti)
if(length==0)throw"
下溢"
x=data[i-1];
for(j=i;
j<
j++)
data[j-1]=data[j];
//注意此处j已经是元素所在的数组下标
length--;
returnx;
链表类定义:
将该类保存在文件LinkList.h中。
structNode
Tdata;
Node<
T>
*next;
//此处<
也可以省略
classLinkList
LinkList(){first=newNode<
first->
next=NULL;
}//建立只有头结点的空链表
LinkList(Ta[],intn);
//建立有n个元素的单链表
~LinkList();
//析构函数
intLength();
//求单链表的长度
TGet(inti);
//取单链表中第i个结点的元素值
intLocate(Tx);
//求单链表中值为x的元素序号
voidInsert(inti,Tx);
//在单链表中第i个位置插入元素值为x的结点
TDelete(inti);
//在单链表中删除第i个结点
voidPrintList();
//遍历单链表,按序号依次输出各元素
Node<
*first;
//单链表的头指针
LinkList:
~LinkList()
p=first;
//工作指针p初始化
while(p)//释放单链表的每一个结点的存储空间
{
q=p;
//暂存被释放结点
p=p->
next;
//工作指针p指向被释放结点的下一个结点,使单链表不断开
deleteq;
}
TLinkList:
Get(inti)
p=first->
j=1;
//或p=first;
j=0;
while(p&
i)
//工作指针p后移
j++;
if(!
p)throw"
elsereturnp->
data;
voidLinkList:
p=first;
//工作指针p初始化
while(p&
i-1)
p=p->
//工作指针p后移
j++;
if(!
else{
s=newNode<
s->
data=x;
//向内存申请一个结点s,其数据域为x
s->
next=p->
//将结点s插入到结点p之后
p->
next=s;
TLinkList:
p=first;
i-1)//查找第i-1个结点
p||!
next)throw"
//结点p不存在或结点p的后继结点不存在
else{
q=p->
x=q->
//暂存被删结点
p->
next=q->
//摘链
LinkList:
LinkList(Ta[],intn)
first=newNode<