数据结构 张铭 习题.doc
《数据结构 张铭 习题.doc》由会员分享,可在线阅读,更多相关《数据结构 张铭 习题.doc(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流数据结构 张铭 习题 本章练习题 答案分页:1 2 1、解答:【题意解析】 本题指定了字符的顺序,所以不能按照ASCII字符顺序来排序。【典型错误】 1.不按照题目给出的字符顺序进行排序,而按照ASCII字符顺序。 2.没有给出排序结果 3.认为顺序存储法比较节约空间,事实上由于字符空隙,顺序法并不节约空间; 4. 没有比较各种方法的优劣。【数据结构】 本题可以采用的存储结构有顺序(数组)和链表。 1. 用二维数组arrayNUMOFSTRINGMAX_LENGTH,此题可定义const int NUMOFSTRING=8, MAX_LENG
2、TH=5;B8990B90CRSI0CXY0PAB0PABC05C070优点:为紧凑存储结构,没有用于存储其他附加的信息,表示方法比较直观简单,代码实现十分容易。 缺点:为每个但此都开辟了同样长度的空间,造成空间的浪费。 2. 用链表的结构存储,结点为结构 struct strings char stringMAX_LENGTH; strings *pNext; 优点:如果有后续工作如反复增删结点,效率很高.并且可以使用不连续的空间。 缺点:操作过程相对复杂,容易出错.而且排序过程需要从表头开始沿链索一个结点一个结点的比较搜索,相当费时。3. 索引存储 是顺序存储的一种推广.使用一个字符串ch
3、ar data500,其中将大小长度不等的数据结点(单词)顺序存储其中.令使用一个字符指针数组 char* indexn,存储一系列指针,每个指针指向存储区域的一个数据结点. 排序时,直接对index中的地址值进行调换修改即可,而不用修改data中的任何内容。索引存储的优点是:由于单词长度不同,在存储时充分考虑了这个因素,可以节省空间,此外由于交换的不是单词本身而是单词的地址,可以节省时间,从时空两方面得到了优化。【排序结果】B899,B9,CRSI,CXY,PAB,PABC,5C,7 2、解答: 【题意解析】本题没有指明这100个实数是否存在相等的情况,在这里,我们考虑存在多个最大值的情形(
4、即100个实数可能有相等的),为了保存其位置,利用int pos100(因为有可能这100个实数都是相同的)来保存最大值的所有位置。【典型错误】1. 用int类型的数组来保存这100个元素,没有注意题目中说的是“每个元素的值都是实数”。 2. 求最大值的时候代码如下: temp=0; for(int i=0;itemp) temp=Numi;评注:这样是错误的,例如:当Numi都是负数的时候。 3. 未考虑可能存在多个最大值的情况,只保存了一个最大值的位置。【数据结构】本题可以采用的存储结构有顺序(数组),链表和索引。本题最好使用数组存储结构。由于其他存储方法需要记录附加信息,使得空间有效利用
5、不能够最大化。因此在空间上顺序存储是最优的。时间上,无论如何此题都要遍历所有的数,因此O(n)为可能的最优时间代价。加之此题的规模较小,因此使用大家最熟悉的顺序存储是较为优先的选择。【算法描述】 1. 由于最大值可能不止一个,甚至可能都是最大值,所以创建一个长度为100的整型数组pos100,用来记录最大值的位置。 2. 初始情况,取这个数组的第一个位置为最大值所在的位置,存入变量position中。 3. 假设有n(1n99)个最大值,那么pos0, 1, 2, , n-1记录这些最大值的位置,且posn=-1(-1是标记值,表明pos数组下标为n-1及以前的元素记录了最大值的位置);假设有
6、n(n=100)个最大值,那么pos0, 1, 2, , n-1记录这些最大值的位置,pos数组不再设-1的标记值。具体源码如下: # include void main() /存放100个实数的数组 double Num100=4543.9,4543.9,3,45,654.7,7,66,35,45,4,6,4543.9,5,46,54,6,43,5.980,34; /记录最大值所在位置的数组 int pos100; /初始设定数组的第1个元素为最大值 int position=0; /j指示位置数组pos的下标 int j=1; for(int i=1;iNumposition) posit
7、ion=i; /记下新的最大值的位置 j=1; /位置数组pos的下标恢复为1,下标为0的位置为position预留 else if(Numi= Numposition) posj+=i; /记下重复最大值的位置 /位置数组pos的下标为0的位置为position预留 pos0=position; /-1为标识值,表示位置数组pos下标为0, 1, 2(j-1)的位置存 /放的是最大值所在的位置 if(j100) posj=-1; cout最大值为: Numpositionendl; cout最大值所在的位置为:endl; for(i=0; i100; +i) if(posi=-1) /-1是
8、标识值 break; cout第(posi+1)个元素endl; 第一章概论 练习答案上一章 下一章 本章练习题 答案分页:1 2 3、解答:【逻辑结构】 逻辑结构由结点集合K和关系集合R来表示,以学生每周的课程表为例:将每天的课程安排数据作为结点,一共引入7个结点,它们的名称依次为“星期一”,“星期二”,“星期三”,“星期日”。全部结点组成结点集K。 这些结点是复合类型,是一个结构体,包括当日课程的名称,时间和地点等。这些结点两两之间有一个时间关系r,r=(“星期一“,“星期二”),(“星期二”,“星期三”),(“星期三”,“星期四”),(“星期四”,“星期五”),(“星期五”,“星期六”)
9、,(“星期六”,“星期日”)。此集合中的6个元素描述了“时间先后”关系r。此外,还引入一个关系r*=“星期日”,“星期一”,r*只含有一个元素,以表示星期日和下一周工作日的时间顺序。r和r*共同构成关系集R。其中r属于线性结构。R是一种环行的关系。【存储结构】 几种可行的存储方案比较 1.顺序表:见图一 优点:逻辑清晰,查阅修改方便;缺点:需要占用整块的存储空间,对空间要求较大 星期课次一二三四五六日12课程名上课地点授课老师 345678910图一 顺序表存储课程表 2.索引图二 索引结构的课程表构造索引表,其中的指针分别指向每一天的课程 优点:逻辑较清晰,不占用整块的存储空间,缺点:算法较
10、复杂,附加的空间代价较高(有索引表) 3链表:链接的方法是可以采纳的一个方法,每个指针都指向逻辑关系中的紧邻后继,最后一个结点的指针指向首结点,构成一个循环链表.链表结构检索较繁琐.【相关运算】 常见的运算包括增、删、查、改运算,课程表的抽象数据类型可以定义如下:template class table /当程序使用此table模板时,应该在前面附加#include public: /创建一张空课程表 table t; /创建一张天数为k的课程表,可默认k为7 table t(int k); /设置某天的课程(时间地点等),该结点的地址可由索引表找出 virtual void Setcours
11、e( ELEM & pday ) = 0; /把一个新的结点插入课程表,使该结点在表中位置是nPos 如果nPos = -1 /则插入到表尾部(同时地址加入索引表) virtual void Addday( const ELEM * pday, int nPos = -1 ) = 0; /删除课程表中某天(结点),释放该结点的空间,该结点的地址可由索引表找出 virtual void Removeday( ELEM & pday ) = 0; /清空整个课程表,成功返回true virtual bool Clearall() = 0; /清空某天(结点)的所有内容,该结点的地址可由索引表找出,
12、成功返回true virtual bool Clearday( ELEM & pday )= 0; /修改某天(结点)的课程(时间 地点等),该结点的地址可由索引表找出 virtual void Changecourse( ELEM & pday ) = 0; /输出某天(结点)的课程内容,该结点的地址可由索引表找出 virtual void Printday( ELEM & pday) = 0; /输出所有课程内容(结点) virtual void PrintList() = 0; /根据系统时间查询当天课程 virtual void Current() = 0; /统计课程总数 virtu
13、al int Number() = 0; / 析构函数,清空课程表 table(); private: ELEM * m_index; /索引表头指针 本章练习题 答案分页:1 2 本章练习题 答案分页:1 2第二章线性表、栈和队列 练习上一章 下一章本章练习1、(教材习题2.1)给出一个算法,求单链表X中,内容为a的结点地址。 2、(教材习题2.5)给出一个算法,求出循环表中结点的个数。 3、(教材习题2.8)编号为1,2,3,4的四辆列车,顺序开进一个栈式结构的站台;问开出车站的顺序有多少种可能,请具体写出来。4、(教材习题2.10)环状的队列,写出计算队列元素个数的程序。 5、(教材习题
14、2.19)现有4个元素作为双端队列的输入,问可以得到多少种不同的排列? 参考答案 第二章线性表、栈和队列 练习答案上一章 下一章 本章练习题 答案分页:1 2 1、解答:【题意解析】 本题没有指明是否存在多个内容为a的地址,在这里,我们考虑存在多个结点内容为a的情形。【典型错误】 没有考虑内容为a的地址可能有多个。【数据结构】由于链表中内容为a的结点数目不确定,可以选择用一个新链表来存放找到的结点地址。这样的存储结构优于定长数组。本题中涉及到两个链表:原链表ListNode和用于存储结点地址的新链表ListAddress。【算法描述】 1. 设pfirst和qfirst分别是这两个链表的头指针
15、,p,q为指针变量。 2. p从链表X的表头开始向后移动,每当遇到原链表中内容为a的结点,就在新链表中增加一个结点记录下其地址(用指针指向该结点来进行记录),如此循环直到链表X的表尾。struct ListNode /链表结点定义 ELEM data; /数据类型为ELEM ListNode* plink; /指向后继结点的指针 ; ListNode* pfirst; /pfirst指向原链表第一个结点 ListNode* p; /原链表的指针变量,程序运行时可对其所指结点进行各种运算 p=pfirst; /指向头指针 Struct ListAddress /用于存放地址的新链表 ListNo
16、de * address; /存放地址,类型为指向链表X的结点的指针 ListAddress* qlink; /新链表的指针变量 ; ListAddress* qfirst; /qfirst指向新链表第一个结点 qfirst-qlink=NULL; /空表 ListAddress* q=qfirst; /指向头指针 void find(ELEM a) /用于查找内容为a的结点,并记录其地址,参数为待查数据a while(p!=NULL) /未到达链表尾结点 if(p-data= =a) /找到符合条件的结点,插入新链表 q-qlink=new ListAddress; /创建内存空间 q-ql
17、ink-address=p; /存储指向该结点的指针 q=q-qlink; /指针向后移 q-qlink=NULL; p=p-plink; /指针后移继续查找 2、解答: 【算法描述】 判断已经遍历整个循环表的方法:使用一个指针变量link从链表首元素向后遍历整个链表,直到link=first时,说明该结点即尾结点。设空表时结点数count为0(此时first-link=first),每经过一个结点count加1,直到到达尾结点。 struct ListNode ELEM data; ListNode* link; ; int Length (ListNode* first) /first为循
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 张铭 习题
限制150内