数据结构习题课-数据结构习题课2

合集下载

数据结构课后习题答案详解C语言版严蔚敏

数据结构课后习题答案详解C语言版严蔚敏

数据结构习题集答案(C语言版严蔚敏)第2章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

解:头指针是指向链表中第一个结点的指针。

首元结点是指链表中存储第一个数据元素的结点。

头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。

它可以对空表、非空表以及首元结点的操作进行统一处理。

2.2 填空题。

解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。

(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。

单链表中逻辑上相邻的元素的物理位置不一定紧邻。

(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。

(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。

2.3 在什么情况下用顺序表比链表好解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。

2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。

解:2.5 画出执行下列各行语句后各指针及链表的示意图。

L=(LinkList)malloc(sizeof(LNode)); P=L;for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode));P=P->next; P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是__________________。

数据结构课后习题及解析第二章

数据结构课后习题及解析第二章
利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。
例如m的初值为20;n=7,7个人的密码依次是:3,1,7,2,4,8,4,出列的顺序为6,1,4,7,2,3,5。
第二章答案
约瑟夫环问题
约瑟夫问题的一种描述为:编号1,2,…,n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。
9.假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前趋结点。
10.已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符),试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。
r=p;
}
}
r->next=L->next;
printf("请输入第一个报数上限值m(m>0):");
scanf("%d",&m);
printf("*****************************************\n");
printf("出列的顺序为:\n");
q=L;
p=L->next;
7.试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2..., an)逆置为(an, an-1,..., a1)。

数据结构习题和答案及解析

数据结构习题和答案及解析

第 1 章绪论课后习题讲解1. 填空⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑与处理。

【解答】数据元素⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。

【解答】数据项,数据元素【分析】数据结构指的是数据元素以及数据元素之间的关系。

⑶从逻辑关系上讲,数据结构主要分为()、()、()与()。

【解答】集合,线性结构,树结构,图结构⑷数据的存储结构主要有()与()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()与()。

【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系⑸算法具有五个特性,分别是()、()、()、()、()。

【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性⑹算法的描述方法通常有()、()、()与()四种,其中,()被称为算法语言。

【解答】自然语言,程序设计语言,流程图,伪代码,伪代码⑺在一般情况下,一个算法的时间复杂度是()的函数。

【解答】问题规模⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。

【解答】Ο(1),Ο(nlog2n)【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。

2. 选择题⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。

A 线性结构B 非线性结构C 存储位置D 指针【解答】C,D【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。

⑵假设有如下遗产继承规则:丈夫与妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。

则表示该遗产继承关系的最合适的数据结构应该是()。

数据结构课后习题及答案

数据结构课后习题及答案

