自考问答 自考本科自考百科
自考问答 > 自考百科 > 数据结构自考教材答案解析

数据结构自考教材答案解析

发布时间:

数据结构自考教材答案解析

发布时间:

数据结构自考教材答案解析

全国2006年10月高等教育自学考试数据结构导论试题课程代码:02142一、单项选择题(本大题共15小题,每小题2分,共30分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1.数据的基本单位是( )A.数据项 B.数据类型 C.数据元素 D.数据变量2.下列程序的时间复杂度为( )i=0;s=0;while(s= (1)________;j--)if(R〔j〕next=p->next;p->next->pri=q;p->next=q;q->pri=p; 34、ABCDEFGH35、WPl= (3+6+7+9)*3+(10+11)*2=117 10:01 11:10 3:000 6:001 7:110 9:111

1 下列数据结构中,能用二分法进行查找的是__A____。 A、顺序存储的有序线性表 B、线性链表 C、二叉链表 D、有序线性链表 解析:二分法查找只适用于顺序存储的有序表。在此所说的有序表是指线性表中的元素按值非递减排列(即从小到大,但允许相邻元素值相等)。 2 在软件设计中,不属于过程设计工具的是__D____。 A、PDL(过程设计语言) B、PAD图 C、N-S图 D、DFD图 解析:软件设计工具包括:程序流程图、N-S、PAD、HIPO,判定表,PDL(伪码)。而DFD(数据流图)属于结构化分析工具。 3 在switch(expression)语句中,expression的数据类型不能是__A____。 A、double B、char C、byte D、short 解析:表达式expression只能返回这个几种类型的值:int、byte、short和char。多分支语句把表达式返回的值依次与每个case子句中的值相比较,如果遇到匹配的值,则执行该case子句后的语句序列。 4 下列叙述中,错误的是__D____。 A、父类不能替代子类 B、子类能够替代父类 C、子类继承父类 D、父类包含子类 5 通过继承实现代码复用: Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。继承而得到的类称为子类,被继承的类称为父类。子类不能继承父类中访问权限为private的成员变量和方法,子类可以重写父类的方法,及命名与父类同名的成员变量。 子类通过隐藏父类的成员变量和重写父类的方法,把父类的状态和行为改变为自身的状态和行为。注意:子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型,只是函数体不同。 由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。 java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。 6 自定义表格类中的model部分应实现的接口是___A___。 A、AbstractTableModel B、JTable C、TableModel D、TableModelable 7 下列代码中,将引起编译错误的行是__B____。 1)public class Exercise{ 2) public static void main(String args[]){ 3) float f=0.0; 4) f+=1.0; 5) } 6) } A、第2行 B、第3行 C、第4行 D、第6行 解析:float定义变量赋值时,需要在数值后面加f以标识它为浮点型,让系统知道该给它精确到多少位。

