数据结构作业题及结果解析

上传人:豆浆 文档编号:20381164 上传时间:2017-11-22 格式:DOC 页数:6 大小:61.50KB
返回 下载 相关 举报
数据结构作业题及结果解析_第1页
第1页 / 共6页
数据结构作业题及结果解析_第2页
第2页 / 共6页
数据结构作业题及结果解析_第3页
第3页 / 共6页
数据结构作业题及结果解析_第4页
第4页 / 共6页
数据结构作业题及结果解析_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《数据结构作业题及结果解析》由会员分享,可在线阅读,更多相关《数据结构作业题及结果解析(6页珍藏版)》请在金锄头文库上搜索。

1、数据结构作业题及答案第一章 绪论1、简述下列概念:数据、数据元素、数据结构、逻辑结构、存储结构、线性结构、非线性结构。数据:指能够被计算机识别、存储和加工处理的信息载体。数据元素:就是数据的基本单位,在某些情况下,数据元素也称为元素、结点、顶点、记录。数据元素有时可以由若干数据项组成。数据结构:指的是数据之间的相互关系,即数据的组织形式。一般包括三个方面的内容:数据的逻辑结构、存储结构和数据的运算。逻辑结构:指各数据元素之间的逻辑关系。存储结构:就是数据的逻辑结构用计算机语言的实现。线性结构:数据逻辑结构中的一类,它的特征是若结构为非空集,则该结构有且只有一个开始结点和一个终端结点,并且所有结

2、点都最多只有一个直接前趋和一个直接后继。线性表就是一个典型的线性结构。非线性结构:数据逻辑结构中的另一大类,它的逻辑特征是一个结点可能有多个直接前趋和直接后继。2、常用的存储表示方法有哪几种?顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构。索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。散列存储方法:就是根据结点的关键字直接计算出该结点的