填空题(10 *1’ = 10' )一、概念题2。

2.当对一个线性表经常进行的是插入和删除操作时,采用链式存储结构为宜。

2。

3。

当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用顺序存储结构。

2。

6。

带头结点的单链表L中只有一个元素结点的条件是L—〉Next->Next==Null。

3。

6。

循环队列的引入,目的是为了克服假溢出.4。

2。

长度为0的字符串称为空串。

4。

5.组成串的数据元素只能是字符。

4。

8.设T和P是两个给定的串,在T中寻找等于P的子串的过程称为模式匹配,又称P为模式。

7.2。

为了实现图的广度优先搜索,除一个标志数组标志已访问的图的结点外,还需要队列存放被访问的结点实现遍历。

5.7。

广义表的深度是广义表中括号的重数7。

8.有向图G可拓扑排序的判别条件是有无回路。

7.9。

若要求一个稠密图的最小生成树,最好用Prim算法求解。

8。

8.直接定址法法构造的哈希函数肯定不会发生冲突。

9。

2。

排序算法所花费的时间,通常用在数据的比较和交换两大操作。

1。

1。

通常从正确性﹑可读性﹑健壮性﹑时空效率等几个方面评价算法的(包括程序)的质量。

1。

2.对于给定的n元素,可以构造出的逻辑结构有集合关系﹑线性关系树形关系﹑图状关系四种。

1。

3。

存储结构主要有顺序存储﹑链式存储﹑索引存储﹑散列存储四种。

1。

4。

抽象数据类型的定义仅取决于它的一组逻辑特性,而与存储结构无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部使用。

1。

5.一个算法具有五大特性:有穷性﹑确定性﹑可行性,有零个或多个输入﹑有一个或多个输入。

2.8.在双向链表结构中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句:s—〉prior= p—〉prior; s-〉next= p; p-〉prior- next= s;p-〉prior= s;。

2.9。

在单链表中设置头结点的作用是不管单链表是否为空表,头结点的指针均不空,并使得对单链表的操作(如插入和删除)在各种情况下统一。

数据结构课后习题第2章

数据结构课后习题第2章

2. 指针 P 指向不带头结点的线性链表 L 的首元素的条件是( )。
A.P= =L
C.P-﹥next==L
B.L-﹥Next==P
D.P-﹥next==NULL
3. 指针 p 指向带头结点的单循环链表 L 的首元素的条件是( )。
A.P= =L
C.P-﹥next==L
B.L-﹥Next==P
D.P-﹥next==NULL
网络工程 2011 级 1 班、计算机科学与技术 2011 级 2 班《算法与数据结构》课后习题(第 2 章)
2011 级 计科 (网工)
题号
得分

【课后习题】第 2 章 线性表
班 学号:
一、判断题(如果正确,在题号前打“”,否则打“”。每题 2 分,共 10 分)

( ) 1. 线性表若采用顺序存储表示时所有结点之间的存储单元地址必须连续。 ( ) 2. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 ( ) 3. 如果某个数据结构的每一个元素都是最多只有一个直接前驱,则必为线性结构。 ( ) 4. 线性表的逻辑顺序与物理顺序总是一致的。 ( ) 5. 线性表的长度是指它所占存储空间的大小。
二、填空题(每空 1.5 分,共 21 分)
1. 从逻辑结构看,线性表是典型的
2. 在一个长度为 n 的向量中在第 i(1≤i≤n+1)个元素之前插入一个元素时,需向后移动
个元素,算法的时间复杂度为
3. 在一个长度为 n 的向量中删除第 i(1≤i≤n)个元素时,需向前移动
算法的时间复杂度为


4. 若长度为 n 的线性表采用链式存储结构,在其第 i 个结点前插入一个新的元素的算法的

数据结构课程课后习题集答案解析

数据结构课程课后习题集答案解析

《数据结构简明教程》练习题及参考答案练习题11. 单项选择题(1)线性结构中数据元素之间是()关系。

A.一对多B.多对多C.多对一D.一对一答:D(2)数据结构中与所使用的计算机无关的是数据的()结构。

A.存储B.物理C.逻辑D.物理和存储答:C(3)算法分析的目的是()。

A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进D.分析算法的易懂性和文档性答:C(4)算法分析的两个主要方面是()。

A.空间复杂性和时间复杂性B.正确性和简明性C.可读性和文档性D.数据复杂性和程序复杂性答:A(5)计算机算法指的是()。

A.计算方法B. 排序方法C.求解问题的有限运算序列D.调度方法答:C(6)计算机算法必须具备输入、输出和()等5个特性。

A.可行性、可移植性和可扩充性B.可行性、确定性和有穷性C.确定性、有穷性和稳定性D.易读性、稳定性和安全性答:B2. 填空题(1)数据结构包括数据的①、数据的②和数据的③这三个方面的内容。

答:①逻辑结构②存储结构③运算(2)数据结构按逻辑结构可分为两大类,它们分别是①和②。

答:①线性结构②非线性结构(3)数据结构被形式地定义为(D,R),其中D是①的有限集合,R是D上的②有限集合。

答:①数据元素②关系数据结构简明教程(4)在线性结构中,第一个结点 ① 前驱结点,其余每个结点有且只有1个前驱结点;最后一个结点 ② 后继结点,其余每个结点有且只有1个后继结点。

答:①没有 ②没有 (5)在树形结构中,树根结点没有 ① 结点,其余每个结点有且只有 ② 个前驱结点;叶子结点没有 ③ 结点,其余每个结点的后继结点数可以是 ④ 。

答:①前驱 ②1 ③后继 ④任意多个(6)在图形结构中,每个结点的前驱结点数和后继结点数可以是( )。

答:任意多个(7)数据的存储结构主要有四种,它们分别是 ① 、 ② 、 ③ 和 ④ 存储结构。

答:①顺序 ②链式 ③索引 ④哈希(8)一个算法的效率可分为 ① 效率和 ② 效率。

【课后习题及答案】严蔚敏-数据结构课后习题及答案解析

【课后习题及答案】严蔚敏-数据结构课后习题及答案解析

6.算 法 的 五 个 重 要 特 性 是 _______、_______、______、_______、_______。 7.数据结构的三要素是指______、_______和________。 8.链式存储结构与顺序存储结构相比较,主要优点是 ________________________________。 9.设有一批数据元素,为了最快的存储某元素,数据结构宜用_________ 结构,为了方便插入一个元素,数据结构宜用____________结构。
四、算法分析题
for(i=1; i<=n; i++) for(j =1; j <=i ; j++) x=x+1; 分 析 :该 算 法 为 一 个 二 重 循 环 ,执 行 次 数 为 内 、外 循 环 次 数 相 乘 ,但 内 循环次数不固定,与外循环有关,因些,时间频度 T(n)=1+2+3+…+n=n*(n+1)/2 有 1/4≤T(n)/n2≤1,故它的时间复杂度为O(n2), 即T(n)与 n2 数 量级相同。 2、分析下列算法段的时间频度及时间复杂度 for (i=1;i<=n;i++) for (j=1;j<=i;j++) for ( k=1;k<=j;k++) x=i+j-k; 分析算法规律可知时间频度 T(n)=1+(1+2)+(1+2+3)+...+(1+2+3+…+n) 由于有 1/6 ≤ T(n)/ n3 ≤1,故时间复杂度为O(n3)
精品课程
课后习题答案数据结构-严来自敏 课后习题及答案解析第一章 绪论

数据结构课后习题与解析第二章

数据结构课后习题与解析第二章

第二章习题1. 描述以下三个概念的区别:头指针,头结点,首元素结点。

2. 填空:(1)在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。

(2)在顺序表中,逻辑上相邻的元素,其物理位置相邻。

在单链表中,逻辑上相邻的元素,其物理位置相邻。

(3)在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由指示。

3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。

按要求从下列语句中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是:。

b. 在P结点前插入S结点的语句序列是:。

c. 在表首插入S结点的语句序列是:。

d. 在表尾插入S结点的语句序列是:。

供选择的语句有:(1)P->next=S;(2)P->next= P->next->next;(3)P->next= S->next;(4)S->next= P->next;(5)S->next= L;(6)S->next= NULL;(7)Q= P;(8)while(P->next!=Q) P=P->next;(9)while(P->next!=NULL) P=P->next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;4. 设线性表存于a(1:arrsize)的前elenum个分量中且递增有序。

试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。

5. 写一算法,从顺序表中删除自第i个元素开始的k个元素。

6. 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。

试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
head
x ¥
a
b
c
d
7
7
6
6
算法 Locate-Improved(head, x. head) /*在双向循环链中定位值为x结点,修改freq并按递
减序调整,删除所有碰到的x,有哨兵变量*/ Loc0[修改哨位节点,减少条件判断]
data(head) ← x. freq(head) ← . Loc1[定位值为x的元素,修改freq]
其它方法
• 使用堆栈将元素倒置
head a
b
c
• 从表头删除,再插入表尾之后
head NULL
NULL
c b a
head c
b
a
NULL
2-11
• 已知线性表中的元素以data值递增有序排列,并以单链 表做存储结构。试写一高效算法,删除表中所有值大于 mink且小于maxk的元素(若表中存在这样的元素),同 时释放被删节点空间,并分析该算法的时间复杂度。(注 意, mink和maxk是给定的两个参数,它们的值可以跟表 中的元素相同,也可以不同)
分析
• 利用有序性减少元素比较次数。
head
a0 … ai ai+1 …
aj aj+1 … an
< mink
> mink
> maxk
• 时间复杂性T(n)=maxv结点的£位m置ax,k记为O(n)
算法 Delete(head, mink, maxk. head) /*删除单链表中值在mink和maxk之间的元素,单链表有
// 将元素item插入到双端队列的前端 void push(const T& item) {
if (IsEmpty()) { front=rear=new SLNode<T>(item, NULL); size=1;
} else { SLNode <T> *temp=front; front=new SLNode <T>(item, NULL); frontnext=temp; size++;
while (!IsEmpty()) { rear=front; front=frontnext; delete rear; size - -;
} rear=NULL ; } };
参考答案2(双向循环链版本)
template < class T > class Deque { private:
DLNode<T>* head ; public:
AVAIL p. p ← next(p). ) next(pre) ← p. ▌
算法 DeleteUnordered(head, mink, maxk. head) /*删除单链表中值在mink和maxk之间的元素,单链表有
哨兵变量*/ D1[特殊情况]
IF mink > maxk THEN RETURN. D2 [一边比较一边删除]
Deque() { head = new DLNode; head->left=head; head>right=head }; ~Deque () { del() ; } bool push ( const T& item ) bool pop ( T & item ) ; bool inject ( const T& item ) bool eject( T & item ) ; };
NULL
a
b
c
NULL
• 算法 Reverse ( head. head)
/*将指针 head 所指向的链表倒置*/ RV1[空链表]
IF head = NULL THEN RETURN. RV2[反转链表]
newhead NULL. WHILE next(head) ≠ NULL DO (
tmp head. head next(head). //移到head指向其后继节点 next(tmp) newhead. //反转节点指针 newhead tmp. ) next(head) newhead. ▌
pre ←head. p ←next(head). WHILE p NULL DO (
IF data(p) < mink THEN ( pre ←p. p←next(p). ). ELSE IF data(p) <= maxk THEN ( next(pre) ←next(p). AVAIL p. p ← next(pre). ) )▌
• 请用图来说明对空栈L执行如下操作序列后堆栈的状态: • Push(10), Push(4), Push(7), Pop, Push(15), Pop, Pop, Push(1)
参考答案
1 10
2-25
• 编写并实现双端队列类。双端队列(Deque)是可进行如 下操作的线性表。 (1) push(item):将元素item插入到双端队列的前端 (2) pop(item):从双端队列删除前端元素并赋给item (3) inject(item):将元素item插入到双端队列的尾端 (4) eject(item):从双端队列删除尾端元素并赋给item
} }
// 从双端队列中删除尾端元素并将该值赋给变量 item void eject(T& item) {
if ( IsEmpty() ) { cout << “Deleting from an empty queue!”<<endl; return; }
item= reardata; delete rear; if (--size==0) front=rear=NULL; else {
数据结构习题 第 2 章
赖永 *** 2016.9.22
2-1
• 编写算法Reverse ( A[ ], n),将顺序存储的线性表A=( a0, a1, …, an-1 )转换为A=( an-1,…, a1, a0),要求转换过程中用尽 可能少的辅助空间。
A[0]
a0 an 1
A[1]
a1 an 2
Loc3[从链表中删除p] prior(next(p))←prior(p). next(prior(p))=next(p).
Loc4[将p插入到q后] prior(p) ←q. next(p) ←next(q). prior(next(p)) ←p. next(prior(p)) ←p.▌
2-14
} }
// 从双端队列中删除前端元素并将该值赋给变量 item void pop(T& item) { if ( IsEmpty() ) cout << “Deleting from an empty queue!”<<endl; SLNode<T> *temp=front; item=tempdata; front=frontnext; size - -; delete temp; if ( size==0 ) rear=NULL; }
Loc3[从链表中删除p] prior(next(p))←prior(p). next(prior(p))=next(p).
Loc4[将p插入到q后] prior(p) ←q. next(p) ←next(q). prior(next(p)) ←p. next(prior(p)) ←p. ▌
改进思想
2-13
• 设有一个双向循环链表,每个结点中除有prior、data和 next三个域外,还增设一个访问频度域freq。我们假定 循环链表中无重复元素,且在链表被起用之前,频度域 freq的值均初始化为零。而每当对链表进行一次 Locate(head,x)的操作后,被访问的结点(即元素值等于x 的结点)中的频度域freq的值增1,同时调整链表中结点 之间的次序,使其按访问频度非递增的次序顺序排列, 以便始终保持被频繁访问的结点总是靠近表头结点。试 编写符合上述要求的Locate操作的方法。
参考答案
双端队列DQueue的类声明 template < class T > class DQueue { private:
SLNode <T> *front, *rear; // 队首和队尾指针 int size; // 队列中元素个数 public: // 构造函数 DQueue() { front=rear=NULL; size=0; } // 析构函数 ~ DQueue() { QClear(); }
扩展
• 找第2小的元素
思路
37
51
37
75
51
84
37
79 75 51 75¢ 84 92 37 42
2-6
• 分析单链表中删除操作的时间复杂度
参考答案
• 算法delete(k, item),需要从前往后找到第k个元素。 • 关键操作:指针调整
- 最好情况k<=0,不用调整,O(1) - 最坏情况k>n-1,调整n次,O(n) - 一般情况,假定k<0, k0, …, kn-1, k>n-1的概率相同,调整次
p ←next(head). WHILE data(p) = x DO p ←next(p). IF p = head THEN RETURN //未找到 freq(p) ← freq(p) + 1. t ← next(p).
Loc2[找freq大于等于p的结点q] q ←p. WHILE freq(p) > freq(prior(q)) DO q ←prior(q).
数为
0 + 0 + ...+ n - 1+ n = n(n + 1) = O(n)
n+ 2
相关文档
最新文档