北邮数据结构答案.docx
《北邮数据结构答案.docx》由会员分享,可在线阅读,更多相关《北邮数据结构答案.docx(14页珍藏版)》请在冰豆网上搜索。
北邮数据结构答案
北邮数据结构答案
【篇一:
北邮数据结构实验报告实验二含源码】
验名称:
实验二——栈和队列
学生姓名:
申宇飞
班级:
2012211103
班内序号:
03
学号:
2012210064
日期:
2013年11月18日
1.实验要求
1.1实验目的:
通过选择下面五个题目之一进行实现,掌握如下内容:
?
进一步掌握指针、模板类、异常处理的使用
?
掌握栈的操作的实现方法
?
掌握队列的操作的实现方法
?
学习使用栈解决实际问题的能力
?
学习使用队列解决实际问题的能力
1.2实验内容
题目1
根据栈和队列的抽象数据类型的定义,按要求实现一个栈或一个队列。
要求:
1、实现一个共享栈
2、实现一个链栈
3、实现一个循环队列
4、实现一个链队列
编写测试main()函数测试线性表的正确性。
2.程序分析
2.1存储结构
链栈:
栈的链式存储结构,其实现原理类似于单链表,结点结构与单链表相同,但链栈在实现时直接采用栈顶指针指向栈顶元素。
datanext
top
栈顶
关键算法分析
链栈:
一、入栈操作
算法步骤:
自然语言描述:
1、建立新结点
2、给p结点的数据域赋值
3、修改p结点的指针域,将其指向栈顶结点
4、栈顶指针指向p结点
伪代码描述:
1)nodet*s=newnodet;
2)p-data=x;
3)p-next=top;
4)top=p;
二、出栈操作
算法步骤:
自然语言描述:
1、判断栈是否为空
2、保存栈顶结点的数据域
3、定义指针p指向栈顶结点
4、栈顶指针指向下一个结点
5、释放p结点
伪代码描述:
1)if(empty())throw下溢;
2)tx=top-data;
3)nodet*p=top;
4)top=top-next;
5)eletep;
三、链栈的取栈顶元素
栈底
算法步骤:
自然语言描述:
1、判断栈是否为空
2、定义指针p指向栈顶结点
3、返回栈顶元素的值,不删除
伪代码描述
1)if(empty())throw下溢;
2)nodet*p=top;
3)coutp-data;
四、遍历链栈元素
算法步骤:
自然语言描述:
1、定义指针p指向栈顶结点
2、判断栈是否为空
3、返回栈元素的值
4、把下一个指针的值赋给p
伪代码描述:
1)nodet*p=top;
2)while(p!
=null)
3)coutp-data;
4)p=p-next;
五、析构函数
算法步骤:
自然语言描述:
1、判断栈顶指针是否为空
2、定义指针p指向栈顶结点
3、把下一个指针的值赋给栈顶指针
4、释放要释放的指针
伪代码描述:
1)while(top)
2)structnodet*p=top;
3)top=top-next;
4)deletep;
时间复杂的:
o
(1)。
3.程序运行结果
程序截图
链栈:
1、测试主函数流程:
流程图如图1所示
图1流程图示意图2、测试条件:
问题规模n=3,数组元素1,2,3.
3、测试结论:
从栈顶开始遍历123入栈:
321
从栈顶开始遍历出栈操作:
21
栈顶元素:
2
4.总结
1、调试时出现的问题及解决的方法
连接头文件时,头文件若改名,需将main.cpp中的include也改名,同时重新编译project,否则会出错。
2、心得体会
这次选择的题目非常基本,是链栈的基本实现,相对也比较容易,但却是很基础的,有些细节部分是值得高度重视的,也是容易出错的地方。
对这些基本的特殊线性表的测试与实现是编写较复杂程序的基础,应该牢固掌握它们。
这个实验也让我学会了异常处理的方法
3、下一步的改进
由于近期处于快到考试阶段,所以没能选择更有难度的题目做,但实际上这道题虽然看似简单但在很多地方也是容易出错的。
下一步应该改进的更加具有交互性。
代码
#includeiostream
usingnamespacestd;
templateclasst
structnode
{
tdata;
structnodet*next;
};
templateclasst
classlinkstack//定义链栈模板类
{
public:
linkstack(){top=null;}//构造函数,初始化空栈
~linkstack();//析构函数
voidprintstack();//按次序遍历
voidpush(tx);//入栈操作
tpop();//出栈操作
tgettop();//查找栈顶元素
boolempty(){return(null==top)?
true:
false;}//判别栈是否为空
private:
structnodet*top;//栈顶指针
};
templateclasst
【篇二:
北邮数据结构试卷2005】
ass=txt>班级__________姓名___________学号_______成绩___________
一、填空和选择(共15分)
1.在n个元素的顺序表中插入或删除一个元素,需平均移动个元素。
2.在双向链表p所指结点之后插入s所指结点的操作是______________
b.p?
right=s;p?
right?
left=s;s?
left=p;s?
right=p?
right;
c.s?
left=p;s?
right=p?
right;p?
right=s;p?
right?
left=s;
d.s?
left=p;s?
right=p?
right;p?
right?
left=s;p?
right=s;
3.在数据结构中,从逻辑上可以把数据结构分成_________。
a.动态结构和静态结构b.紧凑结构和非紧凑结构
c.线性结构和非线性结构d.内部结构和外部结构
4.算法分析的两个主要方面是____。
a.空间复杂性和时间复杂性b.正确性和简明性
c.可读性和文档性d.数据复杂性和程序复杂性
5.线性表的顺序存储结构是一种______的存储结构,线性表的链式存储结构是一种______的存储结构。
a.随机存取b.顺序存取c.索引存取d.散列存取
6.向量、栈和队列都是______结构,可以在向量的________位置插入和删除元素;对于栈只能在_________插入和删除元素;对于队列只能在_______插入元素和在_______删除元素。
7.设循环队列中数组的下标范围是1~n,其头尾指针分别为f和r,则其元素个数为___________。
a.r-fb.r-f+1c.(r-f)modn+1d.(r-f+n)modn
8.将下三角矩阵a[7,7]的下三角部分逐行地存储到起始地址为1000的内存单元中(下标从0开始,不存储上三角部分),已知每个元素占4个单元,则a[5,4]的地址是_____________。
9.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是dgbaechf,则其后序遍历的结点访问顺序是______
a.bdgcefhab.gdbecfhac.bdgaechfd.gdbehfca
二、简答题
1.(4分)求一棵满k叉树上的叶子结点数n0和非叶子结点数nk之间满足的关系。
2.(4分)假设高度为h的二叉树上只有度为0和度为2的结点,问此类二叉树中结点数可能达到的最大值和最小值各是多少?
3.(6分)根据下面的矩阵,写出相应的三元组表,并写出矩阵转置后的三元组表。
(不要求过程)
012900000000500
-30000140
00130000
01800000
15000000
三、(10分)判断以下序列是否为小(顶)根堆?
若否,则以最少的移动次数将它们调整为小(顶)根堆。
(要求画出最后的堆结构和线性序列)
(1)(19,78,32,66,26,58,46,95,89,31)
(2)(113,98,69,35,68,25,43,19,31,55,16,29)
四、(8分)设有关键码序列(q,h,c,y,q,a,m,s,r,d,f,x),要求按照关键码值递增的次序进行排序。
(1)若采用初始步长为4的shell(希尔)排序法,写出一趟排序的结果;
(2)若采用以第一个元素为分界元素(枢轴)的快速排序法,写出一趟排序的结果。
六、综合题
1.以下各图:
(1)(4分)分别画出和下列树对应的各个二叉树;
(2)(4分)对各棵树按树的遍历规则给出先根遍历序列、后根遍历序列;
(3)(4分)对
(1)中得到的各棵二叉树给出先根遍历序列、后根遍历序列。
a
1b
234cde
5678910fgh
i
2.(10分)画出下图所示的无向图的邻接表(顶点由a到h排列),并根据所111213得邻接表给出深度优先和广度优先搜索遍历该图所的顶点序列。
bc
d
ag
e
3.(11分)假设用于通信的电文仅由10个字符(a,b,c,d,e,f,g,h,i,j)组成,字符在电文中出现的频率分别为(0.10,0.19,0.02,0.05,0.17,0.03,0.21,0.07,0.15,0.01)。
(1)画出哈夫曼树;
(2)最长的编码为几位,对应哪些字符?
最短的编码为几位,对应哪些字符。
(3)计算其带权路径长度。
4.(6分)设一个散列表包含hashsize=13个表项,其下标从0到12,采用链地址(拉链)法解决冲突.请按以下要求,将下列关键码散列到表中.
(101003245581263292004000)
(1)散列函数采用除留余数法,用%hashsize(取余运算)构造hash表;
(2)并计算查找成功时的平均查找长度。
七、(14分)完成下列折半(二分)查找算法
(st为顺序表,key为要查找的关键字。
)
.
intsearch_bin(sstablest,keytypekey){//
low=1;high=st.length;
while(________________________________){
hfmid=____________________;
if(__________________________________)
return_____________;
elseif(____________________________________)
high=____________________;
elselow=____________________;
}
return0;
}
【篇三:
北邮数据结构实验一通讯录实验报告】
验名称:
实验———线性表
学生姓名:
班级:
班内序号:
学号:
日期:
实验要求
1.1实验目的
通过选择下面四个题目之一进行实现,掌握如下内容:
?
熟悉c++语言的基本编程方法,掌握集成编译环境的调试方法
?
学习指针、模板类、异常处理的使用
?
掌握线性表的操作的实现方法
?
学习使用线性表解决实际问题的能力
1.2实验内容
利用线性表实现一个通讯录管理,通信录的数据格式如下:
structdatatype
{
intid;//编号
charname[10];//姓名
charch;//性别
charphone[13];//电话
charaddr[31];//地址
};
1.3具体要求
?
实现通讯录的建立、增加、删除、修改、查询等功能
?
能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操
作。
?
能够保存每次更新的数据(选作)
?
能够进行通讯录分类,比如班级类、好友类、黑名单等等(选作)?
编写测试main()函数测试线性表的正确性
2.程序分析
通过编程完成通讯录管理系统,实现建立、增加、修改、查找、删除、输出等一般功能,每个数据元素包含成员的id、姓名、电话、住址等基本信息。
本程序使用链表的功能,以c++语言为基础编写。
对于本通讯录管理系统的建立,需要了解并掌握链表的算法与设计方法,综合运用所学知识完成。
2.1存
储结构构:
节点结
front
2.2关键算法分析
通讯录系统图
2.2.1通讯录的建立
伪代码:
1.在堆栈中申请新的节点
2.新节点的数据为a[i]
3.将新节点添加到链表
4.修改尾指针
5.全部插入后最后一个节点的指针域设为空
代码实现:
contactbook:
:
contactbook(datatypea[],intn)
{
front=newnode;
rear=newnode;
rear=front;
for(inti=0;in;i++)//尾插法
{
node*p=newnode;
p-data=a[i];
rear-next=p;
rear=p;
}
rear-next=null;
}
时间复杂度=o(n)
2.2.2添加新成员
伪代码:
与通讯录的建立类似,通过尾插法实现
代码实现:
voidcontactbook:
:
add(datatypea)
{
node*p=newnode;
p-data=a;
rear-next=p;
rear=p;
rear-next=null;
}
时间复杂度=o
(1)
2.2.3查找成员
伪代码:
1.初始化指针p指向头指针
2.循环直到匹配到id或为p为空
3.找到则返回p的位置
4.找不到则返回空指针
代码实现:
datatype*contactbook:
:
get(inti)
{
node*p=front;
while(p)
{
if(p-data.id==i)//id匹配模式查找returnp-data;//找到则返回p的地址p=p-next;
}
returnnull;//找不到则返回空}
时间复杂度=o(n)
2.2.4删除成员
伪代码:
1.初始化指针p指向头指针
2.循环匹配id找到要删除的成员的前一个节点
3.初始化指针q指向要删除的成员
4.保存q的数据
5.p指向q的下一节点
6.释放q节点
代码实现:
datatypecontactbook:
:
delete(inti)
{
node*p=front;
while(p)
{
if(p-next-data.id==i)break;
p=p-next;
}
node*q=p-next;//q指针指向要删除的成员
if(q)
{
datatypex=q-data;//保存成员数据
p-next=q-next;//p的next指向q的next
deleteq;
cout删除成功!
endl;
returnx;
}
else
{
cout该成员不存在!
endl;
}
}
时间复杂度=o(n)
2.2.5修改成员
先调用查询模块,找到并打印用户信息,然后依次修改成员信息
代码实现:
voidcontactbook:
:
modify(datatypea,inti)
{
datatype*p=get(i);
*p=a;
}
时间复杂度=o(n)
2.2.6打印成员
依次打印成员信息
代码实现:
voidcontactbook:
:
printlist()
{
cout您的通讯录成员如下:
endl;
cout********************endl;
node*p=front-next;
while(p)
{
coutp-data.idp-data.name
p-data.chp-data.phone
p-data.addrendl;
cout********************endl;
p=p-next;
}
}
时间复杂度=o(n)
3.程序运行结果
3.1主程序流程图