第一范文网 - 专业文章范例文档资料分享平台

数 据 结 构 习 题 集

来源:用户分享 时间:2025/11/28 10:04:57 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

(4)从带有附加表头结点的循环单链表中删除其值等于x的第一个结点。 (4) 解答:status delete(HL,x) { (1) q=HL; p=HL->next;

(2) while (p!=HL) && (p->data!=x) { q=p;

p=p->next;

}

(3) if (p= =HL) error('not found'); else {q->next=p->next; free(p); }

}

(5)在单链表中指针p所指结点之前插入一个值为x的新结点。 (5) 解答:status insert(HL,p,x){

malloc(q);

q->data=p->data; q->next=p->next; p->next=q; p->data=x; }

(6)从循环单链表中查找出最小值。 (6) 解答: elemtype min(HL){ //从循环单链表HL中查找出最小值 if (HL= =nil ) {

printf('HL=nil'); return; }

min=HL->data; p=HL->next;

while (p!=HL) {

(1) if (p->datadata; (2) p=p->next; }

}

(7)根据一维数组A(1:n)中顺序存储的具有n个元素的线性表建立一个带有附加表头结 点的单链表。

(7) 解答:status create(HL,A,n) {

(1) malloc(HL); q=HL; // 产生附加表头结点 (2) for (i=1 ;I<=n ;++i) { // 完成n个元素的依次链接 malloc(p);

p->data=A(i); q->next=p; q=p;

}

(3) q->next=nil ; // 把最后一个结点的指针域置空

17

}

23.请指出下面的过程执行p(5)和p(6)时分别输出的结果。 void P(int n); { if n>0 {

p(n-2);

printf(“%d”,n);

} }

23. 解答:这是一个递归过程,n执行一次就减2,当n≤0时该过程执行结束。因此,当n=5 时,其输出结果为1、3、5;当n=6时,其输出结果为2、4、6。 24.假定用一个循环单链表表示队列(称此为循环链队),该队列只设一个队尾指针, 不设队首指针,试编写下列算法:

(1)向循环链队插入一个元素为x的结点;

(1) 解答:status insert(Rear,x){

// 假定Rear为循环链队的队尾指针,x为待插入的元素 (1) malloc(p);

p->data=x; // 建立值为x的新结点p^ (2) if( Rear=nil){

Rear=p; Rear->next=p; }

else {p->next=Rear->next;

Rear->next=p; Rear=p;

}

// 若条件成立则建立循环链队的第一个结点,否则在队尾插入p^结点 }

(2)从循环链队中删除一个结点(假定不需要保留被删除结点的值和不需要回收结点)。 (2) 解答:status delete(Rear){

if( Rear=nil ) error('underflow'); if (Rear->next= =Rear) Rear=nil;

else Rear->next=Rear->next->next;

} //Rear^.next 所指向的结点为循环链队的队首结点

25.设A(k)有如下10个元素:2,4,6,8,10,12,14,16,18,20。若对A(k)分别查找x=1,3,13,21,试跟踪下面过程的执行,并分析该程序段关于n的计算时间。 【程序段】 i=1;j=n; do

18

{

k=(i+j)/2;

if A(k)<=x i=k+1 else j=k-1 }while !(i>j);

25.解答

(1)查找x=1,n=10

┏━━━┳━┳━┳━┳━━━━┳━━━━━━━┓ ┃ ┃i ┃j ┃k ┃A(k)? X ┃ ┃ ┣━━━╋━╋━╋━╋━━━━╋━━━━━━━┫ ┃第1次┃1 ┃10┃5 ┃ 10 > 1 ┃ 新j=k-1=4 ┃ ┃第2次┃1 ┃4 ┃2 ┃ 4 > 1 ┃ 新j=k-1=1 ┃ ┃第3次┃1 ┃1 ┃1 ┃ 2 > 1 ┃ 新j=k-1=0 ┃ ┗━━━┻━┻━┻━┻━━━━┻━━━━━━━┛ 当(i=1)>(j=0)时,过程终止。未找到。

