数据构造作业题及答案第一章绪论1、简述以下概念:数据、数据元素、数据构造、逻辑构造、存储构造、线性构造、非线性构造。
数据:指能够被计算机识别、存储与加工处理的信息载体。
数据元素:就是数据的根本单位,在某些情况下,数据元素也称为元素、结点、顶点、记录。
数据元素有时可以由假设干数据项组成。
数据构造:指的是数据之间的相互关系,即数据的组织形式。
一般包括三个方面的内容:数据的逻辑构造、存储构造与数据的运算。
逻辑构造:指各数据元素之间的逻辑关系。
存储构造:就是数据的逻辑构造用计算机语言的实现。
线性构造:数据逻辑构造中的一类,它的特征是假设构造为非空集,那么该构造有且只有一个开场结点与一个终端结点,并且所有结点都最多只有一个直接前趋与一个直接后继。
线性表就是一个典型的线性构造。
非线性构造:数据逻辑构造中的另一大类,它的逻辑特征是一个结点可能有多个直接前趋与直接后继。
2、常用的存储表示方法有哪几种?顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来表达。
由此得到的存储表示称为顺序存储构造。
链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。
由此得到的存储表示称为链式存储构造。
索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。
3、求解以下算法的时间复杂度第二章线性表1、试描述头指针、头结点、开场结点的区别、并说明头指针与头结点的作用。
答:开场结点是指链表中的第一个结点,也就是没有直接前趋的那个结点。
链表的头指针是一指向链表开场结点的指针(没有头结点时),单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。
头结点是我们人为地在链表的开场结点之前附加的一个结点。
有了头结点之后,头指针指向头结点,不管链表否为空,头指针总是非空。
而且头指针的设置使得对链表的第一个位置上的操作及在表其他位置上的操作一致(都是在某一结点之后)。
2、何时选用顺序表、何时选用链表作为线性表的存储构造为宜?答:在实际应用中,应根据具体问题的要求与性质来选择顺序表或链表作为线性表的存储构造,通常有以下几方面的考虑:1.基于空间的考虑。
当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储构造为好。
2.基于时间的考虑。
假设线性表的操作主要是进展查找,很少做插入与删除操作时,采用顺序表做存储构造为宜;反之,假设需要对线性表进展频繁地插入或删除等的操作时,宜采用链表做存储构造。
并且,假设链表的插入与删除主要发生在表的首尾两端,那么采用尾指针表示的单循环链表为宜。
3、在顺序表中插入与删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素?答:在等概率情况下,顺序表中插入一个结点需平均移动n/2个结点。
删除一个结点需平均移动(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 < L -> length && L->data[ i ] < x ; i++) ; // 查找并比拟,分号不能少InsertList ( L ,x , i ); // 调用顺序表插入函数5、设单链表L是一个递减有序表,试写一算法,将x插入其后仍保持L的有序性。
只要从头找到第一个比x小(或相等)的结点数据,在这个位置插入就可以了。
算法如下:LinkList InsertDecreaseList( Linklist L, Datatype x )int i;ListNode *p,*s;p=L;//查找while(p->next && p->next->data>x )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->Next;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)是仅限制在表的一端进展插入与删除运算的线性表,通常称插入、删除这一端为栈顶,另一端称为栈底。
表中无元素时为空栈。
栈的修改是按后进先出的原那么进展的,我们又称栈为LIFO表(Last In First Out)。
由于栈也是线性表,因此栈有顺序栈与链栈两种存储构造栈的根本运算有六种:构造空栈:InitStack(S)、判栈空: StackEmpty(S)、判栈满:StackFull(S)、进栈:Push(S,x)、可形象地理解为压入,这时栈中会多一个元素退栈:Pop(S) 、可形象地理解为弹出,弹出后栈中就无此元素了。
取栈顶元素:StackTop(S),不同及弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变。
2、简述队列的逻辑构造、存储构造及其相关算法。
答:队列是一种运算受限的线性表,它的运算限制及栈不同,是两头都有限制,插入只能在表的一端进展(只进不出),而删除只能在表的另一端进展(只出不进),允许删除的一端称为队尾(rear),允许插入的一端称为队头(Front) ,队列的操作原那么是先进先出的,所以队列又称作FIFO表(First In First Out)。
队列也有顺序存储与链式存储两种存储构造,前者称顺序队列,后者为链队。
队列的根本运算也有六种:置空队:InitQueue(Q)判队空:QueueEmpty(Q)判队满:QueueFull(Q)入队:EnQueue(Q,x)出队:DeQueue(Q)取队头元素:QueueFront(Q),不同及出队,队头元素仍然保存3、简述顺序队列"假上溢"的现象出现的原因。
答:因为我们的队列是存储在一个向量空间里,在这一段连续的存储空间中,由一个队列头指针与一个尾指针表示这个队列,当头指针与尾指针指向同一个位置时,队列为空,也就是说,队列是由两个指针中间的元素构成的。
在队列中,入队与出队并不是象现实中,元素一个个地向前移动,走完了就没有了,而是指针在移动,当出队操作时,头指针向前(即向量空间的尾部)增加一个位置,入队时,尾指针向前增加一个位置,在某种情况下,比方说进一个出一个,两个指针就不停地向前移动,直到队列所在向量空间的尾部,这时再入队的话,尾指针就要跑到向量空间外面去了,仅管这时整个向量空间是空的,队列也是空的,却产生了"上溢"现象,这就是假上溢。
4、设计算法判断一个算术表达式的圆括号是否正确配对。
对表达式进展扫描,凡遇到“(〞就进栈,遇“)〞就退掉栈顶的“(〞,表达式被扫描完毕,栈为空。
表示圆括号匹配。
否那么圆括号不匹配。
int PairBracket( char *S)//检查表达式中括号是否配对int i;SeqStack T; //定义一个栈InitStack (&T);for (i=0; i<strlen(S) ; i++)if ( S[i]=='(' ) Push(&T, S[i]); //遇'('时进栈if ( S[i]==')' ) Pop(&T); //遇')'时出栈return !EmptyStack(&T); // 由栈空否返回正确配对及否第四章串1、简述以下每对术语的区别:空串与空白串;串常量与串变量;主串与子串;静态分配的顺序串与动态分配的顺序串;目标串与模式串;有效位移与无效位移。
答:空串是指不包含任何字符的串,它的长度为零。
空白串是指包含一个或多个空格的串,空格也是字符。
串常量是指在程序中只可引用但不可改变其值的串。
串变量是可以在运行中改变其值的。
主串与子串是相对的,一个串中任意个连续字符组成的串就是这个串的子串,而包含子串的串就称为主串。
静态分配的顺序串是指串的存储空间是确定的,即串值空间的大小是静态的,在编译时刻就被确定。
动态分配的顺序串是在编译时不分配串值空间,在运行过程中用malloc与free 等函数根据需要动态地分配与释放字符数组的空间(这个空间长度由分配时确定,也是顺序存储空间)。
目标串与模式串:在串匹配运算过程中,将主串称为目标串,而将需要匹配的子串称为模式串,两者是相对的。
有效位移与无效位移:在串定位运算中,模式串从目标的首位开场向右位移,每一次合法位移后如果模式串及目标中相应的字符一样,那么这次位移就是有效位移(也就是从此位置开场的匹配成功),反之,假设有不一样的字符存在,那么此次位移就是无效位移(也就是从此位置开场的匹配失败)。
2、假设有如下的串说明:char s1[30]="Stocktom,CA", s2[30]="March 5 1999", s3[30], *p;(1)在执行如下的每个语句后p的值是什么?p=stchr(s1,'t'); p=strchr(s2,'9'); p=strchr(s2,'6');答:stchr(*s,c)函数的功能是查找字符c在串s中的位置,假设找到,那么返回该位置,否那么返回NULL。