3、存储地址。3、求解下列算法的时间复杂度(1) i=1; k=0 while(i1 while (x=(y+1)*(y+1)y+; T(n)=n1/2 T(n)=O(n 1/2)最坏的情况是 y=0,那么循环的次数是 n1/2次,这是一个按平方根阶递增的函数。(5) x=91; y=100; while(y0)if(x100)x=x-10;y-;else x+;T(n)=O(1)这个程序看起来有点吓人,总共循环运行了 1000 次,但是我们看到 n 没有? 没。这段程序的运行是和 n 无关的,就算它再循环一万年,我们也不管他,只是一个常数阶的函数。第二章 线性表1、试描述头指针、头结点、开始结点

4、的区别、并说明头指针和头结点的作用。答:开始结点是指链表中的第一个结点,也就是没有直接前趋的那个结点。链表的头指针是一指向链表开始结点的指针(没有头结点时) ,单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。头结点是我们人为地在链表的开始结点之前附加的一个结点。有了头结点之后,头指针指向头结点,不论链表否为空,头指针总是非空。而且头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致(都是在某一结点之后 )。2、何时选用顺序表、何时选用链表作为线性表的存储结构为宜?答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考

5、虑:1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。2.基于时间的考虑。若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之, 若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。3、在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素?答:在等概率情况下,顺序表中插入一个结点需平均移动 n/2 个结点。

6、删除一个结点需平均移动(n-1)/2 个结点。具体的移动次数取决于顺序表的长度 n 以及需插入或删除的位置 i。i 越接近 n 则所需移动的结点数越少。4、设顺序表 L 是一个递增有序表,试写一算法,将 x 插入 L 中,并使 L 仍是一个有序表。因已知顺序表 L 是递增有序表,所以只要从头找起找到第一个比它大(或相等) 的结点数据,把 x 插入到这个数所在的位置就是了。算法如下:void InsertIncreaseList( Seqlist *L , Datatype x )int i;for ( i=0 ; i length & L-data i next & p-next-datax

7、)p=p-next;s=(ListNode *)malloc(sizeof(ListNode); s-data=x;s-next=p-next;p-next=s;return L;6、写一算法将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同。先取开始结点中的值,将它与其后的所有结点值一一比较,发现相同的就删除掉,然后再取第二结点的值,重复上述过程直到最后一个结点。void DeleteList(Nodetype *L)Nodetype *p,*q,*s;if(L-Next=NULL|L-Next=NULL)printf(删除错误n);exit(0);p=L-Next;q=p-Nex

8、t;while(p-Next!=NULL)while(q)s=q;if(q-Data=p-Data)s-Next=q-Next;free(q);q=s-Next;elseq=q-Next;p=p-Next;第三章 栈与队列1、简述栈的逻辑结构、存储结构及其相关算法答:栈的逻辑结构和线性表相同,如果它是非空的,则有且只有一个开始结点,有且只能有一个终端结点,其它的结点前后所相邻的也只能是一个结点(直接前趋和直接后继), 但是栈的运算规则与线性表相比有更多的限制,栈(Stack)是仅限制在表的一端进行插入和删除运算的线性表,通常称插入、删除这一端为栈顶,另一端称为栈底。表中无元素时为空栈。栈的修改

9、是按后进先出的原则进行的,我们又称栈为LIFO 表(Last In First Out)。由于栈也是线性表,因此栈有顺序栈和链栈两种存储结构栈的基本运算有六种:构造空栈:InitStack(S)、判栈空: StackEmpty(S)、判栈满: StackFull(S)、进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素退栈: Pop(S) 、 可形象地理解为弹出,弹出后栈中就无此元素了。取栈顶元素:StackTop(S), 不同与弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变。2、简述队列的逻辑结构、存储结构及其相关算法。答:队列是一种运算受限的线性表,它的运算限制与栈不

10、同,是两头都有限制,插入只能在表的一端进行(只进不出) ,而删除只能在表的另一端进行(只出不进) ,允许删除的一端称为队尾(rear),允许插入的一端称为队头 (Front) ,队列的操作原则是先进先出的,所以队列又称作 FIFO 表(First In First Out)。队列也有顺序存储和链式存储两种存储结构,前者称顺序队列,后者为链队。队列的基本运算也有六种:置空队 :InitQueue(Q)判队空: QueueEmpty(Q)判队满: QueueFull(Q)入队 : EnQueue(Q,x)出队 : DeQueue(Q)取队头元素: QueueFront(Q),不同与出队,队头元素仍

11、然保留3、简述顺序队列假上溢 的现象出现的原因。答:因为我们的队列是存储在一个向量空间里,在这一段连续的存储空间中,由一个队列头指针和一个尾指针表示这个队列,当头指针和尾指针指向同一个位置时,队列为空,也就是说,队列是由两个指针中间的元素构成的。在队列中,入队和出队并不是象现实中,元素一个个地向前移动,走完了就没有了,而是指针在移动,当出队操作时,头指针向前(即向量空间的尾部) 增加一个位置,入队时,尾指针向前增加一个位置,在某种情况下,比如说进一个出一个,两个指针就不停地向前移动,直到队列所在向量空间的尾部,这时再入队的话,尾指针就要跑到向量空间外面去了,仅管这时整个向量空间是空的,队列也是

12、空的,却产生了上溢 现象,这就是假上溢。4、设计算法判断一个算术表达式的圆括号是否正确配对。对表达式进行扫描,凡遇到“(”就进栈,遇“) ”就退掉栈顶的 “(”,表达式被扫描完毕,栈为空。表示圆括号匹配。否则圆括号不匹配。int PairBracket( char *S)/检查表达式中括号是否配对int i;SeqStack T; /定义一个栈InitStack (&T);for (i=0; istrlen(S) ; i+)if ( Si=( ) Push(&T, Si); /遇(时进栈if ( Si=) ) Pop(&T); /遇)时出栈return !EmptyStack(&T); / 由

13、栈空否返回正确配对与否第四章 串1、简述下列每对术语的区别:空串和空白串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串;目标串和模式串;有效位移和无效位移。答:空串是指不包含任何字符的串,它的长度为零。空白串是指包含一个或多个空格的串,空格也是字符。串常量是指在程序中只可引用但不可改变其值的串。串变量是可以在运行中改变其值的。主串和子串是相对的,一个串中任意个连续字符组成的串就是这个串的子串,而包含子串的串就称为主串。静态分配的顺序串是指串的存储空间是确定的,即串值空间的大小是静态的,在编译时刻就被确定。动态分配的顺序串是在编译时不分配串值空间,在运行过程中用 malloc

14、和 free 等函数根据需要动态地分配和释放字符数组的空间(这个空间长度由分配时确定,也是顺序存储空间) 。目标串和模式串:在串匹配运算过程中,将主串称为目标串,而将需要匹配的子串称为模式串,两者是相对的。有效位移和无效位移:在串定位运算中,模式串从目标的首位开始向右位移,每一次合法位移后如果模式串与目标中相应的字符相同,则这次位移就是有效位移(也就是从此位置开始的匹配成功) ,反之,若有不相同的字符存在,则此次位移就是无效位移(也就是从此位置开始的匹配失败) 。2、假设有如下的串说明:char s130=Stocktom,CA, s230=March 5 1999, s330, *p;(1)

15、在执行如下的每个语句后 p 的值是什么?p=stchr(s1,t); p=strchr(s2,9); p=strchr(s2,6);答:stchr(*s,c)函数的功能是查找字符 c 在串 s 中的位置,若找到,则返回该位置,否则返回 NULL。因此:执行 p=stchr(s1,t);后 p 的值是指向字符 t 的位置, 也就是 p=&s15。执行 p=strchr(s2,9);后 p 的值是指向 s2 串中第一个 9 所在的位置,也就是 p=&s29。执行 p=strchr(s2,6);之后,p 的返回值是 NULL。(2)在执行下列语句后,s3 的值是什么 ?strcpy(s3,s1);

16、strcat(s3,); strcat(s3,s2);答:strcpy 函数功能是串拷贝,strcat 函数的功能是串联接。所以:在执行 strcpy(s3,s1); 后,s3 的值是Stocktom,CA在执行 strcat(s3,); 后,s3 的值变成Stocktom,Ca,在执行完 strcat(s3,s2);后,s3 的值就成了Stocktom,Ca,March 5,1999(3)调用函数 strcmp(s1,s2)的返回值是什么 ?答:函数 strcmp(串 1,串 2)的功能是串比较,按串的大小进行比较,返回大于 0,等于 0 或小于 0 的值以表示串 1 比串 2 大,串 1 等于串 2 ,串 1 小于串 2。因此在调

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 经济/贸易/财会 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号