(2)查找x=3,n=10

┏━━━┳━┳━┳━┳━━━━┳━━━━━━━┓ ┃ ┃i ┃j ┃k ┃A(k)? x ┃ ┃ ┣━━━╋━╋━╋━╋━━━━╋━━━━━━━┫ ┃第1次┃1 ┃10┃5 ┃ 10 > 3 ┃ 新j=k-1=4 ┃ ┃第2次┃1 ┃4 ┃2 ┃ 4 > 3 ┃ 新j=k-1=1 ┃ ┃第3次┃1 ┃1 ┃1 ┃ 2 < 3 ┃ 新i=k+1=2 ┃ ┗━━━┻━┻━┻━┻━━━━┻━━━━━━━┛ 当(i=2)>(j=1)时,过程终止。未找到。

(3)查找x=13,n=10

┏━━━┳━┳━┳━┳━━━━┳━━━━━━━┓ ┃ ┃i ┃j ┃k ┃A(k)? x ┃ ┃ ┣━━━╋━╋━╋━╋━━━━╋━━━━━━━┫ ┃第1次┃1 ┃10┃5 ┃ 10 <13 ┃ 新i=k+1=6 ┃ ┃第2次┃6 ┃10┃8 ┃ 16 >13 ┃ 新j=k-1=7 ┃ ┃第3次┃6 ┃7 ┃6 ┃ 12 <13 ┃ 新i=k+1=7 ┃ ┃第4次┃7 ┃7 ┃7 ┃ 14 >13 ┃ 新j=k-1=6 ┃ ┗━━━┻━┻━┻━┻━━━━┻━━━━━━━┛ 当(i=7)>(j=6)时,过程终止。未找到。 (4)查找x=21,n=10

┏━━━┳━┳━┳━┳━━━━┳━━━━━━━┓ ┃ ┃i ┃j ┃k ┃ A(k)? x ┃ ┃ ┣━━━╋━╋━╋━╋━━━━╋━━━━━━━┫ ┃第1次┃1 ┃10┃5 ┃ 10 <21 ┃ 新i=k+1=6 ┃ ┃第2次┃6 ┃10┃8 ┃ 16 <21 ┃ 新i=k+1=9 ┃ ┃第3次┃9 ┃10┃9 ┃ 18 <21 ┃ 新i=k+1=10┃ ┃第4次┃10┃10┃10┃ 20 <21 ┃ 新i=k+1=11┃ ┗━━━┻━┻━┻━┻━━━━┻━━━━━━━┛

19

当(i=11)>(j=10)时,过程终止,未找到。该程序段的时间复杂型为O(log2 n)。

**26.分别写出对二叉树进行中根遍历和先根遍历的非递归算法(不允许使用转向语句)。 26. 解答:中根遍历的非递归算法: status inorder(bt){ top=0; p=bt; do{

(1) while (p!=nil ){ top=top+1; s[top]=p;

p:=p->left; //p指向左子树 }

(2) if (top>0 ){

p=s[top]; top=top-1;

printf(p->data);

p=p->right; // p指向右子树 }

}while !((top=0) && (p=nil)); }

解答: 先根遍历的非递归算法: status preorder(bt) { top=0; p=bt do{

(1) while( p!=nil ){

printf (p->data); if (p->right!=nil){ top=top+1;

s[top]=p->right;

}

//若右子树非空,则把链接指针保存起来, 待访问过左子树后再访问它 p=p->left; //使p指向左子树 }

(2) if (top>0) { // 出栈,使p指向右子树 p=s[top] top=top-1; }

}while !((top=0) && (p=nil));

20

搜索更多关于: 数 据 结 构 习 题 集 的文档
数 据 结 构 习 题 集.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c9nr137nuif9acj39pw9x_5.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top