数据结构课程课后习题答案.

数据结构课程课后习题答案.
数据结构课程课后习题答案.

《数据结构简明教程》练习题及参考

答案

练习题1

1. 单项选择题

(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.易读性、稳定性和安全性

答:B

2. 填空题

(1)数据结构包括数据的①、数据的②和数据的③这三个方面的内容。

数据结构简明教程

答:①逻辑结构 ②存储结构 ③运算

(2)数据结构按逻辑结构可分为两大类,它们分别是 ① 和 ② 。 答:①线性结构 ②非线性结构 (3)数据结构被形式地定义为(D,R ),其中D 是 ① 的有限集合,R 是D 上的 ② 有限集合。

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

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

答:①前驱 ②1 ③后继 ④任意多个

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

(7)数据的存储结构主要有四种,它们分别是 ① 、 ② 、 ③ 和 ④ 存储结构。 答:①顺序 ②链式 ③索引 ④哈希

(8)一个算法的效率可分为 ① 效率和 ② 效率。 答:①时间 ②空间

3. 简答题

(1)数据结构和数据类型两个概念之间有区别吗?

答:简单地说,数据结构定义了一组按某些关系结合在一起的数组元素的集合。数据类型不仅定义了一组数据元素,而且还在其上定义了一组操作。

(2)简述线性结构、树形结构和图形结构的不同点。

答:线性结构反映结点间的逻辑关系是一对一的,树形线性结构反映结点间的逻辑关系是一对多的,图在结构反映结点间的逻辑关系是多对多的。

(3)设有采用二元组表示的数据逻辑结构S=(D,R),其中D={a ,b ,…,i },R={(a ,b ),(a ,c ),(c ,d ),(c ,f ),(f ,h ),(d ,e ),(f ,g ),(h ,i )},问相对于关系R ,哪些结点是开始结点,哪些结点是终端结点?

答:该逻辑结构为树形结构,其中a 结点没有前驱结点,称为根结点,b 、e 、g 、i 结点没有后继结点,是终端结点,也称为叶子结点。

(4)以下各函数是算法中语句的执行频度,n 为问题规模,给出对应的时间复杂度: T 1(n )=n log 2n -1000log 2n T 2(n )=3log 2n -1000log 2n T 3(n )=n 2-1000log 2n

T 4(n )=2n log 2n -1000log 2n

答:T 1(n )=O(n log 2n ),T 2(n )=O( ),T 3(n )=O(n 2),T 4(n )=O(n log 2n )。 (5)分析下面程序段中循环语句的执行次数。

int j=0,s=0,n=100;

3

log 2n

3

do { j=j+1;

s=s+10*j;

} while (j

答:j =0,第1次循环:j =1,s =10。第2次循环:j =2,s =30。第3次循环:j =3,s =60。第4次循环:j =4,s =100。while 条件不再满足。所以,其中循环语句的执行次数为4。

(6)执行下面的语句时,语句s++的执行次数为多少?

int s=0;

for (i=1;i=i;j--)

s++;

答:语句s 的执行次数2

)

2)(3(3)1()1(121

21-+=

++-+=+-=∑∑∑-=-==n n n n i n n i n i i

n

j 。

(7)设n 为问题规模,求以下算法的时间复杂度。

void fun1(int n) { int x=0,i;

for (i=1;i<=n;i++) for (j=i+1;j<=n;j++)

x++;

}

答:其中x++语句属基本运算语句,∑∑∑

=+==-=

-=

=

n i n i j n

i n n i n n T 1

1

1

2

)

1()(1)(=O(n 2)。 (8)设n 为问题规模,是一个正偶数,试计算以下算法结束时m 的值,并给出该算法的时间复杂度。

void fun2(int n) { int m=0;

for (i=1;i<=n;i++) for (j=2*i;j<=n;j++)

m++;

}

答:由于内循环j 的取值范围,所以i ≤n /2,则∑∑∑-===--==2/122/1

24/))12((n i n

i

j n i n i n m ,该程

序段的时间复杂度为O(n 2)。

上机实验题1

有一个整型数组a ,其中含有n 个元素,设计尽可能好的算法求其中的最大元素和次大元素,并采用相关数据测试。

解:maxs 算法用于返回数组a[0..n -1]中的最大元素值max1和次大元素值max2,max1和max2设计为引用类型。对应的程序如下:

数据结构简明教程

#include

void maxs(int a[],int n,int &max1,int &max2)

{ int i;

max1=max2=a[0];

for (i=1;i

if (a[i]>max1)

{ max2=max1;

max1=a[i];

}

else if (a[i]>max2)

max2=a[i];

}

void main()

{ int a[]={1,4,10,6,8,3,5,7,9,2};

int n=10;

int max1,max2;

maxs(a,n,max1,max2);

printf("最大元素值=%d,次大元素值=%d\n",max1,max2);

}

练习题2

1. 单项选择题

(1)数据在计算机存储器内表示时,物理地址与逻辑地址相对顺序相同并且是连续的,称之为()。

A.存储结构

B.逻辑结构

C.顺序存储结构

D.链式存储结构

答:C

(2)在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是()。

A.访问第i个结点(1≤i≤n)和求第i(2≤i≤n)个结点的前驱结点

B.在第i(1≤i≤n)个结点后插入一个新结点

C.删除第i个结点(1≤i≤n)

D.将n个结点从小到大排序

答:A

(3)向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。

A.8

B.63.5

C.63

D.7

答:B

(4)链式存储结构所占存储空间()。

A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针

B.只有一部分,存放结点值

C.只有一部分,存储表示结点间关系的指针

D.分两部分,一部分存放结点值,另一部分存放结点所占单元数

答:A

(5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址()。

A.必须是连续的

B.部分地址必须是连续的

C.一定是不连续的

D.连续或不连续都可以

答:D

(6)一个线性表在()情况下适用于采用链式存储结构。

A.需经常修改其中的结点值

B.需不断对其进行删除插入

C.其中含有大量的结点

D.其中结点结构复杂

答:B

(7)单链表的存储密度()

A.大于1

B.等于1

C.小于1

D.不能确定

答:C

2. 填空题

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

答:①表中一半②表长和该元素在表中的位置

(2)向一个长度为n的顺序表的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动()个元素。

答:n-i+1

(3)向一个长度为n的顺序表中删除第i个元素(1≤i≤n)时,需向前移动()个元素。

答:n-i

(4)在顺序表中访问任意一个元素的时间复杂度均为(①),因此顺序表也称为(②)的数据结构。

答:①O(1) ②随机存取

(5)顺序表中逻辑上相邻的元素的物理位置(①)相邻。单链表中逻辑上相邻的元素的物理位置(②)相邻。

答:①一定②不一定

(6)在带头结点的单链表中,除头结点外,任一结点的存储位置由()指示。

答:其前驱结点的链域的值

(7)在含有n个数据结点的单链表中要删除已知结点*p,需找到它的(①),其时间复杂度为(②)。

答:①前驱结点的地址②O(n)

(8)含有n(n>1)个结点的循环双向链表中,为空的指针域数为()。

答:0

5

数据结构简明教程

3. 简答题

(1)试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?

答:顺序存储结构中,相邻数据元素的存放地址也相邻,并要求内存中可用存储单元的地址必须是连续的。其优点是存储密度大,存储空间利用率高;缺点是插入或删除元素时不方便。

链式存储结构中,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。其优点是插入或删除元素时很方便,使用灵活;缺点是存储密度小,存储空间利用率低。

顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。

(2)对于表长为n的顺序表,在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需要移动的元素的平均个数为多少?删除一个元素所需要移动的平均个数为多少?

答:插入一个元素所需要移动的元素的平均个数为(n-1)/2,删除一个元素所需要移动的平均个数为n/2。

(3)在链表中设置头结点的作用是什么?

答:在链表中设置头结点后,不管链表是否为空表,头结点指针均不空,并使得对链表的操作(如插入和删除)在各种情况下统一,从而简化了算法的实现过程。

(4)对于双链表和单链表,在两个结点之间插入一个新结点时需修改的指针各为多少个?

答:对于双链表,在两个结点之间插入一个新结点时,需修改前驱结点的next域、后继结点的prior域和新插入结点的next、prior域。所以共修改4个指针。

对于单链表,在两个结点之间插入一个新结点时,需修改前一结点的next域,新插入结点的next域。所以共修改两个指针。

(5)某含有n(n>1)结点的线性表中,最常用的操作是在尾结点之后插入一个结点和删除第一个结点,则采用以下哪种存储方式最节省运算时间。

①单链表;

②仅有头指针不带头结点的循环单链表;

③双链表;

④仅有尾指针的循环单链表。

答:在单链表中,删除第一个结点的时间复杂度为O(1)。插入结点需找到前驱结点,所以在尾结点之后插入一个结点,需找到尾结点,对应的时间复杂度为O(n)。

在仅有头指针不带头结点的循环单链表中,删除第一个结点的时间复杂度O(n),因为删除第一个结点后还要将其改为循环单链表;在尾结点之后插入一个结点的时间复杂度也为O(n)。

在双链表中,删除第一个结点的时间复杂度为O(1);在尾结点之后插入一个结点,也

需找到尾结点,对应的时间复杂度为O(n)。

在仅有尾指针的循环单链表中,通过该尾指针可以直接找到第一个结点,所以删除第一个结点的时间复杂度为O(1);在尾结点之后插入一个结点也就是在尾指针所指结点之后插入一个结点,时间复杂度也为O(1)。因此④最节省运算时间。

4. 算法设计题

(1)设计一个高效算法,将顺序表的所有元素逆置,要求算法空间复杂度为O(1)。

解:遍历顺序表L的前半部分元素,对于元素L.data[i](0≤i<L.length/2),将其与后半部分对应元素L.data[L.length-i-1]进行交换。对应的算法如下:

void reverse(SqList &L)

{ int i;

ElemType x;

for (i=0;i

{ x=L.data[i]; //L.data[i]与L.data[L.length-i-1]交换L.data[i]=L.data[L.length-i-1];

L.data[L.length-i-1]=x;

}

}

本算法的时间复杂度为O(n)。

(2)设计一个算法从顺序表中删除重复的元素,并使剩余元素间的相对次序保持不变。

解:对于顺序表L,用i从1开始遍历其元素,设L.data[0..j](j的初值为0)中没有重复的元素。检测L.data[i](j

void delsame(SqList &L) //L为引用型参数

{ int i,j=0,k;

for (i=1;i

{ k=0;

while (k<=j && L.data[k]!=L.data[i])

k++;

if (k>j) //表示L.data[i]和L.data[0..j]中所有元素都不相同

{ j++;

L.data[j]=L.data[i];

}

}

L.length=j+1; //顺序表长度置新值

}

本算法的时间复杂度为O(n2),空间复杂度为O(1)。

(3)设计一个算法从有序顺序表中删除重复的元素,并使剩余元素间的相对次序保持不变。

解:在有序顺序表L中,所有重复的元素应是相邻存放的,用k保存不重复出现的元素个数,先将不重复的有序区看成是L.data[0..0],置e=L.data[0],用i从1开始遍历L的

7

数据结构简明教程

所有元素:当L.data[i]≠e时,将它放在L.data[k]中,k增1,置e=L.data[i],最后将L的length置为k。对应的算法如下:

void delsame1(SqList &L) //L为引用型参数

{ int i,k=1; //k保存不重复的元素个数

ElemType e;

e=L.data[0];

for (i=1;i

{ if (L.data[i]!=e) //只保存不重复的元素

{ L.data[k]=L.data[i];

k++;

e=L.data[i];

}

}

L.length=k; //顺序表长度置新值

}

本算法是一个高效算法,其时间复杂度为O(n),空间复杂度为O(1)。如果每次遇到重复的元素,都通过移动其后所有元素来删除它,这样的时间复杂度会变成O(n2)。

(4)设计一个算法删除单链表L中第一个值为x的结点。

解:用p、q遍历整个单链表,p指向*q的前驱结点,q用于查找第一个值为x的结点,当找到后将*q结点删除,返回1;否则返回0。对应的算法如下:

int delx(SLink *&L,ElemType x)

{ SLink *p=L,*q=p->next; //p指向*q的前驱结点

while (q!=NULL && q->data!=x)

{ p=q;

q=q->next;

}

if (q!=NULL) //找到值为x的结点

{ p->next=q->next;

free(q);

return 1;

}

else return 0; //未找到值为x的结点

}

(5)设计一个算法判定单链表L是否是递增的。

解:判定链表L从第2个结点开始的每个结点的值是否比其前驱的值大。若有一个不成立,则整个链表便不是递增的;否则是递增的。对应的算法如下:

int increase(SLink *L)

{ SLink *pre=L->next,*p; //pre指向第一个数据结点

p=pre->next; //p指向*pre结点的后继结点

while (p!=NULL)

{ if (p->data>=pre->data) //若正序则继续判断下一个结点

{ pre=p; //pre、p同步后移

p=p->next;

}

else return 0;

}

return 1;

}

(6)有一个整数元素建立的单链表A,设计一个算法,将其拆分成两个单链表A和B,使得A单链表中含有所有的偶数结点,B单链表中所有的奇数结点,且保持原来的相对次序。

解:采用重新单链表的方法,由于要保持相对次序,所以采用尾插法建立新表A、B。用p遍历原单链表A的所有数据结点,若为偶数结点,将其链到A中,若为奇数结点,将其链到B中。对应的算法如下:

void Split(SLink *&A,SLink *&B)

{ SLink *p=A->next,*ra,*rb;

ra=A;

B=(SLink *)malloc(sizeof(SLink)); //建立头结点

rb=B; //r总是指向B链表的尾结点

while (p!=NULL)

{ if (p->data%2==0) //偶数结点

{ ra->next=p; //将*p结点链到A中

ra=p;

p=p->next;

}

else //奇数结点

{ rb->next=p; //将*p结点链到B中

rb=p;

p=p->next;

}

}

ra->next=rb->next=NULL;

}

本算法的时间复杂度为O(n),空间复杂度为O(1)。

(7)有一个有序单链表(从小到大排列),表头指针为L,设计一个算法向该单链表中插入一个元素为x的结点,使插入后该链表仍然有序。

解:先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点。对应的算法如下:

void inorderList(SLink *&L,ElemType x)

{ SLink *s,*p,*q;

s=(SLink *)malloc(sizeof(SLink)); //建立一个待插入的结点

s->data=x;s->next=NULL;

if (L==NULL || xdata) //若单链表为空或x小于第1个结点date域

{ s->next=L; //把*s结点插入到头结点之后

9

数据结构简明教程

L=s;

}

else

{ q=L; //寻找插入位置,p指向待比较的结点,q指向p的前驱结点p=q->next;

while (p!=NULL && x>p->data) //若x小于p所指结点的data域值

if (x>p->data)

{ q=p;

p=p->next;

}

s->next=p; //将s结点插入到*q和*p之间

q->next=s;

}

}

(8)有一个单链表L,其中可能出现值域重复的结点,设计一个算法删除值域重复的结点。并分析算法的时间复杂度。

解:用p遍历单链表,用r遍历*p结点之后的结点,q始终指向*r结点的直接前驱结点,若r->data==p->data,则删除*r结点,否则q、r同步后移一个结点。对应的算法如下:void dels1(SLink *&L)

{ SLink *p=L->next,*q,*r,*t;

while (p!=NULL)

{ q=p;

r=q->next;

while (r!=NULL)

{ if (r->data==p->data) //r指向被删结点

{ t=r->next;

q->next=t;

free(r);

r=t;

}

else

{ q=r;

r=r->next;

}

}

p=p->next;

}

}

本算法的时间复杂度为O(n2)。

(9)有一个递增有序单链表(允许出现值域重复的结点),设计一个算法删除值域重复的结点。并分析算法的时间复杂度。

解:由于是有序表,所以相同值域的结点都是相邻的。用p遍历递增单链表,若*p结

点的值域等于其后结点的值域,则删除后者。对应的算法如下:

void dels(SLink *&L)

{ SLink *p=L->next,*q;

while (p->next!=NULL)

{ if (p->data==p->next->data) //找到重复值的结点

{ q=p->next; //q指向这个重复值的结点

p->next=q->next; //删除*q结点

free(q);

}

else p=p->next;

}

}

本算法的时间复杂度为O(n)。

(10)有一个双链表L,设计一个算法查找第一个元素值为x的结点,将其与后继结点进行交换。

解:先找到第一个元素值为x的结点*p,q指向其后继结点,本题是将*p结点移到*q 结点之后,实现过程是:删除*p结点,再将其插入到*q结点之后。对应的算法如下:int swap(DLink *L,ElemType x)

{ DLink *p=L->next,*q;

while (p!=NULL && p->data!=x)

p=p->next;

if (p==NULL) //未找到值为x的结点

return 0;

else //找到值为x的结点*p

{ q=p->next; //q指向*p的后继结点

if (q!=NULL) //*p结点不是尾结点

{ p->prior->next=q; //先删除*p结点

q->prior=p->prior;

p->next=q->next; //将*p结点插入到*q结点之后

if (q->next!=NULL)

q->next->prior=p;

q->next=p;

p->prior=q;

return 1;

}

else //*p结点是尾结点

return 0; //无法与后继结点交换,返回0

}

}

(11)对于有n(n≥1)个数据结点的循环单链表L,设计一个算法将所有结点逆置。

11

数据结构简明教程

解:采用头插法重建循环单链表L的思路,先建立一个空的循环单链表,用p遍历所有数据结点,每次将*p结点插入到前端。对应的算法如下:

void Reverse(SLink *&L)

{ SLink *p=L->next,*q;

L->next=L; //建立一个空循环单链表

while (p!=L)

{ q=p->next;

p->next=L->next; //将*p结点插入到前端

L->next=p;

p=q;

}

}

上机实验题2

有两个整数集合采用有序单链表存储,设计尽可能高效的算法求两个集合的并集、交集和差集。并用相关数据进行测试。

#include

#include "SLink.h"

void Union(SLink *L1,SLink *L2,SLink *&L3) //求并集

{ SLink *p,*q,*s,*tc;

L3=(SLink *)malloc(sizeof(SLink));

tc=L3;

p=L1->next;

q=L2->next;

while (p!=NULL && q!=NULL)

{ if (p->datadata)

{ s=(SLink *)malloc(sizeof(SLink));

s->data=p->data;

tc->next=s;

tc=s;

p=p->next;

}

else if (p->data>q->data)

{ s=(SLink *)malloc(sizeof(SLink));

s->data=q->data;

tc->next=s;

tc=s;

q=q->next;

}

else

{ s=(SLink *)malloc(sizeof(SLink));

s->data=p->data;

tc->next=s;

tc=s;

p=p->next;

q=q->next;

}

}

while (p!=NULL)

{ s=(SLink *)malloc(sizeof(SLink));

s->data=p->data;

tc->next=s;

tc=s;

p=p->next;

}

while (q!=NULL)

{ s=(SLink *)malloc(sizeof(SLink));

s->data=q->data;

tc->next=s;

tc=s;

q=q->next;

}

tc->next=NULL;

}

void InterSection(SLink *L1,SLink *L2,SLink *&L3) //求交集{ SLink *p,*q,*s,*tc;

L3=(SLink *)malloc(sizeof(SLink));

tc=L3;

p=L1->next;

q=L2->next;

while (p!=NULL && q!=NULL)

{ if (p->datadata)

p=p->next;

else if (p->data>q->data)

q=q->next;

else //p->data=q->data

{ s=(SLink *)malloc(sizeof(SLink));

s->data=p->data;

tc->next=s;

tc=s;

p=p->next;

q=q->next;

}

13

数据结构简明教程

}

tc->next=NULL;

}

void Subs(SLink *L1,SLink *L2,SLink *&L3) //求差集{ SLink *p,*q,*s,*tc;

L3=(SLink *)malloc(sizeof(SLink));

tc=L3;

p=L1->next;

q=L2->next;

while (p!=NULL && q!=NULL)

{ if (p->datadata)

{ s=(SLink *)malloc(sizeof(SLink));

s->data=p->data;

tc->next=s;

tc=s;

p=p->next;

}

else if (p->data>q->data)

q=q->next;

else //p->data=q->data

{ p=p->next;

q=q->next;

}

}

while (p!=NULL)

{ s=(SLink *)malloc(sizeof(SLink));

s->data=p->data;

tc->next=s;

tc=s;

p=p->next;

}

tc->next=NULL;

}

void main()

{ SLink *A,*B,*C,*D,*E;

ElemType a[]={1,3,6,8,10,20};

CreateListR(A,a,6); //尾插法建表

printf("集合A:");DispList(A);

ElemType b[]={2,5,6,10,16,20,30};

CreateListR(B,b,7); //尾插法建表

printf("集合B:");DispList(B);

printf("求A、B并集C\n");

Union(A,B,C); //求A、B并集C

printf("集合C:");DispList(C);

printf("求A、B交集C\n");

InterSection(A,B,D); //求A、B并集D

printf("集合D:");DispList(D);

printf("求A、B差集E\n");

Subs(A,B,E); //求A、B差集E

printf("集合E:");DispList(E);

DestroyList(A);

DestroyList(B);

DestroyList(C);

DestroyList(D);

DestroyList(E);

}

练习题3

1. 单项选择题

(1)栈中元素的进出原则是()。

A.先进先出

B.后进先出

C.栈空则进

D.栈满则出

答:B

(2)设一个栈的进栈序列是A、B、C、D(即元素A~D依次通过该栈),则借助该栈所得到的输出序列不可能是()。

A.A,B,C,D

B.D,C,B,A

C.A,C,D,B

D.D,A,B,C

答:D

(3)一个栈的进栈序列是a、b、c、d、e,则栈的不可能的输出序列是()。

A.edcba

B.decba

C.dceab

D.abcde

答:C

(4)已知一个栈的进栈序列是1,2,3,…,n,其输出序列的第一个元素是i(1≤i ≤n)则第j(1≤j≤n)个出栈元素是()。

A.i

B.n-i

C.j-i+1

D.不确定

答:D

(5)设顺序栈st的栈顶指针top的初始时为-1,栈空间大小为MaxSize,则判定st 栈为栈空的条件为()。

A.st.top==-1

B.st.top!=-1

C.st.top!=MaxSize

D.st.top==MaxSize

答:A

(6)设顺序栈st的栈顶指针top的初始时为-1,栈空间大小为MaxSize,则判定st 栈为栈满的条件是。

A.st.top!=-1

B.st.top==-1

15

数据结构简明教程

C.st.top!=MaxSize-1

D.st.top==MaxSize-1

答:D

(7)队列中元素的进出原则是()。

A.先进先出

B.后进先出

C.栈空则进

D.栈满则出

答:A

(8)元素A、B、C、D顺序连续进入队列qu后,队头元素是(①),队尾元素是(②)。

A.A

B.B

C.C

D.D

答:①A ②D。

(9)一个队列的入列序列为1234,则队列可能的输出序列是()。

A.4321

B.1234

C.1432

D.3241

答:B

(10)循环队列qu(队头指针front指向队首元素的前一位置,队尾指针rear指向队尾元素的位置)的队满条件是()。

A. (qu.rear+1)%MaxSize==(qu.front+1)%MaxSize

B. (qu.rear+1)%MaxSize==qu.front+1

C.(qu.rear+1)%MaxSize==qu.front

A.qu.rear==qu.front

答:C

(11)循环队列qu(队头指针front指向队首元素的前一位置,队尾指针rear指向队尾元素的位置)的队空条件是()。

A. (qu.rear+1)%MaxSize==(qu.front+1)%MaxSize

B. (qu.rear+1)%MaxSize==qu.front+1

C.(qu.rear+1)%MaxSize==qu.front

D.qu.rear==qu.front

答:D

(12)设循环队列中数组的下标是0~N-1,其头尾指针分别为f和r(队头指针f指向队首元素的前一位置,队尾指针r指向队尾元素的位置),则其元素个数为()。

A.r-f

B.r-f-1

C.(r-f)%N+1

D.(r-f+N)%N

答:D

(13)设有4个数据元素a、b、c和d,对其分别进行栈操作或队操作。在进栈或进队操作时,按a、b、c、d次序每次进入一个元素。假设栈或队的初始状态都是空。现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是(①),第二次出栈得到的元素是(②);类似地,考虑对这4个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是(③),第二次出队得到的元素是(④)。经操作后,最后在栈中或队中的元素还有(⑤)

个。

①~④:A.a B.b C.c D.d

⑤: A.1 B.2 C.3 D.0

答:①B ②D ③A ④B ⑤B

(14)设栈S和队列Q的初始状态为空,元素e1~e6依次通过栈S,一个元素出后即进队列Q,若6个元素出队的序列是e2、e4、e3、e6、e5、e1,则栈S的容量至少应该是()。

A.5

B.4

C.3

D.2

答:C

2. 填空题

(1)栈是一种特殊的线性表,允许插入和删除运算的一端称为(①)。不允许插入和删除运算的一端称为(②)。

答:①栈顶②栈底

(2)一个栈的输入序列是12345,的输出序列为12345,其进栈出栈的操作为()。

答:1进栈,1出栈,2进栈,2出栈,3进栈,3出栈,4进栈,4出栈,5进栈,5出栈。

(3)有5个元素,其进栈次序为A、B、C、D、E,在各种可能的出栈次序中,以元素C、D最先出栈(即C第一个且D第二个出栈)的次序有()。

答:CDBAE、CDEBA、CDBEA。

(4)顺序栈用data[0..n-1]存储数据,栈顶指针为top,其初始值为0,则元素x进栈的操作是()。

答:data[top]=x; top++;

(5)顺序栈用data[0..n-1]存储数据,栈顶指针为top,其初始值为0,则出栈元素x 的操作是()。

答:top--; x=data[top];

(6)()是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。

答:队列

(7)设有数组A[0..m]作为循环队列的存储空间,front为队头指针(它指向队首元素的前一位置),rear为队尾指针(它指向队尾元素的位置),则元素x执行入队的操作是()。

答:rear=(rear+1)%(m+1); A[rear]=x;

(8)设有数组A[0..m]作为循环队列的存储空间,front为队头指针(它指向队首元素的前一位置),rear为队尾指针(它指向队尾元素的位置),则元素出队并保存到x中的操作是()。

答:front=(front+1)%(m+1); x=A[rear];

3. 简答题

(1)简要说明线性表、栈与队的异同点。

答:相同点:都属地线性结构,都可以用顺序存储或链表存储;栈和队列是两种特殊

17

数据结构简明教程

的线性表,即受限的线性表,只是对插入、删除运算加以限制。

不同点:①运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入、删除运算,因而是后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。②用途不同,栈用于子程调用和保护现场等,队列用于多道作业处理、指令寄存及其他运算等等。

(2)顺序队的“假溢出”是怎样产生的?如何知道循环队列是空还是满?

答:一般的一维数组队列的尾指针已经到了数组的上界,不能再有进队操作,但其实数组中还有空位置,这就叫“假溢出”。

采用循环队列是解决假溢出的途径。另外,解决循环队列是空还是满的办法如下:

①设置一个布尔变量以区别队满还是队空;

②浪费一个元素的空间,用于区别队满还是队空。

③使用一个计数器记录队列中元素个数(即队列长度)。

通常采用法②,让队头指针front指向队首元素的前一位置,队尾指针rear指向队尾元素的位置,这样判断循环队列队空标志是:front=rear,队满标志是:(rear+1)%MaxSize=front。

4. 算法设计题

(1)假设采用顺序栈存储结构,设计一个算法,利用栈的基本运算返回指定栈中栈底元素,要求仍保持栈中元素不变。这里只能使用栈st的基本运算来完成,不能直接用st.data[0]来得到栈底元素。

解:假定采用顺序栈结构。先退栈st中所有元素,利用一个临时栈tmpst存放从st栈中退栈的元素,最后的一个元素即为所求,然后将临时栈tmpst中的元素逐一出栈并进栈到st中,这样恢复st栈中原来的元素。对应算法如下:

int GetBottom(SqStack st,ElemType &x)

{ ElemType e;

SqStack tmpst; //定义临时栈

InitStack(tmpst); //初始化临时栈

if (StackEmpty(st)) //空栈返回0

return 0;

while (!StackEmpty(st)) //临时栈tmpst中包含st栈中逆转元素

{ Pop(st,x);

Push(tmpst,x);

}

while (!StackEmpty(tmpst)) //恢复st栈中原来的内容

{ Pop(tmpst,e);

Push(st,e);

}

return 1; //返回1表示成功

}

(2)设计一个算法,采用一个顺序栈逆向输出单链表L中所有元素。

解:本题并不需要改变单链表L的结构。设置一个顺序栈st,先遍历单链表并将所有

元素进栈,然后栈不空循环并输出栈中所有元素。对应算法如下:

void ReverseDisp(SLink *L)

{ ElemType x;

struct node

{ ElemType data[MaxSize];

int top;

} st; //定义一个顺序栈

st.top=-1;

SLink *p=L->next;

while (p!=NULL) //遍历单链表,将所有元素进栈

{ st.top++;

st.data[st.top]=p->data;

p=p->next;

}

while (st.top!=-1) //栈不空循环,输出栈中所有元素

{ x=st.data[st.top];

st.top--;

printf("%d ",x);

}

printf("\n");

}

(3)设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag标识队列可能空(0)或可能满(1),这样加上front==rear可以作为队空或队满的条件。要求设计队列的相关基本运算算法。

解:设计的队列的类型如下:

typedef struct

{ ElemType data[MaxSize];

int front,rear; //队头和队尾指针

int tag; //为0表示队空,为1时表示不空

} QueueType;

初始时tag=0,进行成功的插入操作后tag=1,进行成功的删除操作后tag=0;因为只有在插入操作后队列才有可能满,只有在删除操作后队列才有可能空,因此,这样的队列的基本要素如下:

初始时:tag=0,front=rear

队空条件:qu.front==qu.rear && qu.tag==0

队满条件:qu.front==qu.rear && qu.tag==1

对应的算法如下:

//-----初始化队列算法-----

void InitQueue1(QueueType &qu)

19

数据结构简明教程

{ qu.front=qu.rear=0;

qu.tag=0; //为0表示队空可能为空

}

//-----判队空算法-----

int QueueEmpty1(QueueType qu)

{

return(qu.front==qu.rear && qu.tag==0);

}

//-----判队满算法-----

int QueueFull1(QueueType qu)

{

return(qu.tag==1 && qu.front==qu.rear);

}

//-----进队算法-----

int enQueue1(QueueType &qu,ElemType x)

{ if (QueueFull1(qu)==1) //队满

return 0;

qu.rear=(qu.rear+1)%MaxSize;

qu.data[qu.rear]=x;

qu.tag=1; //至少有一个元素,可能满

return 1;

}

//-----出队算法-----

int deQueue1(QueueType &qu,ElemType &x)//出队

{ if (QueueEmpty1(qu)==1) //队空

return 0;

qu.front=(qu.front+1)%MaxSize;

x=qu.data[qu.front];

qu.tag=0; //出队一个元素,可能空

return 1;

}

(4)假设用一个循环单链表表示队列,并且只设一个指针rear指向队尾结点,但不设头指针,设计出相应的队初始化、进队、出队和判队空的算法。

解:假设链队是不带头结点的循环单链表,其示意图如图 3.1所示。队空条件:rear==NULL;进队操作:在*rear结点之后插入结点并让rear指向该结点;出队操作:删除*rear结点之后的一个结点。对应的算法如下:

图3.1 不带头结点的循环单链表表示队列

《数据结构》课后习题答案

第1章绪论 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 答案: 数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。 数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、结点、记录等。数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。 数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。 数据对象:是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。 逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。 存储结构:数据对象在计算机中的存储表示,也称为物理结构。 抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。 2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。 答案: 例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前趋和直接后继。学生记录之间的这种关系就确定了学生表的逻辑结构,即线性结构。 这些学生记录在计算机中的存储表示就是存储结构。如果用连续的存储单元(如用数组表示)来存放这些记录,则称为顺序存储结构;如果存储单元不连续,而是随机存放各个记录,然后用指针进行链接,则称为链式存储结构。 即相同的逻辑结构,可以对应不同的存储结构。 3.简述逻辑结构的四种基本关系并画出它们的关系图。 答案: (1)集合结构 数据元素之间除了“属于同一集合”的关系外,别无其他关系。例如,确定一名学生是否为班级成员,只需将班级看做一个集合结构。 (2)线性结构 数据元素之间存在一对一的关系。例如,将学生信息数据按照其入学报到的时间先后顺序进行排列,将组成一个线性结构。 (3)树结构

课后作业完成题库1、4、7、8、9、10、12、25题

课后作业:完成题库1、4、7、8、9、10、12、25题 01利润的概述 02所得税费用 利润是指企业在一定会计期间的经营成果。利润包括收入减去费用后的净额、直接计入当期利润的利得和损失等。 2.利润的构成 ①营业利润=营业收入-营业成本-税金及附加-销售费用-管理费用-财务费用+投资收益(减损失)+公允价值变动收益(减损失)-资产减值损失+其他收益 ②利润总额=营业利润+营业外收入-营业外支出 ③净利润=利润总额-所得税费用 习题解惑 【例题?单选题】下列各项中,影响当期营业利润的是()。 A.处置固定资产净损益 B.自然灾害导致原材料净损失 C.支付委托代销商品的手续费 D.溢价发行股票支付的发行费用 【答案】C 【解析】选项A计入营业外收支,选项B计入营业外支出,选项D冲减资本公积。 【例题?多选题】下列各项中,既影响营业利润又影响利润总额的业务有()。 A.计提坏账准备计入资产减值损失科目中 B.转销确实无法支付的应付账款 C.出售单独计价包装物取得的收入 D.转让股票所得收益计入投资收益 【答案】ACD 【解析】选项B,计入营业外收入,不影响营业利润。 营业外收支的账务处理 (一)营业外收入账务处理 1.处置非流动资产利得

处置固定资产通过“固定资产清理”科目核算,其账户余额转入营业外收入或营业外支出; 2.确认盘盈利得、捐赠利得 盘盈利得应通过“待处理财产损溢”科目核算 【例题?计算题】某企业将固定资产报废清理的净收益8000元转作营业外收入 写出会计分录。 【答案】 借:固定资产清理8000 贷:营业外收入-非流动资产处置利得8000 习题解惑 【例题?计算题】某企业在现金清查中盘盈200元,按管理权限报经批准后转入营业外收入。写出下列情况时的会计录: ①发现盘盈时: ②经批准转入营业外收入时: 【答案】 ①发现盘盈时: 借:库存现金200 贷:待处理财产损溢200 ②经批准转入营业外收入时: 借:待处理财产损溢200 贷:营业外收入200 【例题?多选题】下列各项中应计入营业外收入的有()。 A.出售持有至到期投资的净收益 B.无法查明原因的现金溢余 C.出售无形资产的净收益 D.出售投资性房地产的净收益 【答案】BC 【解析】选项A,计入投资收益;选项D,计入其他业务收入。 【例题?单选题】下列各项中,不应计入营业外收入的是()。 A.债务重组利得 B.处置固定资产净收益 C.收发差错造成存货盘盈 D.确实无法支付的应付账款 【答案】C 【解析】存货盘盈冲减管理费用。 所得税费用 (一)所得税费用的构成 所得税费用是指企业确认的应从当期利润总额中扣除的所得税费用。包括当期所得税和递延所得税两部分。

数据结构实验总结报告

数据结构实验总结报告 一、调试过程中遇到哪些问题? (1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。 由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。调试之初不以为是设计的问题,从而在代码上花了不少时间调试。 目前的设计是: Tree = Identifier(Node,Node) Node = Identifier | () | Tree Identifier = ASCII Character 例子:a(b((),f),c(d,e)) 这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。 (2)Huffman树的调试花了较长时间。Huffman编码本身并不难处理,麻烦的是输入输出。①Huffman编码后的文件是按位存储的,因此需要位运算。 ②文件结尾要刷新缓冲区,这里容易引发边界错误。 在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。主要调试时间在后者。 二、要让演示版压缩程序具有实用性,哪些地方有待改进? (1)压缩文件的最后一字节问题。 压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。解码程序无法获知这个编码是否属于源文件的一部分。因此有的文件解压后末尾可能出现一个多余的字节。 解决方案: ①在压缩文件头部写入源文件的总长度(字节数)。需要四个字节来存储这个信息(假定文件长度不超过4GB)。 ②增加第257个字符(在一个字节的0~255之外)用于EOF。对于较长的文件,

会造成较大的损耗。 ③在压缩文件头写入源文件的总长度%256的值,需要一个字节。由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。 (2)压缩程序的效率问题。 在编写压缩解压程序时 ①编写了屏幕输入输出的版本 ②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本 ③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口 这样一来,每写一位二进制位,就要在内部进行两次函数调用。如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。 (3)程序界面更加人性化。 Huffman Tree Demo (C) 2011-12-16 boj Usage: huffman [-c file] [-u file] output_file -c Compress file. e.g. huffman -c test.txt test.huff -u Uncompress file. e.g. huffman -u test.huff test.txt 目前的程序提示如上所示。如果要求实用性,可以考虑加入其他人性化的功能。 三、调研常用的压缩算法,对这些算法进行比较分析 (一)无损压缩算法 ①RLE RLE又叫Run Length Encoding,是一个针对无损压缩的非常简单的算法。它用重复字节和重复的次数来简单描述来代替重复的字节。尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG就使用它)。 变体1:重复次数+字符 文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。

课后习题及答案

1 文件系统阶段的数据管理有些什么缺陷试举例说明。 文件系统有三个缺陷: (1)数据冗余性(redundancy)。由于文件之间缺乏联系,造成每个应用程序都有对应的文件,有可能同样的数据在多个文件中重复存储。 (2)数据不一致性(inconsistency)。这往往是由数据冗余造成的,在进行更新操作时,稍不谨慎,就可能使同样的数据在不同的文件中不一样。 (3)数据联系弱(poor data relationship)。这是由文件之间相互独立,缺乏联系造成的。 2 计算机系统安全性 (1)为计算机系统建立和采取的各种安全保护措施,以保护计算机系统中的硬件、软件及数据; (2)防止其因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露等。 3. 自主存取控制缺点 (1)可能存在数据的“无意泄露” (2)原因:这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记 (3)解决:对系统控制下的所有主客体实施强制存取控制策略 4. 数据字典的内容和作用是什么 数据项、数据结构 数据流数据存储和加工过程。 5. 一条完整性规则可以用一个五元组(D,O,A,C,P)来形式化地表示。 对于“学号不能为空”的这条完整性约束用五元组描述 D:代表约束作用的数据对象为SNO属性; O(operation):当用户插入或修改数据时需要检查该完整性规则; A(assertion):SNO不能为空; C(condition):A可作用于所有记录的SNO属性; P(procdure):拒绝执行用户请求。 6.数据库管理系统(DBMS)

:①即数据库管理系统(Database Management System),是位于用户与操作系统之间的 一层数据管理软件,②为用户或应用程序提供访问DB的方法,包括DB的建立、查询、更 新及各种数据控制。 DBMS总是基于某种数据模型,可以分为层次型、网状型、关系型、面 向对象型DBMS。 7.关系模型:①用二维表格结构表示实体集,②外键表示实体间联系的数据模型称为关系模 型。 8.联接查询:①查询时先对表进行笛卡尔积操作,②然后再做等值联接、选择、投影等操作。 联接查询的效率比嵌套查询低。 9. 数据库设计:①数据库设计是指对于一个给定的应用环境,②提供一个确定最优数据模 型与处理模式的逻辑设计,以及一个确定数据库存储结构与存取方法的物理设计,建立起 既能反映现实世界信息和信息联系,满足用户数据要求和加工要求,又能被某个数据库管 理系统所接受,同时能实现系统目标,并有效存取数据的数据库。 10.事务的特征有哪些 事务概念 原子性一致性隔离性持续性 11.已知3个域: D1=商品集合=电脑,打印机 D3=生产厂=联想,惠普 求D1,D2,D3的卡尔积为: 12.数据库的恢复技术有哪些 数据转储和和登录日志文件是数据库恢复的

数据结构课程设计题目选择

数据结构课程设计题目 说明: (1)选用语言:C或Java语言; (2)需要注明3人(可少于3人)小组各自承担和完成的任务(据此给予成绩); (3)如下带“*”的题目,“*”越多,难度越大一些,分值权重更高---要得到更高分数,推荐选择。 要求: (1) 用中文给出设计说明书(含重要子函数的流程图); (2) 给出测试通过、能实现相应功能的源代码; (3) 测试报告。 0、小学数学四则混合运算试题出题、评价、题库自动生成与组卷系统(****)---已经有2组选择 任务: (1)将随机给出的四则混合运算表达式显示在计算机显示器上,要求应试者给出答案;并且使用堆栈对该表达式求值,同给出的答案进行比较,判断 正确和错误。给出鼓励信息和嘉奖信息; (2)保存多人在不同时间应试的题目与他(或她)给出的答案,评价所出题目的难易程度(通过多人回答正确与否的情况给出),形成题库; (3)按照用户给出的题目难易程度指标(例如让50人的得分满足怎样的正态分布,如90分以上10%,80分以上30%,70分以上30%,60分以上20%,60分 以下10%),从题库中抽取不同的题目,组成试卷。 要求:随机产生的题目中,参加运算的数据随机、运算符随机。题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。 1、集合的并、交和差运算---已经有1组选择 任务:编制一个能演示执行集合的并、交和差运算的程序。 要求: (1) 集合的元素限定为小写字母字符[…a?..?z?] 。 (2) 演示程序以用户和计算机的对话方式执行。 实现提示:以链表表示集合。 选作内容: (1) 集合的元素判定和子集判定运算。 (2) 求集合的补集。 (3) 集合的混合运算表达式求值。 (4) 集合的元素类型推广到其他类型,甚至任意类型。 2、停车场管理------已经有2组选择 任务:设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 要求:以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。 3、哈夫曼码的编/译码系统(**)---已经有1组选择

严蔚敏版数据结构课后习题答案-完整版

第1章绪论 1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。 解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象是性质相同的数据元素的集合,是数据的一个子集。 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 存储结构是数据结构在计算机中的表示。 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。 1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。 解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据

类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。 1.3 设有数据结构(D,R),其中 {}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r = 试按图论中图的画法惯例画出其逻辑结构图。 解: 1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。 解: ADT Complex{ 数据对象:D={r,i|r,i 为实数} 数据关系:R={} 基本操作: InitComplex(&C,re,im) 操作结果:构造一个复数C ,其实部和虚部分别为re 和im DestroyCmoplex(&C)

(完整版)数据库课后习题及答案

第一章数据库系统概述 选择题 1实体-联系模型中,属性是指(C) A.客观存在的事物 B.事物的具体描述 C.事物的某一特征 D.某一具体事件 2对于现实世界中事物的特征,在E-R模型中使用(A) A属性描述B关键字描述C二维表格描述D实体描述 3假设一个书店用这样一组属性描述图书(书号,书名,作者,出版社,出版日期),可以作为“键”的属性是(A) A书号B书名C作者D出版社 4一名作家与他所出版过的书籍之间的联系类型是(B) A一对一B一对多C多对多D都不是 5若无法确定哪个属性为某实体的键,则(A) A该实体没有键B必须增加一个属性作为该实体的键C取一个外关键字作为实体的键D该实体的所有属性构成键 填空题 1对于现实世界中事物的特征在E-R模型中使用属性进行描述 2确定属性的两条基本原则是不可分和无关联 3在描述实体集的所有属性中,可以唯一的标识每个实体的属性称为键 4实体集之间联系的三种类型分别是1:1 、1:n 、和m:n 5数据的完整性是指数据的正确性、有效性、相容性、和一致性 简答题 一、简述数据库的设计步骤 答:1需求分析:对需要使用数据库系统来进行管理的现实世界中对象的业务流程、业务规则和所涉及的数据进行调查、分析和研究,充分理解现实世界中的实际问题和需求。 分析的策略:自下而上——静态需求、自上而下——动态需求 2数据库概念设计:数据库概念设计是在需求分析的基础上,建立概念数据模型,用概念模型描述实际问题所涉及的数据及数据之间的联系。 3数据库逻辑设计:数据库逻辑设计是根据概念数据模型建立逻辑数据模型,逻辑数据模型是一种面向数据库系统的数据模型。 4数据库实现:依据关系模型,在数据库管理系统环境中建立数据库。 二、数据库的功能 答:1提供数据定义语言,允许使用者建立新的数据库并建立数据的逻辑结构 2提供数据查询语言 3提供数据操纵语言 4支持大量数据存储 5控制并发访问 三、数据库的特点 答:1数据结构化。2数据高度共享、低冗余度、易扩充3数据独立4数据由数据库管理系统统一管理和控制:(1)数据安全性(2)数据完整性(3)并发控制(4)数据库恢复 第二章关系模型和关系数据库 选择题 1把E-R模型转换为关系模型时,A实体(“一”方)和B实体(“多”方)之间一对多联系在关系模型中是通过(A)来实现的

数据结构课程设计题目及要求

实验一~实验四任选一题;实验五~实验九任选一题。 实验一运动会分数统计 一、实验目的: (1)熟练掌握线性表的两种存储方式 (2)掌握链表的操作和应用。 (3)掌握指针、结构体的应用 (4)按照不同的学校,不同项目和不同的名次要求,产生各学校的成绩单、团体总分报表。 二、实验内容: 【问题描述】 参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。 【基本要求】 产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。 【测试数据】 对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。 【实现提示】 可以假设m≤20,m≤30,w≤20,姓名长度不超过20个字符。每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。 【选作内容】 允许用户指定某些项目可采取其他名次取法。

实验二停车场管理 一、实验目的: (1)熟练掌握栈顺存和链存两种存储方式。 (2)掌握栈的基本操作及应用。 (3)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 二、实验内容: 【问题描述】 设停车场是一个可停放n辆汽车的长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。 【测试数据】 设n=2,输入数据为:(A,1,5),(A,1,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。 【实现提示】 需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。 【选作内容】 (1)两个栈共享空间,思考应开辟数组的空间是多少? (2)汽车可有不同种类,则他们的占地面积不同收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。(3)汽车可以直接从便道开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。 (4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。

(完整word版)数据结构课后习题及答案

填空题(10 * 1 '= 10') 一、概念题 22当对一个线性表经常进行的是插入和删除操作时,采用链式存储结构为宜。 23当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用顺序存储结构。 2.6. 带头结点的单链表L中只有一个元素结点的条件是L->Next->Next==Null。 36循环队列的引入,目的是为了克服假溢出。 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. 在单链表中设置头结点的作用是不管单链表是否为空表,头结点的指针均不空,并使得对单链表的操作 (如插入和删除)在各种情况下统一。 3.1. 队列是限制在表的一端进行插入和在另一端进行删除的线性表,其运算遵循先进先出原则。 3.2 .栈是限定尽在表位进行插入或删除操作的线性表。 3.5. 在链式队列中,判定只有一个结点的条件是(Q->rear==Q->fro nt)&&(Q->rear!=NULL) 。 3.7. 已知链队列的头尾指针分别是f和r,则将x入队的操作序列是node *p=(node *)malloc(node); p->next=x;] p_>next=NULL; if(r) {r->next=p; r=p;} else {r=p; f=p;}。 3.8. 循环队列的满与空的条件是(rear+1)%MAXSIZE==fornt 和(fron t=-1 &&rear+ ^=MAXSIZE) 。 4.3. 串是一种特殊的线性表,其特殊性表现在数据元素都是由字符组成。 4.7. 字符串存储密度是串值所占存储位和实际分配位的比值,在字符串的链式存储结构中其结点大小是可变的。 5.3. 所谓稀疏矩阵指的是矩阵中非零元素远远小于元素总数,则称该矩阵为矩阵中非零元素远远小于元素总数,则称该矩阵为稀 疏矩阵。 5.4. —维数组的逻辑结构是线性结构,存储结构是顺序存储结构;对二维或多维数组,分别按行优先和列优先两种?不同的存储 方式。 7.4. 在有向图的邻接矩阵表示中,计算第i个顶点入度的方法是求邻接矩阵中第?i列非10元素的个数。 7.10. AOV网中,结点表示活动,边表示活动之间的优先关系,AOE网中,结点表示事件,边表示活动。 9.1. 按排序过程中依据不同原则对内部排序方法进行分类,主要有选择排序、交换排序、插入排序归并排序等4类。 9.3 .在堆排序、快速排序和归并排序中若只从排序结果的稳定性考虑,则应选择归并排序方法;若只从平均情况下 排序最快考虑,则应选择快速排序方法;若只从最坏情况下排序最快且要节省类存考虑,则应选择堆排序方法。 9.4. 直接插入排序用监视哨的作用是存当前要的插入记录,可又省去查找插入位置时对是否出界的判断。 9.6. 设表中元素的初始状态是按键值递增的,则直接插入排序最省时间,快速排序最费时间。 4.9. 下列程序判断字符串s是否对称,对称则返回1,否则返回0;如?(abba”返回1, ? (”abab”)返回0. Int f (char*s) { Int i=0,j=0;

数据结构课后习题答案

数据结构习题集答案 第1章绪论 1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。 解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象是性质相同的数据元素的集合,是数据的一个子集。 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。存储结构是数据结构在计算机中的表示。 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。 1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。 解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据

类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。 1.3 设有数据结构(D,R),其中 {}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r = 试按图论中图的画法惯例画出其逻辑结构图。 解: 1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。 解:ADT Complex{ 数据对象:D={r,i|r,i 为实数} 数据关系:R={} 基本操作: InitComplex(&C,re,im) 操作结果:构造一个复数C ,其实部和虚部分别为re 和im DestroyCmoplex(&C) 操作结果:销毁复数C Get(C,k,&e) 操作结果:用e 返回复数C 的第k 元的值

课后题

在计算机局域网中,常用通信设备有(ABD) A集线器 B交换机 C调制解调器 D路由器 线缆标准化工作主要由哪一儿歌协会制定?(C) A OSI B ITU-T C EIA D IEEE 802协议族是由以下面那一个组织定义?(C) A OSI B EIA C IEEE D ANSI 衡量网络性能的两个主要指标为(AC) A带宽 B可信度 C延迟 D距离 局域网区别其他网络主要体现在以下(ABCD)方面。 A网络所覆盖的物理范围 B网络所使用的传输技术 C网络的拓扑结构 D带宽 会产生单点故障的是下列(ABC)拓扑结构 A总线型 B环型 C网状结构 D星型 数据交换技术包括(ABC) A电路交换 B报文交换 C分组交换 D文件交换 (B)拓扑结构会受到网络中信号反射的影响? A网型 B总线型 C环型 D星型 OSI参考模型按照顺序有哪些层?(C) C应用层、表示层、会话层、传输层、网络层、数据链路层、物理层在OSI七层模型中,网络层的功能有(B) A确保数据的传送正确无误

B确定数据包如何转发与路由 C在信道上传比特流 D纠错与流控 在OSI七层模型中,(B)哪一层的实现对数据加密。 A传输层 B表示层 C应用层 D网络层 网络层传输的数据叫做(B) A比特 B包 C段 D帧 TCP/IP协议栈中传输层协议有(AC) A TCP B ICMP C UDP D IP 数据从上到下封装的格式为(B) A比特包帧段数据 B数据段包帧比特 C比特帧包段数据 D数据包段帧比特 物理层定义了物理接口的哪些特性?(ABCD) A机JIE特性 B电气特性 C功能特性 D接口特性 细同轴电缆(10Base2)传输距离约达(A)粗同轴电缆(10Base5)的传输距离为(B) A 200米 B 500米 C 150米 D 485米 通常在网吧里,LAN采用的拓扑结构和网线类型为(C) A总线型和STP B总心型和UTP C形型和UTP D环型和STP 双绞线电缆为什么能代替网络中的细同轴电缆。(D) A双绞线电缆可靠性高 B双绞线电缆抗噪性更好 C细同轴电缆更廉价 D双绞线电缆更便于安装 在布线时,细缆和粗缆通常应用在(D)拓扑结构中。

关于数据结构课程设计心得体会范文

关于数据结构课程设计心得体会范文 心得体会是指一种读书、实践后所写的感受性文字。是指将学习的东西运用到实践中去,通过实践反思学习内容并记录下来的文字,近似于经验总结。下面是小编搜集的关于数据结构课程设计心得体会范文,希望对你有所帮助。 关于数据结构课程设计心得体会(1) 这学期开始两周时间是我们自己选题上机的时间,这学期开始两周时间是我们自己选题上机的时间,虽然上机时间只有短短两个星期但从中确实学到了不少知识。上机时间只有短短两个星期但从中确实学到了不少知识。 数据结构可以说是计算机里一门基础课程,据结构可以说是计算机里一门基础课程,但我觉得我们一低计算机里一门基础课程定要把基础学扎实,定要把基础学扎实,然而这次短短的上机帮我又重新巩固了 c 语言知识,让我的水平又一部的提高。数据结构这是一门语言知识让我的水平又一部的提高。数据结构这是一门知识,纯属于设计的科目,它需用把理论变为上机调试。 纯属于设计的科目,它需用把理论变为上机调试。它对我们来说具有一定的难度。它是其它编程语言的一门基本学科。来说具有一定的难度。它是其它编程语言的一门基本学科。我选的上机题目是交叉合并两个链表,对这个题目,我选的上机题目是交叉合并两个链表,对这个题目,我觉得很基础。刚开始调试代码的时候有时就是一个很小的错觉得很基础。 刚开始调试代码的时候有时就是一个很小的错调试代码的时候误,导致整个程序不能运行,然而开始的我还没从暑假的状导致整个程序不能运行,态转到学习上,每当程序错误时我都非常焦躁,态转到学习上,每当程序错误时我都非常焦躁,甚至想到了放弃,但我最终找到了状态,一步一步慢慢来,放弃,但我最终找到了状态,一步一步慢慢来,经过无数次的检查程序错误的原因后慢慢懂得了耐心是一个人成功的必然具备的条件! 同时,通过此次课程设计使我了解到,必然具备的条件! 同时,通过此次课程设计使我了解到,硬件语言必不可缺少,要想成为一个有能力的人,必须懂得件语言必不可缺少,要想成为一个有能力的人,硬件

最全数据结构课后习题答案耿国华版

绪论第1章 √(2)×(3)2.(1)×C )C(3(1)A(2)3. 的语句频度5.计算下列程序中x=x+1for(i=1;i<=n;i++) for(j=1;j<=i;j++) for(k=1;k<=j;k++) x=x+1; 的语句频度为:【解答】x=x+1=n(n+1)(n+2)/6 )+……+(1+2+……+n)T(n)=1+(1+2)+(1+2+3 并确定算法中每一),p(xx+ax+a+…….+ax的值6.编写算法,求一元多项式p(x)=a n20nn20n1规定算法中不能使用要求时间复杂度尽可能小,语句的执行次数和整个算法的时间复杂度,算法的输入和输出)。n,输出为P(x求幂函数。注意:本题中的输入为a(i=0,1,…n)、x和0in采用下列方法1)通过参数表中的参数显式传递()通过全局变量隐式传递。讨论两种方法的优缺点,并在算法中以你认为较好的一种实(2 现输入输出。【解答】1)通过参数表中的参数显式传递(优点:当没有调用函数时,不占用存,调用结束后形参被释放,实参维持,函数通用 性强,移置性强。缺点:形参须与实参对应,且返回值数量有限。 )通过全局变量隐式传递(2 优点:减少实参与形参的个数,从而减少存空间以及传递数据时的时间消耗 缺点:函数通用性降低,移植性差 算法如下:通过全局变量隐式传递参数PolyValue() { int i,n; float x,a[],p; nn=”);printf(“\ scanf(“%f”,&n); nx=”);printf(“\ scanf(“%f”,&x); for(i=0;i

课后习题答案大全

《新视野大学英语读写教程(第二版)第三册》课后答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=16&fromuid=191597 新视野大学英语读写教程(第二版)第一册》课后答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=14&fromuid=191597 《马·克思主·义基本原理概论》新版完整答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=37&fromuid=191597 《毛·泽东思想和中国特色社会主·义理论体系概论》习题答案(2008年修订版的) https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=48&fromuid=191597 21世纪大学实用英语综合教程(第一册)课后答案及课文翻译 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=4&fromuid=191597 西方经济学(高鸿业版)教材详细答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=60&fromuid=191597 《新视野大学英语读写教程(第二版)第二册》课后答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=15&fromuid=191597 思想道德修养与法律基础课后习题答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=63&fromuid=191597 《中国近代史纲要》完整课后答案(高教版) https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=81&fromuid=191597 《全新版大学英语综合教程》(第三册)练习答案及课文译文 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=77&fromuid=191597 《全新版大学英语综合教程》(第一册)练习答案及课文译文 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=75&fromuid=191597 《会计学原理》同步练习题答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=305&fromuid=191597 《微观经济学》课后答案(高鸿业版) https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=283&fromuid=191597 《统计学》课后答案(第二版,贾俊平版) https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=29&fromuid=191597 《西方经济学》习题答案(第三版,高鸿业)可直接打印 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=289&fromuid=191597 毛邓三全部课后思考题答案(高教版)/毛邓三课后答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=514&fromuid=191597 新视野大学英语听说教程1听力原文及答案下载 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=2531&fromuid=191597 西方宏观经济高鸿业第四版课后答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=2006&fromuid=191597 《管理学》经典笔记(周三多,第二版) https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=280&fromuid=191597 《中国近代史纲要》课后习题答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=186&fromuid=191597 《理论力学》课后习题答案 https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=55&fromuid=191597 《线性代数》(同济第四版)课后习题答案(完整版) https://www.360docs.net/doc/6c2851736.html,/viewthread.php?tid=17&fromuid=191597

数据结构课程设计排序算法总结

排序算法: (1) 直接插入排序 (2) 折半插入排序(3) 冒泡排序 (4) 简单选择排序 (5) 快速排序(6) 堆排序 (7) 归并排序 【算法分析】 (1)直接插入排序;它是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的序的有序表中,从而得到一个新的、记录数增加1的有序表。 (2)折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,我们知道这个查找操作可以利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入相同,从时间上比较,折半插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。 (3)冒泡排序:比较相邻关键字,若为逆序(非递增),则交换,最终将最大的记录放到最后一个记录的位置上,此为第一趟冒泡排序;对前n-1记录重复上操作,确定倒数第二个位置记录;……以此类推,直至的到一个递增的表。 (4)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。 (5)快速排序:它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 (6)堆排序: 使记录序列按关键字非递减有序排列,在堆排序的算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个“大顶堆”,如此反复直至排序结束。 (7)归并排序:归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序称为2-路归并排序。 【算法实现】 (1)直接插入排序: void InsertSort(SqList &L){ for(i=2;i<=L.length ;i++) if(L.elem[i]L.elem[0];j--) L.elem [j+1]=L.elem [j]; L.elem [j+1]=L.elem[0]; } } (2)折半插入排序:

最全数据结构课后习题答案(耿国华版[12bb]

第1章绪论工程大数电习题答案册工程大数电习题答案 册 2.(1)×(2)×(3)√ 3.(1)A(2)C(3)C 5.计算下列程序中x=x+1的语句频度 for(i=1;i<=n;i++) for(j=1;j<=i;j++) for(k=1;k<=j;k++) x=x+1; 【解答】x=x+1的语句频度为: T(n)=1+(1+2)+(1+2+3)+……+(1+2+……+n)=n(n+1)(n+2)/6 6.编写算法,求一元多项式p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。注意:本题中的输入为a i(i=0,1,…n)、x和n,输出为P n(x0)。算法的输入和输出采用下列方法 (1)通过参数表中的参数显式传递 (2)通过全局变量隐式传递。讨论两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。 【解答】 (1)通过参数表中的参数显式传递 优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。 缺点:形参须与实参对应,且返回值数量有限。 (2)通过全局变量隐式传递 优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗 缺点:函数通用性降低,移植性差 算法如下:通过全局变量隐式传递参数 PolyValue() { int i,n; float x,a[],p; printf(“\nn=”); scanf(“%f”,&n); printf(“\nx=”); scanf(“%f”,&x); for(i=0;i

相关文档
最新文档