数据结构作业及答案1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章
2.22 试写一算法,对单链表实现就地逆置,即利用原表的存储空间将线性表
(a1,a2,…,an)逆置为(an,an-1,…,a1)
提示:将原链表中的头结点和第一个元素结点断开(令其指针域为空),先构成一个空表,然后将原链表中各结点从第一个结点起依次插入这个新表的头部。
答: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为新表表头.
第三章
3.1 设将整数1、2、3、4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下有问题:
(1)若入栈次序为push(1),pop(),push(2),push(3),pop(),pop( ),push(4),pop( ),则出栈的数字序列为什么?
(2) 能否得到出栈序列1423和1432?并说明为什么不能得到或者如何得到。
答:(1)1 3 2 4 后进先出,先进后出
(2) 1423无法得到,因为只能这样操作,Push(1), Pop(), Push(2), Push(3), Push(4), Pop(),Pop(), Pop(),结果序列是1432
3.12 写出以下程序段的输出结果(队列中的元素类型QElemType 为char)。
Void main( ){
Queue Q; InitQueue(Q);
Char x=‘e’, y=‘c’;
EnQueue(Q, ‘h’); EnQueue(Q, ‘r’); EnQueue(Q, y);
DeQueue(Q, x); EnQueue(Q, x);
DeQueue(Q, x); EnQueue(Q, ‘a’);
While ( !QueueEmpty(Q) ){
DeQueue(Q, y);
Printf(y);
}
Printf(x);
}
答:输出结果是char。
EnQueue (Q,’h’); EnQueue (Q,’r’); EnQueue (Q, y); //hrc入队此时队列是'hrc'(h是头)
DeQueue (Q,x); EnQueue (Q,x); //'h'赋给x出队,然后x再入队此时x='h'即h入队,此时队列是‘rch’。
DeQueue (Q,x); EnQueue (Q,’a’); //‘r’赋给x出队,‘a’入队,此时队列是‘cha’while(!QueueEmpty(Q)){ DeQueue (Q,y);printf(y);}; //当队列不为空时依次把队列中元素赋给y出列,并打印。此时打印出的是cha
Printf(x); //打印x的值就是前面赋给x的‘r’ 所以打印出的是char
第四章
4.3 设s=‘I AM A STUDENT’,t=‘GOOD’,q=‘WORKER’,求:
(1)StrLength(s),StrLength(t)
(2)SubString(s, 8, 7) ,SubString(t, 2, 1)
(3)Index(s, ‘A’,1),Index(s,t,3)
(4)Replace(s, ‘STUDENT’, q)
(5)Concat(SubString(s,6,2),Concat(t,SubString(s,7,8)))
答:
1) 14,4
2) STUDENT,O
3) 3,0
4) "I AM A WORKER"
5) "A GOOD WORKER"
第五章
5.1 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A 的起始存储位置(基地址)为1000,计算:
(1)数组A的体积(即存储量);
(2)数组A的最后一个元素a57的第一个字节的地址;
(3)按行存储时,元素a14的第一个字节的地址;
(4)按列存储时,元素a47的第一个字节的地址。
答:(1)数组A的体积为6×8×6=288字节。
(2)LOC(5,7)=LOC(0,0)+(5*8+7)*6=1000+282=1282
(3) LOC(1,4)=LOC(0,0)+(1*8+4)*6=1000+72=1072
(4)按列存储LOC(4,7)=LOC(0,0)+(7*6+4)*6=1000+276=1276
5.10 求下列广义表操作的结果:
(1)GetHead( (p, h, w) );
(4)GetTail( ((a ,b) ,(c ,d)) );
(5)GetHead ( GetTail ( ((a,b),(c,d)) ) )。
答:(1)head ((p,h,w))=p;
(4)tail(((a,b),(c,d)))=((c,d));
(5)head(tail(((a,b),(c,d))))=(c,d);
5.12 按教科书5.5节中图5.8所示结点结构,画出下列广义表的存储结构图,并求它的深度。(1)( ( ( ) ) , a , ( ( b , c ) , ( ) , d ) , ( ( ( e ) ) ) )
(2)( ( ( ( a ) , b ) ) , ( ( ( ) , d ) , ( e , f ) ) )
答:
(1)和(2)深度都为4.
第六章
1 在结点个数为n(n>1)的各棵树中,高度最小的树的高度是多少?它有多少个叶结点?多少个分支结点?高度最大的树的高度是多少?它有多少个叶结点?多少个分支结点?
【解答】结点个数为n时,高度最小的树的高度为1,有2层;它有n-1个叶结点,1个分支结点;高度最大的树的高度为n-1,有n层;它有1个叶结点,n-1个分支结点。
2已知一棵二叉树的前序遍历的结果是ABECDFGHIJ, 中序遍历的结果是EBCDAFHIGJ, 试画出这棵二叉树。
【解答】
当前序序列为ABECDFGHIJ,中序序列为EBCDAFHIGJ时,逐步形成二叉树的过程如