全国2008年10月高等教育自学考试数据结构试题课程代码:02331一、单项选择题(本大题共15小题,每小题2分,共30分)在每小题列出的四个备选项中只有一个是最符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1.如果在数据结构中每个数据元素只可能有一个直接前驱,但可以有多个直接后继,则该结构是( )A. 栈 B. 队列C. 树 D. 图2.下面程序段的时间复杂度为( )for (i=0; inext==head B. p->next->next==headC. p->next==NULL D. p==head4.若以S和X分别表示进栈和退栈操作,则对初始状态为空的栈可以进行的栈操作系列是( )A. SXSSXXXX B. SXXSXSSXC. SXSXXSSX D. SSSXXSXX5.两个字符串相等的条件是( )A. 串的长度相等 B. 含有相同的字符集C. 都是非空串 D. 串的长度相等且对应的字符相同6.如果将矩阵An×n的每一列看成一个子表,整个矩阵看成是一个广义表L,即L=((a11,a21,…,an1),( a12,a22,…,an2),…,(a1n,a2n,…,ann)),并且可以通过求表头head和求表尾tail的运算求取矩阵中的每一个元素,则求得a21的运算是( )A. head (tail (head (L))) B. head (head(head(L)))C. tail (head (tail (L))) D. head (head (tail (L)))7.已知一棵含50个结点的二叉树中只有一个叶子结点,则该树中度为1的结点个数为( )A. 0 B. 1C. 48 D. 498.在一个具有n个顶点的有向图中,所有顶点的出度之和为Dout ,则所有顶点的入度之和为( )A. Dout B. Dout-1C. Dout+1 D. n9.如图所示的有向无环图可以得到的拓扑序列的个数是( )A. 3 B. 4C. 5 D. 610.如图所示的带权无向图的最小生成树的权为( )A. 51 B. 52C. 54 D. 5611.对长度为n的关键字序列进行堆排序的空间复杂度为( )A. O(log2n) B. O(1)C. O(n) D. O(n*log2n)12.已知用某种排序方法对关键字序列(51,35,93,24,13,68,56,42,77)进行排序时,前两趟排序的结果为(35,51,24,13,68,56,42,77,93)(35,24,13,51,56,42,68,77,93)所采用的排序方法是( )A. 插入排序 B. 冒泡排序C. 快速排序 D. 归并排序13.已知散列表的存储空间为T[0..18],散列函数H(key)=key%17,并用二次探测法处理冲突。散列表中已插入下列关键字:T[5]=39,T[6]=57和T[7]=7,则下一个关键字23插入的位置是( )A. T[2] B. T[4]C. T[8] D. T[10]14.适宜进行批量处理的文件类型是( )A. 顺序文件 B. 索引顺序文件C. 散列文件 D. 多关键字文件15.VSAM文件的索引结构为( )A. B+树 B. 二叉排序树C. B-树 D. 最优二叉树二、填空题(本大题共10小题,每小题2分,共20分)请在每小题的空格中填上正确答案。错填、不填均无分。16.如果某算法对于规模为n的问题的时间耗费为T(n)=3n3,在一台计算机上运行时间为t秒,则在另一台运行速度是其64倍的机器上,用同样的时间能解决的问题规模是原问题规模的 倍。17.将两个长度分别为m和n的递增有序单链表,归并成一个按元素递减有序的单链表,可能达到的最好的时间复杂度是 。18.已知循环队列的存储空间大小为m,队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置,则在队列不满的情况下,队列的长度是 。19.字符串“sgabacbadfgbacst” 中存在有 个与字符串“ba”相同的子串。20.假设以列优先顺序存储二维数组A[5][8],其中元素A[0][0]的存储地址为LOC(a00),且每个元素占4个存储单元,则数组元素A[i][j]的存储地址为 。21.假设用表示树的边(其中x是y的双亲),已知一棵树的边集为{,,,,,},该树的度是 。22.n个顶点且含有环路的无向连通图中,至少含有 条边。23.在一般情况下用直接插入排序、选择排序和冒泡排序的过程中,所需记录交换次数最少的是 。24.和二分查找相比,顺序查找的优点是除了不要求表中数据元素有序之外,对 结构也无特殊要求。25.顺序文件中记录存放的物理顺序和 顺序一致。三、解答题(本大题共4小题,每小题5分,共20分)26.由森林转换得到的对应二叉树如图所示,写出原森林中第三棵树的前序序列和后序序列。前序序列:后序序列:27.图的邻接表的类型定义如下所示:#define MaxVertexNum 50typedef struct node {int adjvex;struct node *next;}EdgeNode;typedef struct {VertexType vertex;EdgeNode *firstedge;}VertexNode;typedef VertexNode AdjList[MaxVertexNum];typedef struct {AdjList adjlist;int n, e;}ALGraph;为便于删除和插入图的顶点的操作,可将邻接表的表头向量定义为链式结构,两种定义的存储表示实例如下图所示,请写出重新定义的类型说明。题27图28.某类物品的编号由一个大写英文字母及2位数字(0..9)组成,形如E32。运用基数排序对下列物品编号序列进行按字典序的排序,写出每一趟(分配和收集)后的结果。E13,A37,F43,B32,B47,E12,F37,B12第一趟:第二趟:第三趟:29.(1)画出对表长为13的有序顺序表进行二分查找的判定树;(2)已知关键字序列为(12,14,16,21,24,28,35,43,52,67,71,84,99),写出在该序列中二分查找37时所需进行的比较次数。(1)(2)四、算法阅读题(本大题共4小题,每小题5分,共20分)30.已知线性表的存储结构为顺序表,阅读下列算法,并回答问题:(1)设线性表L=(21,-7,-8,19,0,-11,34,30,-10),写出执行f30(&L)后的L状态;(2)简述算法f30的功能。void f30 (SeqList *L) {int i,j;for (i=j=0;ilength; i++)if(L->data[i]>=0){if(i!=j)L->data[j]=L->data[i];j++;}L->length=j;}(1)(2)31.阅读下列算法,并回答问题:(1)Q、Q1和Q2都是队列结构,设队列Q=(1,0,-5,2,-4,-6,9),其中1为队头元素,写出执行f31 (&Q,&Q1,&Q2)之后队列Q、Q1和Q2的状态;(2)简述算法f31的功能。(注:lnitQueue、EnQueue、DeQueue和QueueEmpty分别是队列初始化、入列、出队和判队空的操作)void f31 (Queue*Q, Queue*Q1, Queue*Q2) {int e;lnitQueue (Q1);lnitQueue (Q2);while (!QueueEmpty (Q)) {e=DeQueue (Q);if (e>=0) EnQueue (Q1,e);else EnQueue (Q2,e)}}(1)(2)32.阅读下列算法,并回答问题:(1)假设串由合法的英文字母和空格组成,并以’\0’作结束符。设串s=”⊔⊔|⊔am⊔a⊔⊔⊔student”(⊔表示空格符),写出f32(s)的返回值;(2)简述算法f32的功能。int f32 (char*s){int i, n, inword;n=inword=0;for (i=0;s[i]!=’\0’;i++)if (s[i]!=’⊔’&& inword==0){inword=1;n++;}else if (s[i]==’⊔’&& inword==1)inword=0;return n;}(1)(2)33.阅读下列对正整数关键字序列L操作的算法,并回答问题:(1)设L=(28,19,27,49,56,12,10,25,20,50),写出f33 (L,4)的返回值;(2)简述函数f33的功能。int Partition (SeqList*L, int low, int high);‖对L[low..high]做划分,返回基准记录的位置,并使左部的关键字‖都小于或等于基准记录的关键字,右部的关键字都大于基准记录的关键字int f33 (SeqList L, int k){int low, high, pivotpos;low=1;high=L.length;if (khigh)return-1;do {pivotpos=Partition (&L, low, high);‖调用快速排序的划分算法if (pivotposk)high=pivotpos-1;}while (pivotpos!=k);return L.data [pivotpos];}(1)(2) 五、算法设计题(本题10分)34.二叉排序树的类型定义如下:typedef struct BSTNode {‖ 二叉排序树的结点结构int data; ‖数据域struct BSTNode *lchild, *rchild; ‖左、右孩子指针}BSTNode,*BSTree;设计递归算法,统计一棵二叉排序树T中值小于a的结点个数。

1.同22. C.教科书第一页,绪论1.1基本术语..........数据元素是数据的基本单位, 数据项是构成数据元素的不可分割的具有独立含义的最小标识单位 、3.B插入和删除最好的和最坏的时间复杂度是O(1),O(n).品均时间复杂度是O(n);4.B5.B6.详情请看数据结构实用教程c语言版的教材第86页,具有相同的逻辑结构(都是线性表) 可以采用相同的存储方法(顺序存储,链接存储)具有不同的运算特点栈是后进先出,队列是先进先出。8.b//79页12.有向图顶点与边的关系是n(n-1),无向图是n(n-1)/2,13.无向图中一个顶点的度是指与该顶点相关的边的条数,同(路径)14.C15.D16.217.18.Push pop

数据结构自考教材答案解析书

我们老师给我推荐了一本算法的书,Introduction to Algorithms,有中文版,叫算法导论。我现在也正在学,有能力还是看英文版吧。我刚学编程的时候就特别想学学算法,提高一些编程技巧。数据结构我们用的是清华大学出版社的那本,《清华大学计算机系列教材•数据结构(C语言版)》吴伟民、 严蔚敏,老师说这本讲的比较齐全。另外我还想推荐一本《Digital Design》(数字化设计)学计算机很好的一本书(如果你用得上的话),里面有很多例题(在网上找pdf版本的就行,书太贵,买不起)。希望对你有帮助

1.同22. C.教科书第一页,绪论1.1基本术语..........数据元素是数据的基本单位, 数据项是构成数据元素的不可分割的具有独立含义的最小标识单位 、3.B插入和删除最好的和最坏的时间复杂度是O(1),O(n).品均时间复杂度是O(n);4.B5.B6.详情请看数据结构实用教程c语言版的教材第86页,具有相同的逻辑结构(都是线性表) 可以采用相同的存储方法(顺序存储,链接存储)具有不同的运算特点栈是后进先出,队列是先进先出。8.b//79页12.有向图顶点与边的关系是n(n-1),无向图是n(n-1)/2,13.无向图中一个顶点的度是指与该顶点相关的边的条数,同(路径)14.C15.D16.217.18.Push pop

上课很重要!老师来之前翻两下书.一般我们老师废话很多,她讲废话,我就走神,讲重点时我才听讲.  人的精力集中不了几分,别浪费在无聊的事上!      做题.简单题<尤其是课内的>很重要,考试必考啊,认真做.难题嘛,你IQ好了,多思考,和你们班IQ好的同学比一比啊,好威风!!     拒绝粗心,血汗成绩被粗心拉下去了,哭也没用!一定要端正态度啊,从每一次做题开始!     IQ不好,课前预习,课后复习也是必要的.少买参考资料,书上掌握好就行了.     思考 创新 决不可少,没事和你同学多聊聊学习,多探究难题,有利于激发学习兴趣.

hgkghkghkghkghk

数据结构导论自考教材答案解析

深度的递归算法int depth(BiTreeNode * T){ if(T==NULL) return 0; //  如果结点为空,高度为0 else { int h1= depth(T->lchild); //  获得左子树的高度 int h2= depth(T->rchild); //  获得右子树的高度 return max(h1,h2)+1; }}

虽然C是数据结构的前导课程,但是单纯学习数据结构也是可以的,只不过书上的程序例题看不太懂罢了。 你觉得C很难,考试不知道如何编写程序。其实数据结构本身和C结合不是特别紧密,很多语言都能表示数据结构的,不一定非得用C。 关键是链表、队列、树、图、查找、排序等的基本概念和算法,例如哈弗曼编码其实就是二叉树的一个概念,如何构造哈弗曼编码,如何用C语言实现这种算法,你只要明白其构造过程就可以了,考试时不一定非得用完整的C语言书写程序,可以是伪代码。

全国2010年10月高等教育自学考试 数据结构导论试题 课程代码:02142一、单项选择题(本大题共15小题,每小题2分,共30分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.下列描述中正确的是( )A.数据元素是数据的最小单位 B.数据结构是具有结构的数据对象 C.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 D.算法和程序原则上没有区别,在讨论数据结构时两者是通用的 2.归并排序的时间复杂度是( )A.O(n2) B.O(nlog2n) C.O(n) D.O(log2n) 3.二分查找的时间复杂度是( )A.O(n2) B.O(nlog2n) C.O(n) D.O(log2n) 4.顺序存储的表中有90000个元素,已按关键字值升序排列,假设对每个元素进行查找的概率相同,且每个元素的关键字值皆不相同,用顺序查找法查找时,需平均比较的次数为( )A.25000 B.30000C.45000 D.900005.散列文件是一种( )A.顺序文件 B.索引文件 C.链接文件 D.计算寻址文件 6.两个矩阵A:m×n,B:n×p相乘,其时间复杂度为( )A.O(n) B.O(mnp)C.O(n2) D.O(mp) 7.常用于函数调用的数据结构是( )A.栈 B.队列 C.链表 D.数组 8.二维数组A[n][m]以列优先顺序存储,数组A中每个元素占用1个字节,A[1][1]为首元素,其地址为0,则元素A[i][j]的地址为( )A.(i-1)×m+(j-1) B.(j-1)×n+(i-1)C.(j-1)×n+i D.j×n+i9.图的广度优先搜索使用的数据结构是( )A.队列 B.树 C.栈 D.集合 10.序列(21,19,37,5,2)经冒泡排序法由小到大排序,在第一次执行交换后所得结果为( )A.(19,21,37,5,2) B.(21,19,5,37,2)C.(21,19,37,2,5) D.(2,21,19,37,5)11.数据在计算机存储器内表示时,根据结点的关键字直接计算出该结点的存储地址,这种方法称为( )A.索引存储方法 B.顺序存储方法 C.链式存储方法 D.散列存储方法 12.在单链表中,存储每个结点有两个域,一个是数据域,另一个是指针域,指针域指向该结点的( )A.直接前趋 B.直接后继 C.开始结点 D.终端结点 13.在已知头指针的单链表中,要在其尾部插入一新结点,其算法所需的时间复杂度为( )A.O(1) B.O(log2n) C.O(n) D.O(n2) 14.在链队列中执行入队操作,( )A.需判别队是否空 B.需判别队是否满 C.限制在链表头p进行 D.限制在链表尾p进行 15.一整数序列26,59,77,31,51,11,19,42,以二路归并排序从小到大排序,第一阶段的归并结果为( )A.31,51,11,42,26,77,59,19 B.26,59,31,77,11,51,19,42C.11,19,26,31,42,59,51,77 D.26,11,19,31,51,59,77,42 二、填空题(本大题共13小题,每小题2分,共26分)请在每小题的空格中填上正确答案。错填、不填均无分。 16.下列程序段的时间复杂度为_______。 i=0;s=0; while(snext=top和_______操作。 23.有m个叶结点的哈夫曼树所具有的结点数为_______。 24.在一棵具有n个结点的完全二叉树中,从树根起,自上而下、自左至右地给所有结点编号。设根结点编号为1。若编号为i的结点有右孩子,那么其右孩子的编号为_______。 25.在一棵树中,_______结点没有前驱结点。 26.一个具有n个顶点的有向完全图的弧数是_______。 27.n个顶点的无向图G用邻接矩阵A[n][n]存储,其中第i列的所有元素之和等于顶点Vi的_______。 28.选择排序的平均时间复杂度为_______。 三、应用题(本大题共5小题,每小题6分,共30分)29.在栈的输入端元素的输入顺序为1,2,3,4,5,6,进栈过程中可以退栈,则退栈时能否排成序列3,2,5,6,4,1和1,5,4,6,2,3,若能,写出进栈、退栈过程,若不能,简述理由。(用push(x)表示x进栈,pop(x)表示x退栈) 30.已知一棵二叉树的中根遍历序列为CBEDFAGH,后根遍历序列为CEFDBHGA,画出该二叉树。 31.给定表(15,11,8,20,14,13),试按元素在表中的顺序将它们依次插入一棵初始时为空的二叉排序树,画出插入完成后的二叉排序树,并判断该二叉排序树是否为平衡二叉排序树,若为非平衡二叉排序树,将它调整为平衡二叉排序树。 32.如题32图所示无向图,(1)写出其邻接矩阵;(2)写出三种以顶点A为起点的深度优 先搜索顶点序列。 题32图 33.用冒泡排序法对数据序列(49,38,65,97,76,134,27,49)进行排序,写出排序过程。并说明冒泡排序是否为稳定排序。 四、算法设计题(本大题共2小题,每小题7分,共14分)34.编写计算二叉树中叶子结点数目的算法。 35.开散列表的类型定义如下: typedef struct tagnode{keytype key;struct tagnode*next;}*pointer,node;typedef pointer openhash[n];试写出开散列表上的查找算法。

网上这些是没有的,主管部门也不公布的,我也找了很久,也咨询过很多人,得出结论就是:自己看书吧,好好努力考试!祝你好运!自考的孩子伤不起啊!!!

自考数据结构导论教材答案解析

第六题选B,因为完全二叉树的深度h满足:2^i-1=100;可以算出i=7时为128;

数据结构的语言采用伪代码,不能直接运行,主要用于抽象概括出各种类型的数据对象和类型!1.5-10年前的数据结构导论使用的是Pascal语言作伪代码描述。2.近几年的教材都改为伪代码-C语言描述。

02142自考数据结构导论今天我们的教务老师给同学来讲讲以下这些问题,如果你觉得还不错,可以收藏我们网站哦,我们专注于自学考试教材购买服务网哦,接下来一起来阅读下面的正文吧!一、什么是02142自考数据结构导论02142自考数据结构导论是一门数据结构课程,是针对自学考试(自考)考生设计的一门课程,是由中国自学考试网络中心制定的一门数据结构课程,课程编号为02142。该课程旨在帮助学生掌握数据结构的基础理论,并能够应用数据结构解决实际问题。二、02142自考数据结构导论的主要内容02142自考数据结构导论的主要内容包括:数据结构的概念与分类、线性表、栈与队列、树与二叉树、图、查找与排序、哈希表、字符串匹配算法等。三、02142自考数据结构导论的学习要求02142自考数据结构导论的学习要求主要是要求学生掌握数据结构的基本概念、基本原理和基本算法,能够熟练掌握数据结构中的常见算法,并能够运用数据结构解决实际问题。四、02142自考数据结构导论的考试形式02142自考数据结构导论的考试形式主要是采用闭卷考试的形式,考试内容主要包括理论知识和实际应用,考试时间为90分钟,满分100分。五、02142自考数据结构导论的学习方法02142自考数据结构导论的学习方法主要有以下几点:1、充分理解数据结构的基本概念、基本原理和基本算法;2、熟练掌握数据结构中的常见算法;3、多练习,熟练掌握数据结构的应用;4、注意把握考试的重点,掌握考试的规律。六、02142自考数据结构导论的重要性02142自考数据结构导论是一门重要的课程,它不仅可以帮助学生掌握数据结构的基本概念、基本原理和基本算法,而且还可以帮助学生掌握数据结构中的常见算法,并能够运用数据结构解决实际问题,这对于学生的今后学习和工作具有重要的意义。自考/成考有疑问、不知道自考/成考考点内容、不清楚当地自考/成考政策,点击底部咨询官网老师,免费领取复习资料:

第一题:C数据的逻辑结构分为:线性结构和非线性结构数据的存储结构分为:顺序存储结构和链式存储结构第二题:B第四题:C我个人可以利用二路归并的排序方法,利用特殊情况L1(low1,high1),L2(low2,high2),且low2>hign1。第七题:A若A是一个m*n的二维数组,数组下标从零开始,以列为主序存储,则address(A[i,j])=adderss(A[0,0])+(j*n+i)*L其中L为一个元素所占的存储空间则在此题目中address(A[5,5])=1000+(5*6+5)*5=1000+175=1175若以行为主序存储,则adderss(A[i,j])=adderss(A[0,0])+(i*m+j)*L在此题目中address(A[5,5])=1000+(5*6+5)*5=1000+175=1175即在此题目中以行为主序存储和以列为主序存储,最终结果相同。第九题:B完全二叉树是指除最后一层外,每一层上的结点数都达到最大值,在最后一层上指缺少右边的若干结点。根据定义可以先求出深度为H-1的满二叉树的结点个数为2^(H-1)-1,则继而可以得到深度为H的满二叉树的结点最少为2^(H-1)。第十题:D无向图的极大连通子图就叫做连通分量。问题关键在于n个结点的无向图有很多种,所以连通分量数不能确定。第十一题:D第十二题:D二叉排序树的定义为:左子树上的所有结点值均小于根节点的值,右子数上的值均不小于根结点的值。又因为中序遍历的循序是:先访问左结点,再访问根结点,最后访问右结点。根据以上两个原则可以得到.对一棵二叉排序树采用中根遍历进行输出的数据一定是递增序列。第二十二题:一棵具有n个结点的树,所有非终端结点的度均为k,则此二叉树为K叉树,这棵树只右度为K和度为0的结点,设度为K的结点数为a,度为0的结点数为b,则n=a+b。又设二叉树的所有分支为m,则m=k*a,同样可以得到n=m+1。综上可以得到b=[(n-1)*(k-1)/k-1]。以上是我自己对以上题目的解答,如果有什么不妥之处请与我联系继续探讨。

2020自考数据结构答案解析

( )逻辑结构相同但存储不同 可以是不同的数据结构 例如 线性表的逻辑结构属于线性结构 采用顺序存储结构为顺序表 而采用链式存储结构称为线性链表

( )栈和队列的逻辑结构相同 其存储表示也可相同(顺序存储和链式存储) 但由于其运算集合不同而成为不同的数据结构

( )数据结构的评价非常复杂 可以考虑两个方面 一是所选数据结构是否准确 完整的刻划了问题的基本特征;二是是否容易实现(如对数据分解是否恰当;逻辑结构的选择是否适合于运算的功能 是否有利于运算的实现;基本运算的选择是否恰当 )

评价好的算法有四个方面 一是算法的正确性;二是算法的易读性;三是算法的健壮性;四是算法的时空效率(运行)

( )见上面题 ( )见上面题 ( )见上面题

( )算法的时间复杂性是算法输入规模的函数 算法的输入规模或问题的规模是作为该算法输入的数据所含数据元素的数目 或与此数目有关的其它参数 有时考虑算法在最坏情况下的时间复杂度或平均时间复杂度

( )算法是对特定问题求解步骤的描述 是指令的有限序列 其中每一条指令表示一个或多个操作 算法具有五个重要特性 有穷性 确定性 可行性 输入和输出

( )频度 在分析算法时间复杂度时 有时需要估算基本操作的原操作 它是执行次数最多的一个操作 该操作重复执行的次数称为频度

集合 线性结构 树形结构 图形或网状结构 逻辑结构 存储结构 操作(运算)

通常考虑算法所需要的存储空间量和算法所需要的时间量 后者又涉及到四方面 程序运行时所需输入的数据总量 对源程序进行编译所需时间 计算机执行每条指令所需时间和程序中指令重复执行的次数

D是数据元素的有限集合 S是D上数据元素之间关系的有限集合

数据结构 这一术语有两种含义 一是作为一门课程的名称;二是作为一个科学的概念 作为科学概念 目前尚无公认定义 一般认为 讨论数据结构要包括三个方面 一是数据的逻辑结构 二是数据的存储结构 三是对数据进行的操作(运算) 而数据类型是值的集合和操作的集合 可以看作是已实现了的数据结构 后者是前者的一种简化情况

见上面题

将学号 姓名 平均成绩看成一个记录(元素 含三个数据项) 将 个这样的记录存于数组中 因一般无增删操作 故宜采用顺序存储

typedef struct

{int num;//学号

char name[ ];//姓名

float score;/平均成绩

}node;

node student[ ];

见上面题 ( )

应从两方面进行讨论 如通讯录较少变动(如城市私人电话号码) 主要用于查询 以顺序存储较方便 既能顺序查找也可随机查找;若通讯录经常有增删操作 用链式存储结构较为合适 将每个人的情况作为一个元素(即一个结点存放一个人) 设姓名作关键字 链表安排成有序表 这样可提高查询速度

线性表中的插入 删除操作 在顺序存储方式下平均移动近一半的元素 时间复杂度为O(n);而在链式存储方式下 插入和删除时间复杂度都是O( )

对算法A 和A 的时间复杂度T 和T 取对数 得nlog 和 logn 显然 算法A 好于A

struct node

{int year month day; };

typedef struct

{int num;//帐号

char name[ ];//姓名

struct node date;//开户年月日

int tag;//储蓄类型 如 零存 一年定期……

float put;//存入累加数;

float interest;//利息

float total;//帐面总数

}count;

( )n ( )n+ ( )n ( )(n+ )(n )/ ( )(n+ )(n )/ ( )n

7. (1)O(n*i) (2)O(n平方) 由于不好打 只好用中文代替了.8. 72 30 42 16 26 11 15 5 6 7 8 2 4WPL=30*2+16*3+(5+7+8)*5+(2+4)*6=自己算吧9.临接句阵:0 1 1 1 01 0 0 0 11 0 0 0 11 0 0 0 10 1 1 1 0临接表(单链表的格式: data next):v1 -> v2 -> v3 -> v4 ^v2 -> v1 -> v5 ^v3 -> v1 -> v5 ^v4 -> v1 -> v5 ^v5 -> v2 -> v3 -> v4 ^10 由于不好画图 就不答了.就帮搂主答这几题了.太多了不想回答哈.....累喔 如果错了希望指出来喔

说明: 1. 本文是对严蔚敏《数据结构(c语言版)习题集》一书中所有算法设计题目的解决方案,主要作者为一具.以下网友:biwier,szm99,siice,龙抬头,iamkent,zames,birdthinking,lovebuaa等为答案的修订和完善工作提出了宝贵意见,在此表示感谢;2. 本解答中的所有算法均采用类c语言描述,设计原则为面向交流、面向阅读,作者不保证程序能够上机正常运行(这种保证实际上也没有任何意义);3. 本解答原则上只给出源代码以及必要的注释,对于一些难度较高或思路特殊的题目将给出简要的分析说明,对于作者无法解决的题目将给出必要的讨论.目前尚未解决的题目有: 5.20, 10.40;4. 请读者在自己已经解决了某个题目或进行了充分的思考之后,再参考本解答,以保证复习效果;5. 由于作者水平所限,本解答中一定存在不少这样或者那样的错误和不足,希望读者们在阅读中多动脑、勤思考,争取发现和纠正这些错误,写出更好的算法来.请将你发现的错误或其它值得改进之处向作者报告: 第一章 绪论 1.16 void print_descending(int x,int y,int z)//按从大到小顺序输出三个数{ scanf("%d,%d,%d",&x,&y,&z); if(xy; //<->为表示交换的双目运算符,以下同 if(yz; if(xy; //冒泡排序 printf("%d %d %d",x,y,z);}//print_descending 1.17 Status fib(int k,int m,int &f)//求k阶斐波那契序列的第m项的值f{ int tempd; if(k<2||m<0) return ERROR; if(ma.length) return INFEASIBLE; for(count=1;i+count-1<=a.length-k;count++) //注意循环结束的条件 a.elem[i+count-1]=a.elem[i+count+k-1]; a.length-=k; return OK;}//DeleteK 2.11Status Insert_SqList(SqList &va,int x)//把x插入递增有序表va中{ if(va.length+1>va.listsize) return ERROR; va.length++; for(i=va.length-1;va.elem[i]>x&&i>=0;i--) va.elem[i+1]=va.elem[i]; va.elem[i+1]=x; return OK;}//Insert_SqList 2.12 int ListComp(SqList A,SqList B)//比较字符表A和B,并用返回值表示结果,值为1,表示A>B;值为-1,表示AB.elem[i]?1:-1; if(A.length==B.length) return 0; return A.length>B.length?1:-1; //当两个字符表可以互相比较的部分完全相同时,哪个较长,哪个就较大}//ListComp 2.13 LNode* Locate(LinkList L,int x)//链表上的元素查找,返回指针{ for(p=l->next;p&&p->data!=x;p=p->next); return p;}//Locate 2.14 int Length(LinkList L)//求链表的长度{ for(k=0,p=L;p->next;p=p->next,k++); return k;}//Length 2.15 void ListConcat(LinkList ha,LinkList hb,LinkList &hc)//把链表hb接在ha后面形成链表hc{ hc=ha;p=ha; while(p->next) p=p->next; p->next=hb;}//ListConcat 2.16 见书后答案. 2.17 Status Insert(LinkList &L,int i,int b)//在无头结点链表L的第i个元素之前插入元素b{ p=L;q=(LinkList*)malloc(sizeof(LNode)); q.data=b; if(i==1) { q.next=p;L=q; //插入在链表头部 } else { while(--i>1) p=p->next; q->next=p->next;p->next=q; //插入在第i个元素的位置 }}//Insert 2.18 Status Delete(LinkList &L,int i)//在无头结点链表L中删除第i个元素{ if(i==1) L=L->next; //删除第一个元素 else { p=L; while(--i>1) p=p->next; p->next=p->next->next; //删除第i个元素 }}//Delete 2.19 Status Delete_Between(Linklist &L,int mink,int maxk)//删除元素递增排列的链表L中值大于mink且小于maxk的所有元素{ p=L; while(p->next->data<=mink) p=p->next; //p是最后一个不大于mink的元素 if(p->next) //如果还有比mink更大的元素 { q=p->next; while(q->datanext; //q是第一个不小于maxk的元素 p->next=q; }}//Delete_Between 2.20 Status Delete_Equal(Linklist &L)//删除元素递增排列的链表L中所有值相同的元素{ p=L->next;q=p->next; //p,q指向相邻两元素 while(p->next) { if(p->data!=q->data) { p=p->next;q=p->next; //当相邻两元素不相等时,p,q都向后推一步 } else { while(q->data==p->data) { free(q); q=q->next; } p->next=q;p=q;q=p->next; //当相邻元素相等时删除多余元素 }//else }//while}//Delete_Equal 2.21 void reverse(SqList &A)//顺序表的就地逆置{ for(i=1,j=A.length;iA.elem[j];}//reverse 2.22 void LinkList_reverse(Linklist &L)//链表的就地逆置;为简化算法,假设表长大于2{ p=L->next;q=p->next;s=q->next;p->next=NULL; while(s->next) { q->next=p;p=q; q=s;s=s->next; //把L的元素逐个插入新表表头 } q->next=p;s->next=q;L->next=s;}//LinkList_reverse分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头. 2.23 void merge1(LinkList &A,LinkList &B,LinkList &C)//把链表A和B合并为C,A和B的元素间隔排列,且使用原存储空间{ p=A->next;q=B->next;C=A; while(p&&q) { s=p->next;p->next=q; //将B的元素插入 if(s) { t=q->next;q->next=s; //如A非空,将A的元素插入 } p=s;q=t; }//while}//merge1 2.24 void reverse_merge(LinkList &A,LinkList &B,LinkList &C)//把元素递增排列的链表A和B合并为C,且C中元素递减排列,使用原空间{ pa=A->next;pb=B->next;pre=NULL; //pa和pb分别指向A,B的当前元素 while(pa||pb) { if(pa->datadata||!pb) { pc=pa;q=pa->next;pa->next=pre;pa=q; //将A的元素插入新表 } else { pc=pb;q=pb->next;pb->next=pre;pb=q; //将B的元素插入新表 } pre=pc; } C=A;A->next=pc; //构造新表头}//reverse_merge分析:本算法的思想是,按从小到大的顺序依次把A和B的元素插入新表的头部pc处,最后处理A或B的剩余元素. 2.25 void SqList_Intersect(SqList A,SqList B,SqList &C)//求元素递增排列的线性表A和B的元素的交集并存入C中{ i=1;j=1;k=0; while(A.elem[i]&&B.elem[j]) { if(A.elem[i]B.elem[j]) j++; if(A.elem[i]==B.elem[j]) { C.elem[++k]=A.elem[i]; //当发现了一个在A,B中都存在的元素, i++;j++; //就添加到C中 } }//while}//SqList_Intersect 2.26 void LinkList_Intersect(LinkList A,LinkList B,LinkList &C)//在链表结构上重做上题{ p=A->next;q=B->next; pc=(LNode*)malloc(sizeof(LNode)); C=pc; while(p&&q) { if(p->datadata) p=p->next; else if(p->data>q->data) q=q->next; else { s=(LNode*)malloc(sizeof(LNode)); s->data=p->data; pc->next=s;pc=s; p=p->next;q=q->next; } }//while}//LinkList_Intersect 2.27 void SqList_Intersect_True(SqList &A,SqList B)//求元素递增排列的线性表A和B的元素的交集并存回A中{ i=1;j=1;k=0; while(A.elem[i]&&B.elem[j]) { if(A.elem[i]B.elem[j]) j++; else if(A.elem[i]!=A.elem[k]) { A.elem[++k]=A.elem[i]; //当发现了一个在A,B中都存在的元素 i++;j++; //且C中没有,就添加到C中 } else {i++;j++;} }//while while(A.elem[k]) A.elem[k++]=0;}//SqList_Intersect_True 2.28 void LinkList_Intersect_True(LinkList &A,LinkList B)//在链表结构上重做上题{ p=A->next;q=B->next;pc=A; while(p&&q) { if(p->datadata) p=p->next; else if(p->data>q->data) q=q->next; else if(p->data!=pc->data) { pc=pc->next; pc->data=p->data; p=p->next;q=q->next; } }//while}//LinkList_Intersect_True 2.29 void SqList_Intersect_Delete(SqList &A,SqList B,SqList C) { i=0;j=0;k=0;m=0; //i指示A中元素原来的位置,m为移动后的位置 while(iC.elem[k]) k++; else { same=B.elem[j]; //找到了相同元素same while(B.elem[j]==same) j++; while(C.elem[k]==same) k++; //j,k后移到新的元素 while(inext;q=C->next;r=A-next; while(p&&q&&r) { if(p->datadata) p=p->next; else if(p->data>q->data) q=q->next; else { u=p->data; //确定待删除元素u while(r->next->datanext; //确定最后一个小于u的元素指针r if(r->next->data==u) { s=r->next; while(s->data==u) { t=s;s=s->next;free(t); //确定第一个大于u的元素指针s }//while r->next=s; //删除r和s之间的元素 }//if while(p->data=u) p=p->next; while(q->data=u) q=q->next; }//else }//while}//LinkList_Intersect_Delete 2.31 Status Delete_Pre(CiLNode *s)//删除单循环链表中结点s的直接前驱{ p=s; while(p->next->next!=s) p=p->next; //找到s的前驱的前驱p p->next=s; return OK;}//Delete_Pre 2.32 Status DuLNode_Pre(DuLinkList &L)//完成双向循环链表结点的pre域{ for(p=L;!p->next->pre;p=p->next) p->next->pre=p; return OK;}//DuLNode_Pre 2.33 Status LinkList_Divide(LinkList &L,CiList &A,CiList &B,CiList &C)//把单链表L的元素按类型分为三个循环链表.CiList为带头结点的单循环链表类型.{ s=L->next; A=(CiList*)malloc(sizeof(CiLNode));p=A; B=(CiList*)malloc(sizeof(CiLNode));q=B; C=(CiList*)malloc(sizeof(CiLNode));r=C; //建立头结点 while(s) { if(isalphabet(s->data)) { p->next=s;p=s; } else if(isdigit(s->data)) { q->next=s;q=s; } else { r->next=s;r=s; } }//while p->next=A;q->next=B;r->next=C; //完成循环链表}//LinkList_Divide 2.34 void Print_XorLinkedList(XorLinkedList L)//从左向右输出异或链表的元素值{ p=L.left;pre=NULL; while(p) { printf("%d",p->data); q=XorP(p->LRPtr,pre); pre=p;p=q; //任何一个结点的LRPtr域值与其左结点指针进行异或运算即得到其右结点指针 }}//Print_XorLinkedList 2.35 Status Insert_XorLinkedList(XorLinkedList &L,int x,int i)//在异或链表L的第i个元素前插入元素x{ p=L.left;pre=NULL; r=(XorNode*)malloc(sizeof(XorNode)); r->data=x; if(i==1) //当插入点在最左边的情况 { p->LRPtr=XorP(p.LRPtr,r); r->LRPtr=p; L.left=r; return OK; } j=1;q=p->LRPtr; //当插入点在中间的情况 while(++jLRPtr,pre); pre=p;p=q; }//while //在p,q两结点之间插入 if(!q) return INFEASIBLE; //i不可以超过表长 p->LRPtr=XorP(XorP(p->LRPtr,q),r); q->LRPtr=XorP(XorP(q->LRPtr,p),r); r->LRPtr=XorP(p,q); //修改指针 return OK;}//Insert_XorLinkedList 2.36 Status Delete_XorLinkedList(XorlinkedList &L,int i)//删除异或链表L的第i个元素{ p=L.left;pre=NULL; if(i==1) //删除最左结点的情况 { q=p->LRPtr; q->LRPtr=XorP(q->LRPtr,p); L.left=q;free(p); return OK; } j=1;q=p->LRPtr; while(++jLRPtr,pre); pre=p;p=q; }//while //找到待删结点q if(!q) return INFEASIBLE; //i不可以超过表长 if(L.right==q) //q为最右结点的情况 { p->LRPtr=XorP(p->LRPtr,q); L.right=p;free(q); return OK; } r=XorP(q->LRPtr,p); //q为中间结点的情况,此时p,r分别为其左右结点 p->LRPtr=XorP(XorP(p->LRPtr,q),r); r->LRPtr=XorP(XorP(r->LRPtr,q),p); //修改指针 free(q); return OK;}//Delete_XorLinkedList 2.37 void OEReform(DuLinkedList &L)//按1,3,5,...4,2的顺序重排双向循环链表L中的所有结点{ p=L.next; while(p->next!=L&&p->next->next!=L) { p->next=p->next->next; p=p->next; } //此时p指向最后一个奇数结点 if(p->next==L) p->next=L->pre->pre; else p->next=l->pre; p=p->next; //此时p指向最后一个偶数结点 while(p->pre->pre!=L) { p->next=p->pre->pre; p=p->next; } p->next=L; //按题目要求调整了next链的结构,此时pre链仍为原状 for(p=L;p->next!=L;p=p->next) p->next->pre=p; L->pre=p; //调整pre链的结构,同2.32方法}//OEReform分析:next链和pre链的调整只能分开进行.如同时进行调整的话,必须使用堆栈保存偶数结点的指针,否则将会破坏链表结构,造成结点丢失. 2.38 DuLNode * Locate_DuList(DuLinkedList &L,int x)//带freq域的双向循环链表上的查找{ p=L.next; while(p.data!=x&&p!=L) p=p->next; if(p==L) return NULL; //没找到 p->freq++;q=p->pre; while(q->freq<=p->freq&&p!=L) q=q->pre; //查找插入位置 if(q!=p->pre) { p->pre->next=p->next;p->next->pre=p->pre; q->next->pre=p;p->next=q->next; q->next=p;p->pre=q; //调整位置 } return p;}//Locate_DuList 2.39 float GetValue_SqPoly(SqPoly P,int x0)//求升幂顺序存储的稀疏多项式的值{ PolyTerm *q; xp=1;q=P.data; sum=0;ex=0; while(q->coef) { while(exexp) xp*=x0; sum+=q->coef*xp; q++; } return sum;}//GetValue_SqPoly 2.40 void Subtract_SqPoly(SqPoly P1,SqPoly P2,SqPoly &P3)//求稀疏多项式P1减P2的差式P3{ PolyTerm *p,*q,*r; Create_SqPoly(P3); //建立空多项式P3 p=P1.data;q=P2.data;r=P3.data; while(p->coef&&q->coef) { if(p->expexp) { r->coef=p->coef; r->exp=p->exp; p++;r++; } else if(p->expexp) { r->coef=-q->coef; r->exp=q->exp; q++;r++; } else { if((p->coef-q->coef)!=0) //只有同次项相减不为零时才需要存入P3中 { r->coef=p->coef-q->coef; r->exp=p->exp;r++; }//if p++;q++; }//else }//while while(p->coef) //处理P1或P2的剩余项 { r->coef=p->coef; r->exp=p->exp; p++;r++; } while(q->coef) { r->coef=-q->coef; r->exp=q->exp; q++;r++; }}//Subtract_SqPoly 2.41 void QiuDao_LinkedPoly(LinkedPoly &L)//对有头结点循环链表结构存储的稀疏多项式L求导{ p=L->next; if(!p->data.exp) { L->next=p->next;p=p->next; //跳过常数项 } while(p!=L) { p->data.coef*=p->data.exp--;//对每一项求导 p=p->next; }}//QiuDao_LinkedPoly 2.42 void Divide_LinkedPoly(LinkedPoly &L,&A,&B)//把循环链表存储的稀疏多项式L拆成只含奇次项的A和只含偶次项的B{ p=L->next; A=(PolyNode*)malloc(sizeof(PolyNode)); B=(PolyNode*)malloc(sizeof(PolyNode)); pa=A;pb=B; while(p!=L) { if(p->data.exp!=2*(p->data.exp/2)) { pa->next=p;pa=p; } else { pb->next=p;pb=p; } p=p->next; }//while pa->next=A;pb->next=B; }//Divide_LinkedPoly

第六题选B,因为完全二叉树的深度h满足:2^i-1=100;可以算出i=7时为128;

  •   索引序列
  •   数据结构自考教材答案解析
  •   数据结构自考教材答案解析书
  •   数据结构导论自考教材答案解析
  •   自考数据结构导论教材答案解析
  •   2020自考数据结构答案解析
  •   返回顶部

自考地区