北邮数据结构答案.docx

上传人:b****5 文档编号:4707562 上传时间:2022-12-07 格式:DOCX 页数:14 大小:20.90KB
下载 相关 举报
北邮数据结构答案.docx_第1页
第1页 / 共14页
北邮数据结构答案.docx_第2页
第2页 / 共14页
北邮数据结构答案.docx_第3页
第3页 / 共14页
北邮数据结构答案.docx_第4页
第4页 / 共14页
北邮数据结构答案.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

北邮数据结构答案.docx

《北邮数据结构答案.docx》由会员分享,可在线阅读,更多相关《北邮数据结构答案.docx(14页珍藏版)》请在冰豆网上搜索。

北邮数据结构答案.docx

北邮数据结构答案

北邮数据结构答案

【篇一:

北邮数据结构实验报告实验二含源码】

验名称:

实验二——栈和队列

学生姓名:

申宇飞

班级:

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主程序流程图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1