第一章概论练习答案上一章下一章本章练习题答案分页: [1] [2]1、解答:【题意解析】本题指定了字符的顺序,所以不能按照ASCII字符顺序来排序。
【典型错误】1.不按照题目给出的字符顺序进行排序,而按照ASCII字符顺序。
2.没有给出排序结果3.认为顺序存储法比较节约空间,事实上由于字符空隙,顺序法并不节约空间;4. 没有比较各种方法的优劣。
【数据结构】本题可以采用的存储结构有顺序(数组)和链表。
1. 用二维数组array[NUMOFSTRING][MAX_LENGTH],此题可定义const int优点:为紧凑存储结构,没有用于存储其他附加的信息,表示方法比较直观简单,代码实现十分容易。
缺点:为每个但此都开辟了同样长度的空间,造成空间的浪费。
2. 用链表的结构存储,结点为结构struct strings{char string[MAX_LENGTH];strings *pNext;}优点:如果有后续工作如反复增删结点,效率很高.并且可以使用不连续的空间。
缺点:操作过程相对复杂,容易出错.而且排序过程需要从表头开始沿链索一个结点一个结点的比较搜索,相当费时。
3. 索引存储是顺序存储的一种推广.使用一个字符串char data[500],其中将大小长度不等的数据结点(单词)顺序存储其中.令使用一个字符指针数组 char* index[n],存储一系列指针,每个指针指向存储区域的一个数据结点.排序时,直接对index中的地址值进行调换修改即可,而不用修改data中的任何内容。
索引存储的优点是:由于单词长度不同,在存储时充分考虑了这个因素,可以节省空间,此外由于交换的不是单词本身而是单词的地址,可以节省时间,从时空两方面得到了优化。
【排序结果】B899,B9,CRSI,CXY,PAB,PABC,5C,72、解答:【题意解析】本题没有指明这100个实数是否存在相等的情况,在这里,我们考虑存在多个最大值的情形(即100个实数可能有相等的),为了保存其位置,利用int pos[100](因为有可能这100个实数都是相同的)来保存最大值的所有位置。
【典型错误】1. 用int类型的数组来保存这100个元素,没有注意题目中说的是“每个元素的值都是实数”。
2. 求最大值的时候代码如下:temp=0;for(int i=0;i<100;i++)if(Num[i]>temp)temp=Num[i];评注:这样是错误的,例如:当Num[i]都是负数的时候。
3. 未考虑可能存在多个最大值的情况,只保存了一个最大值的位置。
【数据结构】本题可以采用的存储结构有顺序(数组),链表和索引。
本题最好使用数组存储结构。
由于其他存储方法需要记录附加信息,使得空间有效利用不能够最大化。
因此在空间上顺序存储是最优的。
时间上,无论如何此题都要遍历所有的数,因此O(n)为可能的最优时间代价。
加之此题的规模较小,因此使用大家最熟悉的顺序存储是较为优先的选择。
【算法描述】1. 由于最大值可能不止一个,甚至可能都是最大值,所以创建一个长度为100的整型数组pos[100],用来记录最大值的位置。
2. 初始情况,取这个数组的第一个位置为最大值所在的位置,存入变量position中。
3. 假设有n(1≤n≤99)个最大值,那么pos[0, 1, 2, …, n-1]记录这些最大值的位置,且pos[n]=-1(-1是标记值,表明pos数组下标为n-1及以前的元素记录了最大值的位置);假设有n(n=100)个最大值,那么pos[0, 1, 2, …, n-1]记录这些最大值的位置,pos数组不再设-1的标记值。
具体源码如下:# include <iostream.h>void main(){//存放100个实数的数组double Num[100]={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 pos[100];//初始设定数组的第1个元素为最大值int position=0;//j指示位置数组pos的下标int j=1;for(int i=1;i<100;++i)if(Num[i]>Num[position]) {position=i; //记下新的最大值的位置j=1; //位置数组pos的下标恢复为1,下标为0的位置为position预留}else if(Num[i]== Num[position])pos[j++]=i; //记下重复最大值的位置//位置数组pos的下标为0的位置为position预留pos[0]=position;//-1为标识值,表示位置数组pos下标为0, 1, 2…(j-1)的位置存//放的是最大值所在的位置if(j<100)pos[j]=-1;cout<<"最大值为:"<< Num[position]<<endl;cout<<"最大值所在的位置为:"<<endl;for(i=0; i<100; ++i){if(pos[i]==-1) //-1是标识值break;cout<<"第"<<(pos[i]+1)<<"个元素"<<endl;}}第一章概论练习答案上一章下一章本章练习题答案分页: [1] [2]3、解答:【逻辑结构】逻辑结构由结点集合K和关系集合R来表示,以学生每周的课程表为例:将每天的课程安排数据作为结点,一共引入7个结点,它们的名称依次为“星期一”,“星期二”,“星期三”,……,“星期日”。
全部结点组成结点集K。
这些结点是复合类型,是一个结构体,包括当日课程的名称,时间和地点等。
这些结点两两之间有一个时间关系r,r={(“星期一“,“星期二”),(“星期二”,“星期三”),(“星期三”,“星期四”),(“星期四”,“星期五”),(“星期五”,“星期六”),(“星期六”,“星期日”)。
此集合中的6个元素描述了“时间先后”关系r。
此外,还引入一个关系r*={“星期日”,“星期一”},r*只含有一个元素,以表示星期日和下一周工作日的时间顺序。
r和r*共同构成关系集R。
其中r属于线性结构。
R是一种环行的关系。
【存储结构】几种可行的存储方案比较1.顺序表:见图一优点:逻辑清晰,查阅修改方便;缺点:需要占用整块的存储空间,对空间要求较大图一顺序表存储课程表2.索引图二索引结构的课程表构造索引表,其中的指针分别指向每一天的课程优点:逻辑较清晰,不占用整块的存储空间,缺点:算法较复杂,附加的空间代价较高(有索引表)3.链表:链接的方法是可以采纳的一个方法,每个指针都指向逻辑关系中的紧邻后继,最后一个结点的指针指向首结点,构成一个循环链表.链表结构检索较繁琐. 【相关运算】常见的运算包括增、删、查、改运算,课程表的抽象数据类型可以定义如下:template<class ELEM>class table//当程序使用此table模板时,应该在前面附加#include<table>{public://创建一张空课程表table < ELEM > t;//创建一张天数为k的课程表,可默认k为7table < ELEM > t(int k);//设置某天的课程(时间地点等),该结点的地址可由索引表找出virtual void Setcourse( ELEM & pday ) = 0;//把一个新的结点插入课程表,使该结点在表中位置是nPos 如果nPos = -1 //则插入到表尾部(同时地址加入索引表)virtual void Addday( const ELEM * pday, int nPos = -1 ) = 0;//删除课程表中某天(结点),释放该结点的空间,该结点的地址可由索引表找出virtual void Removeday( ELEM & pday ) = 0;//清空整个课程表,成功返回truevirtual bool Clearall() = 0;//清空某天(结点)的所有内容,该结点的地址可由索引表找出,成功返回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;//统计课程总数virtual 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、(教材习题2.19)现有4个元素作为双端队列的输入,问可以得到多少种不同的排列?参考答案第二章线性表、栈和队列练习答案上一章下一章本章练习题答案分页: [1] [2]1、解答:【题意解析】本题没有指明是否存在多个内容为a的地址,在这里,我们考虑存在多个结点内容为a的情形。
【典型错误】没有考虑内容为a的地址可能有多个。
【数据结构】由于链表中内容为a的结点数目不确定,可以选择用一个新链表来存放找到的结点地址。
这样的存储结构优于定长数组。
本题中涉及到两个链表:原链表ListNode和用于存储结点地址的新链表ListAddress。
【算法描述】1.设pfirst和qfirst分别是这两个链表的头指针,p,q为指针变量。
2.p从链表X的表头开始向后移动,每当遇到原链表中内容为a的结点,就在新链表中增加一个结点记录下其地址(用指针指向该结点来进行记录),如此循环直到链表X 的表尾。