c语言数据结构总结

c语言数据结构总结
c语言数据结构总结

数据结构大全

一、概论

二、线性表

三、栈和队列

四、串

五、多维数组和广义表

十、文件

六、树

七、图

八、排序

九、查找

一、概论

1、评价一个算法时间性能的主要标准是( 算法的时间复杂度)。

2、算法的时间复杂度与问题的规模有关外,还与输入实例的( 初始状态)有关。

3、一般,将算法求解问题的输入量称为( 问题的规模)。

4、在选择算法时,除首先考虑正确性外,还应考虑哪三点?

答:选用的算法首先应该是"正确"的。此外,主要考虑如下三点:①执行算法所耗费的时间;②执行算法所耗费的存储空间,其中主要考虑辅助存储空间;③算法应易于理解,易于编码,易于调试等等。

6、下列四种排序方法中,不稳定的方法是( D )

A、直接插入排序

B、冒泡排序

C、归并排序

D、直接选择排序

7、按增长率由小至大的顺序排列下列各函数:

2100, (3/2)n,(2/3)n,n n,n0.5 , n! ,2n,lgn ,n lgn, n3/2

答:常见的时间复杂度按数量级递增排列,依次为: 常数0(1)、对数阶0(log2n)、线形阶0(n)、线形对数阶0(nlog2n)、平方阶0(n2)立方阶0(n3)、…、k次方阶0(n k)、指数阶0(2n)。显然,时间复杂度为指数阶0(2n)的算法效率极低,当n值稍大时就无法应用。先将题中的函数分成如下几类:

常数阶:2100

对数阶:lgn

K次方阶:n0.5、n3/2

指数阶(按指数由小到大排):n lgn、(3/2)n、2n、n!、n n

注意:(2/3)n由于底数小于1,所以是一个递减函数,其数量级应小于常数阶。

根据以上分析按增长率由小至大的顺序可排列如下:

(2/3)n <2100 < lgn < n0.5< n3/2 < n lgn <(3/2)n < 2n < n! < n n

8、常用的存储表示方法有哪几种? 常用的存储表示方法:顺序存储方法、链接存储方法、索引存储方法、散列存储方法。

9、设有两个算法在同一机器上运行,其执行时间分别为100n2和2n,要使前者快于后者,n至少要(15)。

二、线性表

1、以下关于线性表的说法不正确的是( C )。

A、线性表中的数据元素可以是数字、字符、记录等不同类型。

B、线性表中包含的数据元素个数不是任意的。

C、线性表中的每个结点都有且只有一个直接前趋和直接后继。

D、存在这样的线性表:表中各结点都没有直接前趋和直接后继。

2、线性表是一种典型的( 线性)结构。

3、线性表的逻辑结构特征是什么?

答:对于非空的线性表:①有且仅有一个开始结点A1,没有直接前趋,有且仅有一个直接后继A2;

②有且仅有一个终结结点AN,没有直接后继,有且仅有一个直接前趋AN-1;③其余的内部结点AI (2≤I≤N-1)都有且仅有一个直接前趋AI-1和一个AI+1。

4、线性表的顺序存储结构是一种( 随机存取)的存储结构。线性结构的顺序存储结构是一种随机存取的存储结构,线性表的链式存储结构是一种顺序存取的存储结构。线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续

5、在顺序表中,只要知道( 基地址和结点大小),就可在相同时间内求出任一结点的存储地址。

6、在等概率情况下,顺序表的插入操作要移动( 一半)结点。

7、在一个长度为n的顺序表中删除第i个元素,要移动( n-i )个元素

8、如果要在第i个元素前插入一个元素,要后移( n-i+1 )个元素。

9、采用( 顺序)存储结构的线性表叫顺序表。

10、顺序表中逻辑上相邻的元素的物理位置( 相邻 )。

11、在( C )运算中,使用顺序表比链表好。

A、插入

B、删除

C、根据序号查找

D、根据元素值查找

12、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( O(n) )。

13、在无头结点的单链表中,第1个结点的地址存放在头指针中,其他结点的存储地址存放在( 前趋)结点的next域中。

14、在( 循环)链表中,从任何一结点出发都能访问到表中的所有结点。

15、( 双向 )链表适合从指点结点开始,寻找直接前趋的运算。

16、顺序表相对于链表的优点有节省存储和随机存取。

17、在链表的开始结点前设置头结点的优点是什么?

答:头结点是在链表的开始结点之前附加一个结点。它具有两个优点:(1)、由于开始结点的位置被,所以在链表的第一个存放在头结点的指针域中位置上的操作就和在表的其它位置上操作一致,无须进行特殊处理;(2)、无论链表是否为空,其头指针是指向头结点的非空指针(空表中头结点的指针域空),因此空表和非空表的处理也就统一了。

18、(双向链表)适合作为经常在首尾两端操作线性表的存储结构。

19、如果线性表的存储空间变化较大,则适合用(链)表。

20、当线性表的数据变化不大,主要用于查询时,用(顺序)表比较好。

21、在链表中,每个结点中含8个字符,1个指针域。其中每个字符占1个字节,每个指针占4个字节。则该结点的存储密度是(2/3)。(1+1+4)/(8+1)=2/3存储密度=(结点数据本身所占的存储量)/(结点结构所占的存储总量)

22、链表相对于顺序表的优点有插入和删除操作方便。

23、在n个结点的顺序表中插入一个结点需平均移动n/2个结点,具体任务的移动次数取决于表长n和插入位置i。

24、在n个结点的顺序表中删除一个结点需平均移动(n-1)/2个结点,具体任务的移动次数取决于表长n和删除位置i。

25、尾指针是指向终端结点的指针查找时间都是O(1),用头指针来表示该链表,则查找终端结点的时间为O(n)。

补充:

1、顺序表上实现的基本运算:表的初始化、求表长、取表中第i个结点三种运算的时间复杂度都为

O(1)。

2、顺序表插入操作算法分析

①问题的规模

表的长度L->length(设值为n)是问题的规模。

②移动结点的次数由表长n和插入位置i决定

算法的时间主要花费在for循环中的结点后移语句上。该语句的执行次数是n-i+1。

当i=n+1:移动结点次数为0,即算法在最好时间复杂度是0(1)

当i=1:移动结点次数为n,即算法在最坏情况下时间复杂度是0(n)

③移动结点的平均次数E is(n)

其中:

在表中第i个位置插入一个结点的移动次数为n-i+1

p i表示在表中第i个位置上插入一个结点的概率。不失一般性,假设在表中任何合法位置(1≤i≤n+1)上的插入结点的机会是均等的,则p1=p2=…=p n+1=1/(n+1) 因此,在等概率插入的情况下,

即在顺序表上进行插入运算,平均要移动一半结点。

3、顺序表删除操作算法分析

①结点的移动次数由表长n和位置i决定:

i=n时,结点的移动次数为0,即为0(1)

i=1时,结点的移动次数为n-1,算法时间复杂度分别是0(n)

②移动结点的平均次数E DE(n)

其中:删除表中第i个位置结点的移动次数为n-i

p i表示删除表中第i个位置上结点的概率。不失一般性,假设在表中任何合法位置(1≤i≤n)上的删除结点的机会是均等的,则p1=p2=…=p n=1/n 因此,在等概率插入的情况下,

顺序表上做删除运算,平均要移动表中约一半的结点,平均时间复杂度也是0(n)。

4、单链表的运算:头插法建表、尾插法建表、尾插法建带头结点的单链表三个算法的时间复杂度均为0(n)。

5、单链表的查找运算:按序号查找、按值查找其平均时间复杂度为O(n)。

6、单链表的插入运算:算法的时间主要耗费在查找操作GetNode上,故时间复杂度亦为O(n)。

7、单链表的删除运算:算法的时间复杂度也是O(n)。

8、循环链表:若在单链表或头指针表示的单循环表上做这种链接操作,都需要遍历第一个链表,找到结点a n,然后将结点b1链到a n的后面,其执行时间是O(n)。若在尾指针表示的单循环链表上实现,则只需修改指针,无须遍历,其执行时间是O(1)。

9、双向链表的前插和删除本结点操作:两个算法的时间复杂度均为O(1)。

10、结点a i的存储地址

不失一般性,设线性表中所有结点的类型相同,则每个结点所占用存储空间大小亦相同。假设表中每个结点占用c个存储单元,其中第一个单元的存储地址则是该结点的存储地址,并设表中开始结点a1的存储地址(简称为基地址)是LOC(a1),那么结点a i的存储地址LOC(a i)可通过下式计

算: LOC(a

i )= LOC(a

1

)+(i-1)*c 1≤i≤n

三、栈和队列

1、栈与一般的线性表的区别在于(运算是否受限制)。

2、一个栈的入栈序列是abcde,则栈的不可能的输出序列是(C)。

A、Edcba

B、decba

C、dceab

D、abcde

3、在对栈的操作中,能改变栈的结构的是(InitStack(S))。

4、顺序栈的类型定义如下:

typedef maxsize 64;

typedef struct {

int data[maxsize];

int top;}seqstack;

seqstack *s;

顺序栈s栈满条件是(s->top==maxsize-1)。

5、向一个栈顶指针为HS的链栈中将一个S指针所指的结点入栈,执行(S->next=HS->next; HS=s;)。

6、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列是p1,p2,p3,…,pn,若p1=n,则pi=(n-i+1)。

7、在栈中,可进行插入和删除操作的一端称(栈顶)。

8、在栈的出栈操作中,要先判断栈是否空,否则会产生(下溢)现象。

9、当程序中同时使用(2)个栈时,让它们共享同一向量空间可减少上溢的发生。

10、栈的特点是(后进先出)。当问题满足(先进后出)原则时可使用队列作数据结构。当问题

满足(后进先出)原则时可使用栈作数据结构。

11、由于链栈的操作只在链表头部进行,所以没有必要设置(头)结点。

12、若内存空间充足,(链)栈可不定义栈满运算。

13、一个队列的入列序列是1 2 3 4,则队列的输出序列是( 1 2 3 4)。

14、队列与一般的线性表的区别在于(运算是否受限制)。

15、“假上溢”现象会出现在(顺序队列)中。

16、在一个链队中,假设F和R分别是队首和队尾指针,则删除一个结点的运算是(F=F->next;)。

17、假设以数组sequ[m]存放循环队列,同时设变量rear和quelen分别指示循环队列中队尾元素的位置和内含的元素个数,则判别队满的条件是(quelen==m)。

18、为了克服“假上溢”,一般可用(循环)向量存储队列中的元素。

19、在顺序队列中,若队列非空,(队头)指针指向队头元素,队尾指针指向队尾元素的下一位置。

20、循环队列采用的是(顺序)存储结构。

21、设F和R是循环队列的队头指针和队尾指针,则判断队空的条件是(F==R )。

22、在(队列中只有一个元素)情况下,链队列的出队操作需要修改尾指针。

23、说出解决循环队列中,判断队空和队满情况的三种方法。

答:①另设一布尔变量以区别队列的空和满;②少用一个元素的空间,约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:REAR所指的单元始终为空);

③使用一个计数器记录队列中元素的总数(实际上是队列长度)。

24、设计一个判别表达式中左、右括号是否配对出现的算法,采用(线性表的顺序存储结构)

数据结构最佳。

25、在计算递归函数时,如不使用递归过程,则一般情况下必须借助于(栈 )数据结构。

26、计算机在运行递归程序时,要用到(系统)提供的栈。

27、什么是递归算法?设计递归算法要分哪两个步骤?

答:所谓递归是指:若在一个函数、过程或者数据结构定义的内部又直接(或间接)出现有定义本身的应用,则称它们是递归的,或者是递归定义的。

递归算法的设计步骤第一步骤(递归步骤):将规模较大的原问题分解为一个或多个规模更小、但具有类似于原问题特性的子问题,即较大的问题递归地用较小的子问题来描述,解原问题的方法同样可用来解这些子问题;第二步骤:确定一个或多个无须分解、可直接求解的最小子问题(称为递归的终止条件)。

28、在栈结构中,允许插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。

29、在有n个元素的栈中,进栈和退栈操作的时间复杂度为O(1)和O(1)。

30、在队列结构中,允许插入的一端称为队尾,允许删除的一端称为队头。

31、设长度为n的链队列用单循环链表,若只设头指针,则入队和出队操作的时间复杂度分别为O(n)和O(1);若只设尾指针,则入队和出队操作的时间复杂度分别为O(1)和O(1)。

32、设循环向量有m个元素,循环向量中有一个循环队列。在循环队列中,设头指针front指向队头元素,队尾指针指向队尾元素后的一个空闲元素。

(1)在循环队列中,队空标志为front==rear;队满标志为front==(rear+1)%QueueSize。

(2)当rear>=front时,队列长度为rear-front;当rear

33、设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:

(1)若入、出栈次序为Push(1), Pop(),Push(2),Push(3), Pop(), Pop( ),Push(4), Pop( ),则出栈的数字序列为何(这里Push(i)表示i进栈,Pop( )表示出栈)?

(2)能否得到出栈序列1423和1432?并说明为什么不能得到或者如何得到。

(3)请分析1,2 ,3 ,4 的24种排列中,哪些序列是可以通过相应的入出栈操作得到的。

答:(1)出栈序列为:1324

(2)不能得到1423序列。因为要得到14的出栈序列,则应做Push(1),Pop(),Push(2),Push (3),Push(4),Pop()。这样,3在栈顶,2在栈底,所以不能得到23的出栈序列。能得到1432的出栈序列。具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop()。

(3)在1,2 ,3 ,4 的24种排列中,可通过相应入出栈操作得到的序列是:

1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321

不能得到的序列是:

1423,2413,3124,3142,3412,4123,4132,4213,4231,4312

34、指出下述程序段的功能是什么?

(1) void Demo1(SeqStack *S){

int i; arr[64] ; n=0 ;

while ( StackEmpty(S)) arr[n++]=Pop(S);

for (i=0, i< n; i++) Push(S, arr[i]);

} //Demo1

答:程序段的功能是将一栈中的元素按反序重新排列,也就是原来在栈顶的元素放到栈底,栈底的元素放到栈顶。此栈中元素个数限制在64个以内。

(2) SeqStack S1, S2, tmp;

DataType x;

...//假设栈tmp和S2已做过初始化

while ( ! StackEmpty (&S1))

{

x=Pop(&S1) ;

Push(&tmp,x);

}

while ( ! StackEmpty (&tmp) )

{

x=Pop( &tmp);

Push( &S1,x);

Push( &S2, x);

}

答:程序段的功能是利用tmp栈将一个非空栈s1的所有元素按原样复制到一个栈s2当中去。

(3) void Demo2( SeqStack *S, int m)

{ // 设DataType 为int 型

SeqStack T; int i;

InitStack (&T);

while (! StackEmpty( S))

if(( i=Pop(S)) !=m) Push( &T,i);

while (! StackEmpty( &T))

{

i=Pop(&T); Push(S,i);

}

}

答:程序段的功能是利用栈T,将一个非空栈S中值等于m的元素全部删去。

(4)void Demo3( CirQueue *Q)

{ // 设DataType 为int 型

int x; SeqStack S;

InitStack( &S);

while (! QueueEmpty( Q ))

{x=DeQueue( Q); Push( &S,x);}

while (! StackEmpty( &s))

{ x=Pop(&S); EnQueue( Q,x );}

}// Demo3

答:程序段的功能是将一个循环队列Q经过S栈的处理,反向排列,原来的队头变成队尾,原来的队尾变成队头。

(5) CirQueue Q1, Q2; // 设DataType 为int 型

int x, i , n= 0;

... // 设Q1已有内容,Q2已初始化过

while ( ! QueueEmpty( &Q1) )

{ x=DeQueue( &Q1 ) ; EnQueue(&Q2, x); n++;}

for (i=0; i< n; i++)

{ x=DeQueue(&Q2) ;

EnQueue( &Q1, x) ; EnQueue( &Q2, x);}

答:这段程序的功能是将队列1的所有元素复制到队列2中去,但其执行过程是先把队列1的元素全部出队,进入队列2,然后再把队列2的元素复制到队列1中。

补充:

1、顺序栈的基本操作

前提条件:设S是SeqStack类型的指针变量。若栈底位置在向量的低端,即S->data[0]是栈底元素。

(1)进栈操作

进栈时,需要将S->top加1

注意:①S->top==StackSize-1表示栈满

②"上溢"现象--当栈满时,再做进栈运算产生空间溢出的现象。

上溢是一种出错状态,应设法避免。

(2)退栈操作

退栈时,需将S->top减1

注意:①S->top<0表示空栈

②"下溢"现象——当栈空时,做退栈运算产生的溢出现象。下溢是正常现象,常用作程序控制转移的条件。

2、顺序队列中的溢出现象

①"下溢"现象当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。

②"真上溢"现象当队列满时,做进栈运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。

③"假上溢"现象由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。

为充分利用向量空间,克服"假上溢"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。

四、串

1、串是一种特殊的线性表,其特殊性体现在(数据元素是一个字符)。

2、有两个串P和Q,求P和Q中首此出现的位置的运算称(求子串)。

3、设串s1='ABCDEFG',s2='PQRST',函数con(x,y)返回x和y串的连接串,subs(s,I,j)返回串s的从

序号i的字符开始的j个字符组成的子串,len(s)返回串s的长度,则con(subs(s1,2,len(s2)),subs(s1,len(s2),2)))的结果串是( D)。

A、BCDEF

B、BCDEFG

C、BCPQRST

D、BCDEFEF

4、在空串和空格串中,长度不为0的是(空格串)。

5、在串的模式匹配中,一般(有效位移的个数小于合法位移的个数 )。

6、在顺序串中,根据空间分配方式的不同,可分为(静态分配和动态分配)。

7、按存储结构不同,串可分为(顺序串和链串)。通常在程序中使用的串可分为:串变量和串常

量。

8、在C语言中,以字符(\0)表示串值的终结。

9、在链串中,为了提高存储密度,应该增大(结点的大小).

10、假设每个字符占1个字节,若结点大小为4的链串的存储密度为50%,则其每个指针占(4)

个字节。

11、顺序串上的子串定位运算算法分析:该算法最坏情况下的时间复杂度为O((n-m+1)m)。

分析:当目标串和模式串分别是"a n-1b"和"a m-1b"时,对所有n-m+1个合法的位移,均要比较m 个字符才能确定该位移是否为有效位移,因此所需比较字符的总次数为(n-m+1)m。

12、串(String)是零个或多个字符组成的有限序列。一般记为 S="a1a2……a n"。

13、长度为零的串称为空串(Empty String),它不包含任何字符。仅由一个或多个空格组成的串

称为空白串(Blank String)。

14、子串定位运算又称串的模式匹配或串匹配。在串匹配中,一般将被匹配的主串称为目标(串),

子串称为模式(串)。

15、朴素的串匹配算法最坏情况下需比较字符的总次数为(n-m+1)m。n为主串长,m为子串长。

16、串匹配就是对于合法的位置(又称合法的位移)0≤i≤n-m,依次将目标串中的子串"t i t i+1…t i+m-1"

和模式串"p0p1p2…p m-1"进行比较:

①若"t i t i+1…t i+m-1"="p0p1p2…p m-1",则称从位置i开始的匹配成功,或称i为有效位移。

②若"t i t i+1…t i+m-1"≠"p0p1p2…p m-1",则称从位置i开始的匹配失败,或称i为无效位移。

因此,串匹配问题可简化为找出某给定模式串P在给定目标串T中首次出现的有效位移。

17、朴素模式算法在最好的情况下的运行时间是(M)(为一次内循环为单位)。

18、设T[0..n-1]="adaabaabcaabaa",P[0..m-1]="aab".当用模式串匹配目标串T时,请给出所有的有效

位移。算法NaiveStrMatch(T,P)返回的位移是哪一个位移。

解:所有的有效位移i的值为:2,5,9。算法NaveStrMatch(T,P)的返回值是第一个有效位移,因此是2。

19、假设有如下的串说明: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。

因此:执行p=stchr(s1,'t');后p的值是指向第一个字符t的位置, 也就是p==&s1[1]。

执行p=strchr(s2,'9');后p的值是指向s2串中第一个9所在的位置,也就是p==&s2[9]。

` 执行p=strchr(s2,'6');之后,p的返回值是NULL。

(2)在执行下列语句后,s3的值是什么?

strcpy(s3,s1); strcat(s3,","); strcat(s3,s2);

答:strcpy函数功能是串拷贝,strcat函数的功能是串联接。所以:

在执行strcpy(s3,s1); 后,s3的值是"Stocktom,CA"

在执行strcat(s3,","); 后,s3的值变成"Stocktom,Ca,"

在执行完strcat(s3,s2);后,s3的值就成了"Stocktom,Ca,March 5,1999"

(3)调用函数strcmp(s1,s2)的返回值是什么?

答:函数strcmp(串1,串2)的功能是串比较,按串的大小进行比较,返回大于0,等于0或小于0的值以表示串1比串2 大,串1等于串2 ,串1小于串2。因此在调用函数strcmp(s1,s2)后,返回值是大于0的数(字符比较是以ascii码值相比的)

(4)调用函数strcmp(&s1[5],"ton")的返回值是什么?

答:首先,我们要知道&s1[5]是一个地址,当放在函数strcmp中时,它就表示指向以它为首地址的一个字符串,所以在strcmp( &s1[5],"ton")中,前一个字符串值是"tom,CA",用它和"ton"比较,应该是后者更大,所以返回值是小于0的数。

(5)调用函数stlen(strcat(s1,s2))的返回值是什么?

答:strlen是求串长的函数,我们先将s1,s2联接起来,值是"Stocktom,CAMarch 5,1999",数一数有几个字符?是不是23个(空格也是一个)? 所以返回值是23。

五、多维数组和广义表

1、n维数组中的每个元素都最多有(n)个直接前趋。

2、对于一个一维数组A[12],若一个数据元素占用字节数为S,首地址为1,则A[i](i>=0)的存储

地址为( A ),若首地址为D,则A[i]的存储地址为( B )。答:A-(1+S*I) B-(D+S*I)

3、已知二维数组A[m][n]采用行优先顺序存储,每个元素占k个存储单元,并且第一个元素的存

储地址LOC(A[0][0]),则A[i][j]的地址是(1+(n*i+j)*k)。

4、在多维数组中,数据元素的存放地址直接可通过地址计算公式计算出。因此,数组是一种(随

机)存取结构。

5、稀疏矩阵的一般的压缩方法有(三元组表)。

6、设矩阵A是一个对称矩阵,为了节省空间,将其下三角部分按行优先存放在一维数组B中。对

下三角矩阵中任一元素aij(设矩阵A是一个对称矩阵,为了节省空间,将其下三角部分按行优先存放在一维数组B中,对下三角矩阵中任一元素aij(i>=j),在一维数组B中下标K的值是

(D)。

A、i(i-1)/2+j-1

B、i(i-1)/2+j

C、i(i+1)/2+j-1

D、i(i+1)/2+j

7、在稀疏矩阵的三元组表表示法中,每个三元组表示(矩阵中非零元素的行号、列号和值)。

8、对稀疏矩阵进行压缩存储是为了(节约存储空间)。

9、矩阵的压缩存储就是为多个相同的非零元素分配( 1 )个存储空间,不为零元素分配空间。

10、一般,特殊矩阵按规律压缩存储到一个向量中后,能(随机)存取。

11、广义表是线性表的推广,它们之间的区别在于(能否使用子表)。

12、在广义表中,限制了表中成分递归,但没有限制共享的是(再入表)。

13、广义表((a),((b),c),(((d))))的表头是(a )。广义表((a),((b),c),(((d))))的表尾是(((b),c),(((d))))。广义

表((a),((b),c),(((d))))的深度是(4 ) 。广义表((a),((b),c),(((d))))的长度是(3 )。

14、递归表、再人表、纯表、线性表之间的关系满足:

15、广义表是线性表的推广,线性表是广义表的特例。当广义表中的元素都是原子时,即为线性表。

16、设二维数组A5*6的每个元素占4个字节,已知Loc(a00)=1000,A共占多少个字节? A的终端

结点a45的起始地位为何?按行和按列优先存储时,a25的起始地址分别为何?

解:(1)因含5*6=30个元素,因此A共占30*4=120个字节。

(2)a45的起始地址为:Loc(a45)=Loc(a00)+(i*n+j)*d=1000+(4*6+5)*4=1116

(3)按行优先顺序排列时,a25=1000+(2*6+5)*4=1068

(4)按列优先顺序排列时:(二维数组可用行列下标互换来计算) a25=1000+(5*5+2)*4=1108 17、求下列广义表运算的结果:

(1)head ((p,h,w)); (2)tail((b,k,p,h)); (3) head (((a,b),(c,d)));

(4)tail(((a,b),(c,d))); (5)head(tail(((a,b),(c,d))));(6)tailhead)(((a,b),(c,d)))).

答:(1)head ((p,h,w))=p; (2)tail((b,k,p,h))=(k,p,h);

(3)head (((a,b),(c,d)))=(a,b);(4)tail(((a,b),(c,d)))=((c,d));

(5)head(tail(((a,b),(c,d))))=(c,d);(6)tail(head(((a,b),(c,d))))=(b)

补充:

1、数组元素的地址计算公式

(1)按行优先顺序存储的二维数组Amn地址计算公式

LOC(a ij)=LOC(a11)+[(i-1)×n+j-1]×d

其中:

①LOC(a11)是开始结点的存放地址(即基地址)

②d为每个元素所占的存储单元数

③由地址计算公式可得,数组中任一元素可通过地址公式在相同时间内存取。即顺序存储的数组是随机存取结构。

(2)按列优先顺序存储的二维数组Amn地址计算公式

LOC(a ij)=LOC(a11)+[(j-1)×m+i-1]×d

(3)按行优先顺序存储的三维数组Amnp地址计算公式

LOC(a ijk)=LOC(a111)+[(i-1)×n×p+(j-1)×p+k-1]×d

(4)下界不为1的二维数组的地址计算公式

①二维数组A[c1..d1,c2..d2]的地址计算公式:

LOC(a ij)=LOC(a c1c2)+[(i-c1)×(d2-c2+1)+j-c2]×d

②下界为0的二维数组的地址计算公式(C语言中使用)

LOC(a ij)=LOC(a00)+[i×(d2+1)+j]×d

2、对称矩阵的地址计算公式

LOC(a ij)=LOC(sa[k])=LOC(sa[0])+k×d=LOC(sa[0])+[I×(I+1)/2+J]×d

通过下标变换公式,能立即找到矩阵元素a ij在其压缩存储表示sa中的对应位置k。因此是随机存取结构。

【例】a21和a12均存储在sa[4]中,这是因为k=I×(I+1)/2+J=2×(2+1)/2+1=4

3、三角矩阵的压缩存储(三角矩阵的压缩存储结构是随机存取结构。)

三角矩阵中的重复元素c可共享一个存储空间,其余的元素正好有n×(n+1)/2个,因此,三角矩阵可压缩存储到向量sa[0..n(n+1)/2]中,其中c存放在向量的最后一个分量中。

①上三角矩阵中a ij和sa[k]之间的对应关系

i×(2n-i+1)/2+j-i 当i≤j

k=

n×(n+1)/2 当i>j

②下三角矩阵中a ij和sa[k]之间的对应关系

i×(i+1)/2+j 当i≥j

k=

n×(n+1)/2 当i<j

十、文件

1、通常,磁带只适合用于存储(顺序)文件。

2、性质相同的记录的集合称(文件)。

3、文件的逻辑结构是一种(线性)结构。

4、对于存储在磁盘上的顺序文件的记录进行直接存取是根据(逻辑记录号)。

5、存储在磁带上的顺序文件的查找只能用(顺序查找)。

6、索引文件的索引表很大时,可建静态索引,即建立索引的索引——查找表,其中最多可建(4)级。

7、在索引文件中,若记录要经常变动,则应采用(动态)索引。当文件中记录数不多时,可用二叉排序树比较好。当文件中记录数较多时,用B树比较好。

8、下面关于B树和B+树的叙述中,不正确的是( C)

A. B树和B+树都是平衡的多分树;

B. B树和B+树都是可用于文件的索引结构;

C. B树和B+树都能有效地支持顺序检索;

D. B树和B+树都能有效地支持随机检索。

9、以下关于ISAM文件的说法中,错误的是(D)。

A、她的中文含义是索引顺序存储方法;

B、专为磁盘存取文件设计;

C、采用静态索引结构;

D、删除记录操作比插入记录操作复杂。

10、为什么索引顺序文件是最常用的文件组织。

答:因为:(1)索引顺序文件的主文件按关键字有序,所以适合随机存取和顺序存取。(2)索引顺序文件的索引是稀疏索引,所以占空间较少。

11、对于散列文件,只能作(直接)存取。

补充:

1、文件分类

(1)文件可以按照记录中关键字的多少,分成:

①单关键字文件:文件中的记录只有一个惟一标识记录的主关键字。

②多关键字文件:文件中的记录除了含有一个主关键字外,还含有若干个次关键字的文件。(2)文件分成定长文件和不定长文件

①由定长记录组成的文件称做定长文件,含有的信息长度相同的记录称定长记录。

②文件中记录含有的信息长度不等,则称其为不定长文件。

2、文件上的操作主要有两类:检索和维护。

(1)检索即在文件中查找满足给定条件的记录。它既可以按记录的逻辑号(即记录存入文件时的顺

序编号)查找,也可以按关键字查找。按检索条件的不同,可将检索分为四种询问:

①简单询问:只询问单个关键字等于给定值的记录。②范围询问:只询问单个关键字属于某个范围内的所有记录。③函数询问:规定单个关键字的某个函数,询问该函数的某个值。④布尔询问:以上三种询问用布尔运算(与、或、非)组合起来的询问。

(2)维护操作主要是指:

①对文件进行记录的插入、删除及修改等更新操作。

②为提高文件的效率,进行再组织操作,

③文件被破坏后的恢复操作,以及文件中数据的安全保护等。

(3)文件操作的处理方式文件上的检索和更新操作,都可有实时和批量两种不同的处理方式。

①实时处理:响应时间要求严格,要求在接受询问后几秒种内完成检索和更新。

②批量处理:响应时间要求宽松一些,不同的文件系统有不同的要求。

3、文件的存储结构

文件的存储结构是指文件在外存上的组织方式。文件在外存上的基本的组织方式有四种:顺序组织,索引组织,散列组织和链组织;对应的的文件名称分别为:顺序文件、索引文件、散列文件和多关键字文件。

4.文件组织方式的选择

常用外存设备有:①磁带是顺序存取设备,只适用于存储顺序文件

②磁盘是直接存取设备,适用于存储顺序文件、索引文件、散列文件和多关键字文件等

5、评价一个文件组织的效率,是执行文件操作所花费的时间和文件组织所需的存储空间。通常文

件组织的主要目的,是为了能高效、方便地对文件进行操作,而检索功能的多寡和速度的快慢,是衡量文件操作质量的重要标志。

6、顺序文件分类

(1)顺序有序文件:记录按其主关键字有序的顺序文件为顺序有序文件。

(2)顺序无序文件:记录未按其主关键字有序排列的顺序文件为顺序有序文件。

7、顺序文件主要优点是连续存取的速度较快;顺序文件多用于磁带。

8、索引文件由主文件和索引表构成。

9、索引顺序文件和索引非顺序文件

(1)索引顺序文件(Indexed Sequential File)

主文件按主关键字有序的文件称索引顺序文件。

在索引顺序文件中,可对一组记录建立一个索引项。这种索引表称为稀疏索引。

(2)索引非顺序文件(Indexed NonSequentail File)

主文件按主关键字无序得文件称索引非顺序文件。

在索引非顺序文件中,必须为每个记录建立一个索引项,这样建立的索引表称为稠密索引。

注意:

①通常将索引非顺序文件简称为索引文件。

②索引非顺序文件主文件无序,顺序存取将会频繁地引起磁头移动,适合于随机存取,不

适合于顺序存取。

③索引顺序文件的主文件是有序的,适合于随机存取、顺序存取。

④索引顺序文件的索引是稀疏索引。索引占用空间较少,是最常用的一种文件组织。

⑤最常用的索引顺序文件:ISAM文件和VSAM文件。

10、索引文件在存储器上分为两个区:索引区和数据区。索引区存放索引表,数据区存放主文件。

11、树表结构选择:①当数据文件的记录数不很多,内存容量足以容纳整个索引表时,可采用

二叉排序树(或A VL树)作索引;②当文件很大时,索引表(树表)本身也在外存,查找索引时访问外存的次数恰为查找路径上的结点数。采用m阶B-树(或其变型)作为索引表为宜(m的选择取决于索引项的多少和缓冲区的大小)。

12、由于访问外存的时间比内存中查找的时间大得多,所以外存的索引表的查找性能主要着眼于访

问外存的次数,即索引表的深度。

13、I SAM为Indexed Sequential Access Methed(索引顺序存取方法)的缩写,它是一种专为磁盘存取文

件设计的文件组织方式,采用静态索引结构。ISAM文件由多级主索引、柱面索引、磁道索引和主文件组成。磁道索引中的每一个索引项,都由两个子索引项组成:基本索引和溢出索引项。14、V SAM是Virtual Storage Access Method(虚拟存储存取方法)的缩写,它也是一种索引顺序文件的

组织方式,采用B+树作为动态索引结构。对B+树可进行两种查找运算:一种是从最小关键字起进行顺序查找;另一种是从根结点开始进行随机查找。VSAM文件的结构由三部分组成:索引集,顺序集和数据集。和ISAM文件相比,基于B+树的VSAM文件有如下优点:能保持较高的查找效率,查找一个后插入记录和查找一个原有记录具有相同的速度;动态地分配和释放存储空间,可以保持平均75%的存储利用率;而且永远不必对文件进行再组织。因而基于B+树的VSAM文件,通常被作为大型索引顺序文件的标准组织。

15、散列文件是利用散列存储方式组织的文件,亦称直接存取文件。即根据文件中关键字的特点,

设计一个散列函数和处理冲突的方法,将记录散列到存储设备上。

除方便。(3)存取速度快;不需要索引区,节省存储空间。散列文件的缺点(1)不能进行顺序存取,只能按关键字随机存取(2)询问方式限于简单询问(3)在经过多次插入、删除后,可能造成文件结构不合理,需要重新组织文件。

17、多重表文件是将索引方法和链接方法相结合的一种组织方式。

六、树

1、在树中,互为堂兄弟的结点拥有相同的(祖先)。

2、树最适合用来表示(元素之间具有分支层次关系的数据)

3、在树中,度为(0)的结点称为叶子。

4、在树中,除跟结点外,其他结点都有且只有一个(双亲(或前趋))结点。

5、有100个结点的树有(99)条边。

6、若将树中的每个结点的各子树看成从左到右有次序,则该树为(有序)树。

7、说出树的四种表示方法:树形表示法、嵌套集合表示方法、广义表表示法、凹入表表示法。

8、在一棵高度为h的满四叉树中,结点总数为(4h-1)。

9、若一棵二叉树具有10个度为2的结点,则该二叉树的度为0的结点个数是(11 )。 n0=n2+1

10、按二叉树的定义,具有3个结点的二叉树有(5) 种。

11、一棵二叉树有67个结点,这些结点的度要么是0,要么是2。这棵二叉树中度为2的结点有

(33 )个。

12、深度为K的完全二叉树至少有2^(k-1)个结点,至多有2^(k-1)-2个结点,若按自上而下,从左到右次序给结点编号(从1开始),则编号最小的叶子结点的编号是(2^(K-2)+1)。

13、一棵有50个结点的完全二叉树从根结点开始,由根向下,每一层从左至右,顺序地存储在一个一维数组bt[1..50]中,这棵二叉树最下面一层上最左边一个结点存储在数组元素(33)中。

14、有n个结点的二叉链表中,其中空的指针域为n+1.指向孩子的指针个数为(n-1)。

15、在二叉链表的顺序存储结构中,结点之间的关系通过(编号)来表示.完全二叉树的存储效率最高。

16、说出树和二叉树的差别:树和二叉树是两种不同的数据结构。对于二叉树来说,每个结点最多只有两个孩子,分别叫左孩子和右孩子;如果只有一个孩子,则该孩子还是有左右之分的。而树则不然。

17、已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,...nm个度为m的结

点,问该树中有多少片叶子?

设该树中的叶子数为N0个。该树中的总结点数为N个,则有:&NBSP;

N=N0+N1+N2+…+NM (1) &NBSP;

又有除根结点外,树中其他结点都有双亲结点,且是唯一的(由树中的分支表示),所以,有双亲的结点数为:&NBSP;

N-1=0*N0+1*N1+2*N2+…+M*NM (2) &NBSP;

联立(1)(2)方程组可得:&NBSP;

叶子数为:N0=1+0*N1+1*N2+2*N3+...+(M-1)*NM

18、在一非空二叉树的中序遍历序列中,根结点的右边(只有右子树上的所有结点)。

19、已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是

(A)。

A、acbed

B、deabc

C、decab

D、cedba

20、在二叉树的中序遍历递归算法中,顺着搜索路径,在第(2)次经过结点时作访问操作。

21、现有按中序遍历二叉树的结构是ABC,有(3)种不同形态的二叉树可以得到这一遍历序列。

23、在线索化二叉树中,结点*P没有左子树的充要条件是(P->ltag==1)。

24、在中序线索二叉树中,若某结点有右孩子,则该结点的直接后继是(右子树的最左下结点)。

25、在寻找前趋或后继结点中,可能要用到双亲结点指针的是(寻找前序线索二叉树的前序前趋)。

26、在二叉链表中,利用空指针域,存放指定结点的某种遍历的前趋和后继结点指针。这种指针叫(线索)。

27、若对一棵二叉树要经常遍历,或找结点在指定次序下的前趋和后继,则应采用(线索链表)作为存储结构。

28、树的基本遍历策略分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历和后序遍历。结论(树的先根遍历序列与其对应的二叉树的先序遍历序列相同)是正确的。

29、由森林转化成的二叉树(没有右子树 )。

30、在树的(双亲链表)表示法中,求指定结点的双亲或祖先十分方便,但是求指定结点的孩子或其他后代可能要遍历整个数组。在树的(双亲孩子链表)表示法中,即方便求指定结点的双亲,又方便求指定结点的孩子。

31、已知树的先根次序访问序列为GFKDAIEBCHJ,后根次序访问序列为DIAEKFCJHBG。则该树有( 5)个叶子。

32、已知森林的先序访问序列为ABCDEFGHIJKL;中序访问序列为CBEFDGAJIKLH。则该森林有(2)棵树。

33、Huffman树的形态是(不唯一)。

34、由五个分别带权值为9,2,3,5,14的叶子结点构成的一棵哈夫曼树,该树的带权路径长度为(67)。

35、一棵哈夫曼树有19个结点,则其叶子结点的个数(9)。

36、当对字符集进行编码时,字符集中任一字符的编码都不是其他字符的编码的前缀,这种编码称(前缀码)。

37、在具有n个结点的k叉树(k>=2)的k叉链表表示中,有多少个空指针?

解:n个结点的K叉树共有n*k个指针域,已使用的指针域为n-1,所以空指针的个数为:n(k-1)+1;

38、试找出分别满足下面条件的所有二叉树:

(1)前序序列和中序序列相同;(2)中序序列和后序序列相同;

(3)前序序列和后序序列相同;(4)前序、中序、后序序列均相同。

答:(1) 前序序列和中序序列相同的二叉树是:空二叉树或没有左子树的二叉树(右单支树)。

(2) 中序序列和后序序列相同的二叉树是:空二叉树或没有右子树的二叉树(左单支树)。

(3) 前序序列和后序序列相同的二叉树是:空二叉树或只有根的二叉树。

(4) 前序、中序、后序序列均相同的二叉树:空树或只有根结点的二叉树。

39、高度为h的严格二叉树至少有多少个结点?至多有多少个结点?

答:所谓严格二叉树是指该树中没有度数为1的分支结点的二叉树。

所以:高度为h的的严格二叉树至少有2h-1个结点;至多有2h-1个结点(即满二叉树)。

40、在每个字符的使用概率相同的情况下,也即在哈夫曼树中每片叶子的权重相等的时候,等长编码是最优的前缀码。

七、图

1、设G1=(V1,E1)和G2=(V2,E2)为两个图,如果V2包含V1,E2包含E1,则称(G2是G1的子

图)。

设G=(V,E)是一个图,若V'是V的子集,E'是E的子集,且E'中的边所关联的顶点均在V'中,则G'=(V',E')也是一个图,并称其为G的子图。

2、设有6个结点的无向图,该图至少应有(5)条边才能确保是一个连通图。

3、具有n个顶点的有向图最多有(n(n-1))条边。说出无向图中边数e和顶点数n的关系是(0≤e≤n(n-1)/2)。

图G的顶点数n和边数e的关系

(1)若G是无向图,则0≤e≤n(n-1)/2 恰有n(n-1)/2条边的无向图称无向完全图

(2)若G是有向图,则0≤e≤n(n-1)。恰有n(n-1)条边的有向图称为有向完全图

注意:完全图具有最多的边数。任意一对顶点间均有边相连。

4、具有n个顶点的强连通图最少有(n )条边。

5、下面关于图的存储的叙述中,哪一个是正确的。(A)

A.用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,与边数无关

B.用邻接矩阵法存储图,占用的存储空间数只与图中边数有关,与结点个数无关

C.用邻接表存储图,占用的存储空间数只与图中结点个数有关,与边数无关

D.用邻接表存储图,占用的存储空间数只与图中边数有关,与结点个数无关

6、无论有向图还是无向图,顶点数n、边数e和度数之间有如下关系:

7、邻接矩阵表示法的空间复杂度S(n)=0(n2)。

8、建立无向网的邻接矩阵表示:该算法的执行时间是0(n+n2+e)。由于e

建立无向图的邻接表算法:该算法的时间复杂度是O(n+e)。

9、在图的表示法中,表示形式唯一的是(邻接矩阵表示法)。

10、n个顶点e条边的无向图的邻接表表示中有n个顶点表结点和2e个边表结点。

n个顶点e条边的有向图,它的邻接表表示中有n个顶点表结点和e个边表结点

12、对于一个具有n个顶点和e条边的无向图,若采用邻接表表示,则表头向量的大小为(n).

13、有向图的邻接表表示适于求顶点的(出度)。

14、有向图的邻接矩阵表示中,第i(列)上非零元素的个数为顶点vi的入度。

15、采用邻接表存储的图的深度优先遍历算法类似于二叉树的(先序遍历)。广度优先遍历类似于树的按(层次遍历)。

16、对有向图进行深度优先搜索时,若该图不是(强连通图),可得到一个深度优先搜索生辰森林。

17、当对用(邻接矩阵)表示法表示的图,从某指定顶点作为初始点进行广度优先搜索,得到的广度优先搜索序列唯一。

18、一般,图的DFS生成树的高度(大于)BFS生成树的高度。

19、对于无向图,生成树是(极小)连通子图。

20、PRIM算法与图的边数无关,适合求解(稠密图)的最小生成树。

21、Dijkstra算法是一种路径长度(递增)的求解单源点到其他各终点最短路径的方法。

22、要得到一个无回路有向图的拓扑序列,可以利用(深度优先遍历的算法)。

23、在一个无环有向图G中,若存在一条从顶点i到顶点j的弧,则在顶点的拓扑序列中,顶点i与顶点j的先后次序是(I在前,J在后)。

24、在拓扑排序中,拓扑序列的第一个顶点必定是(入度)为0的顶点。

25、对于含有(回路或环)的有向图不能得到拓扑序列。

26、一个图的DFS序列不一定惟一,(源点和存储结构的内容)均已确定的图的DFS序列惟一。

27、邻接表作为给定图的存储结构时,其表示不惟一。因为邻接表上边表里的邻接点域的内容与建表时的输入次序相关。

28、对于具有n个顶点和e条边的无向图或有向图,遍历算法DFSTraverse对图中每顶点至多调用

一次DFS或DFSM。所以,DFSTraverse的时间复杂度为0(n+e)(调用DFS)或O(n2) (调用DFSM)。

29、对于具有n个顶点和e条边的无向图或有向图,每个顶点均入队一次。广度优先遍历(BFSTraverse)图的时间复杂度和DFSTraverse算法相同。当图是连通图时,BFSTraverse算法只需调用一次BFS或BFSM即可完成遍历操作,此时BFS(邻接表)和BFSM(邻接矩阵)的时间复杂度分别为O(n+e)和0(n2)。

30、Prim算法:该算法的时间复杂度为O(n2)。与图中边数无关,该算法适合于稠密图。

31、Kruskal算法:该算法的时间复杂度为O(elge)。 Kruskal算法的时间主要取决于边数。它较适合于稀疏图。

32、对n个顶点的无向图和有向图,采用邻接矩阵和邻接表表示时,如何判别下列有关问题?

(1) 图中有多少条边? (2)任意两个顶点i和j是否有边相连? (3) 任意一个顶点的度是多少?

答:对于n个顶点的无向图和有向图,用邻接矩阵表示时:

(1)设m为矩阵中非零元素的个数:无向图的边数=m/2;有向图的边数=m

(2)无论是有向图还是无向图,在矩阵中第i行,第j列的元素若为非零值,则该两顶点有边相连。

(3)对于无向图,任一顶点i的度为第i行中非零元素的个数。

对于有向图,任一顶点i的入度为第i列中非零元素的个数,出度为第i行中非零元素的个数,度为入度出度之和。

当用邻接表表示时:

(1)对于无向图,图中的边数=边表中结点总数的一半。对于有向图,图中的边数=边表中结点总数。

(2)对于无向图,任意两顶点间是否有边相连,可看其中一个顶点的邻接表,若表中的adjvex域有另一顶点位置的结点,则表示有边相连。对于有向图,则表示有出边相连。

(3)对于无向图,任意一个顶点的度则由该顶点的边表中结点的个数来决定。对于有向图,任意一个顶点的出度由该顶点的边表中结点的个数来决定,入度则需遍历各顶点的边表。(用逆邻接表可容易地得到其入度。)

33、n个顶点的连通图至少有n-1条边,强连通图至少有2(n-1)条边。

34、DFS遍历采用栈来暂存顶点。BFS采用队列来暂存顶点。当要求连通图的生成树的高度最小时,应采用BFS遍历。

35、当候选轻边集中的轻边数始终等于1条时,其最小生成树是唯一的。用Prim和Kruskal求最小生成树的时间复杂度分别为O(n2)和O(elge),前者适合于稠密图,后者适合于稀疏图。

36、什么样的DAG的拓扑序列是唯一的?

答:确定了排序的源点,DAG图中无前趋顶点只有一个且从该点到终点只有一条路径时,它的拓扑序列才是唯一的。

八、排序

1、内部排序和外部排序的区别不在于(C)。

A、待排序文件的大小

B、有无内外存的交换

C、是否在内存中排序

D、可采用的排序策略

2、评价排序算法好坏的标准主要是(执行时间和所需的辅助空间)。

评价排序算法好坏的标准主要有两条:①执行时间和所需的辅助空间②算法本身的复杂程度3、若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间是O(1),则称之为就地排序。非就地排序一般要求的辅助空间为O(n)。

4、若待排序的文件中存在多个关键字相同的记录,经过某种排序方法排序后,具有相同关键字的记录间的相对位置保持不变。则这种排序方法是(稳定)的排序方法。

5、内部排序方法可分成哪5类?答:(1)插入排序(2)选择排序(3)交换排序(4)归并排序(5)分配排序

6、一个待排序文件的关键字如下: 265 301 751 129 937 863 742 694 076 438

经过(C)趟直接插入排序后可得到如下序列: 129 265 301 751 937 863 742 694 076 438

A、 1

B、 2

C、 3

D、 4

7、当增量为1时,该趟希尔排序与(直接插入)排序基本一致。

8、最坏情况,在第i趟直接插入排序中,要进行(i-1)次关键字的比较。

9、简述在直接插入排序中监视哨的主要作用。

答:可免去在查找循环中检测是否查找到文件头(或尾)作的检测,从而提高效率。

10、若用冒泡排序对关键字序列{18,16,14,12,10,8}进行从小到大的排序,所要进行的关键

字比较总次数为(B)。

A、10

B、15

C、21

D、34

11、用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,结点序列

的变化情况如下:

(1)25 84 21 47 15 27 68 35 20 (2)20 15 21 25 47 27 68 35 84

(3)15 20 21 25 35 27 47 68 84 (4)15 20 21 25 27 35 47 68 84

那么,所采用的排序方法是( D)。

A、直接插入排序

B、希尔排序

C、冒泡排序

D、快速排序

12、以下排序方法中,稳定的排序方法是(B)。

A、直接插入排序和希尔排序

B、直接插入排序和冒泡排序

C、希尔排序和快速排序

D、冒

泡排序和快速排序

13、在快速排序中,每次划分选择的基准元素为该区间的(中间值)时,得到的两个子区间是

均匀的。

14、快速排序在最坏情况下的时间复杂度是(O(n2))。

15、快速排序方法在(被排序数据已基本有序)情况下最不利于发挥其长处。

16、两个序列如下: L1={25,57,48,37,92,86,12,33} L2={25,37,33,12,48,57,

86,92}

用冒泡排序方法分别对序列L1和L2进行排序,交换次序较少的是序列(L2)。

17、设待排序文件的关键码为(512,275,908,677,503,765,612,897,154,170)以第一元素为分界元素

进行快速排序(按关键码值递增顺序),请给出一趟扫描后的结果。答:[170 275 154 503] 512 [765

612 897 677 908]

18、堆排序在最坏情况下的时间复杂度是(O(nlgn))。堆是(完全二叉树)。

19、有10万个无序且互不相等的正整数序列,采用顺序存储方式组织,希望能最快地找出前10

个最大正整数,采用(C) 方法比较好。 A、快速排序B、希尔排序C、堆排序D、归并排序

20、在(大根)堆中,所有双亲结点的关键字的值大于它们孩子的关键字的值。

21、直接选择排序的总的关键字比较次数与(文件的初始状态)无关。

22、对n个记录的文件进行二路归并排序,总的时间代价为(O(nlgn))

23、下面四种内排序方法中,要求容量最大的是(D)。 A、插入排序B、选择排序C、快速

排序D、归并排序

24、已知一个文件的初始关键字序列为:265 301 751 129 937 863 742 694 076 438。写出建成大根

堆后的序列和第一次堆排序后重建大根堆的序列。

答:建立初始堆:[937 694 863 265 438 751 742 129 075 301]

第一次排序重建堆:[863 694 751 765 438 301 742 129 075] 937

25、关于归并排序,说法不正确的是(C)。 A、稳定的排序 B、可使用链式存储结构 C、就地排

序 D、可用于外部排序

26、将两个长度分别m和n(m>n)的排好序的表归并成一个排好序的表,至少要进行(n)次

键值比较。

27、若有文件的关键字序列为:[265] [301] [751] [129] [937] [863] [742] [694] [076] [438],给出二路

归并排序过程。

答:第一趟:[265 301] [129 751] [863 937] [694 742] [076 438]

第二趟:[129 265 301 751] [694 742 863 937] [076 438]

第三趟:[129 265 301 694 742 751 863 937] [076 438]

第四趟:[076 129 265 301 438 694 742 751 863 937]

28、分配排序和其他排序方法的区别在于(无需关键字的比较)。

29、对n个记录的文件进行分配排序,总的时间代价为(O(n))

30、在箱排序中,箱子的个数取决于( 关键字的取值范围)。

31、分配排序的两个基本过程是(分配和收集)。

32、在单关键字的基数排序中,所需的箱子数就是(基数)。

33、下列排序方法中,哪一种方法的比较次数与纪录的初始排列状态无关?(D)

A. 直接插入排序

B. 起泡排序

C. 快速排序

D. 直接选择排序

34、设有字符序列{Q、H、C、Y、P、A、M、S、R、D、F、X},向新序列{F、H、C、D、P、A、

M、Q、R、S、Y、X}是下列哪个排序算法一趟扫描的结果。(D)

A、起泡排序

B、初始步长为4的shell的排序

C、二路归并排序

D、以第一个元素为分界

元素的快速排序

35、有序数组是堆。因为有序数组中的关键字序列满足堆的性质。若数组为降序,则此堆为大根

堆,反之为小根堆。

36、若文件初态是反序的,且要求输入稳定,则在直接插入、直接选择、冒泡和快速排序中就选

选哪种方法为宜?

答:这四种排序算法中,直接选择、快速排序均是不稳定的,因此先予以排除,剩下两种算法中,由于直接插入算法所费时间比冒泡法更少(见上题分析),因此选择直接排序算法为宜。37、.高度为h的堆中,最多有多少个元素?最少有多少个元素?在大根堆中,关键字最小的元素可

能存放在堆的哪些地方?

答:高度为h的堆实际上为一棵高度为h的完全二叉树,因此根据二叉树的性质可以算出,它最少应有2h-1个元素;最多可有2h-1个元素(注意一个有括号,一个没有)。在大根堆中,关键字最小的元素可能存放在堆的任一叶子结点上。

38、若关键字是非负整数,则基数排序最快;若要求辅助空间为O(1),则应选堆排序;若要求排

序是稳定的,且关键字是实数,则应选归并排序,因为基数排序不适用于实数,虽然它也是稳定的。

39、排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。

40、内排序适用于记录个数不很多的小文件;外排序则适用于记录个数太多,不能一次将其全部

记录放人内存的大文件。

C语言顺序结构

第四章C语言顺序结构 4.1 C语句概述 一般来说,程序设计语言中的流程控制结构分为3种:顺序结构、选择结构和循环结构。 表达式语句由表达式加上分号“;”组成,其一般形式为:表达式; 函数调用语句由函数名、实际参数加上分号“;”组成。其一般形式: 函数名(实际参数表) 控制语句用于控制程序的流程,以实现程序的各种结构方式。C语言中共有9种控制语句,可以将其分为如下3类: 复合语句:把多个语句用{}括起来组成的一个语句称为复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。 空语句:只有分号“;”组成的语句。 4.2 赋值语句 赋值语句是表达式语句的一种,是由赋值表达式再加上分号构成的表达式语句,其一般形式为:变量=表达式; 注意在变量声明中给变量赋初值和赋值语句的区别。给变量赋初值是变量声明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。例如int a=1,b;是在变量声明中对变量a赋初值,其等效于如下两条语句; int a,b; /*定义整型变量a,b*/ a=1; /*为变量a赋值*/ 在变量声明中,不允许给多个连续变量赋初值。下列说明是错误的:int a=b=c=1;,必须写为int a=1,b=1,c=1; 4.3 格式输入输出 格式输入输出即向标准输出设备显示器输出数据的语句。 4.3.1 printf函数——格式输出 printf函数称为格式输出函数,其关键字最末一个字母“f”即为格式(format)之意。printf函数的功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用printf函数之前必须包含stdio.h文件。 printf函数调用的一般形式为: printf(“格式控制字符串”,输出列表) 其中,格式字符串用于指定输出格式,可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位等。例如:“%d”表示按十进制整型输出,“%f”表示按十进制浮点型输出,“%c”表示按字符型输出。 类型符类型意义 d 以十进制形式输出带符号整数(整数不输出符号)

(完整版)数据结构---C语言描述-(耿国华)-课后习题答案

第一章习题答案 2、××√ 3、(1)包含改变量定义的最小范围 (2)数据抽象、信息隐蔽 (3)数据对象、对象间的关系、一组处理数据的操作 (4)指针类型 (5)集合结构、线性结构、树形结构、图状结构 (6)顺序存储、非顺序存储 (7)一对一、一对多、多对多 (8)一系列的操作 (9)有限性、输入、可行性 4、(1)A(2)C(3)C 5、语句频度为1+(1+2)+(1+2+3)+…+(1+2+3+…+n) 第二章习题答案 1、(1)一半,插入、删除的位置 (2)顺序和链式,显示,隐式 (3)一定,不一定 (4)头指针,头结点的指针域,其前驱的指针域 2、(1)A(2)A:E、A B:H、L、I、E、A C:F、M D:L、J、A、G或J、A、G (3)D(4)D(5)C(6)A、C 3、头指针:指向整个链表首地址的指针,标示着整个单链表的开始。 头结点:为了操作方便,可以在单链表的第一个结点之前附设一个结点,该结点的数据域可以存储一些关于线性表长度的附加信息,也可以什么都不存。 首元素结点:线性表中的第一个结点成为首元素结点。 4、算法如下: int Linser(SeqList *L,int X) { int i=0,k; if(L->last>=MAXSIZE-1) { printf(“表已满无法插入”); return(0); } while(i<=L->last&&L->elem[i]last;k>=I;k--) L->elem[k+1]=L->elem[k]; L->elem[i]=X;

L->last++; return(1); } 5、算法如下: #define OK 1 #define ERROR 0 Int LDel(Seqlist *L,int i,int k) { int j; if(i<1||(i+k)>(L->last+2)) { printf(“输入的i,k值不合法”); return ERROR; } if((i+k)==(L->last+2)) { L->last=i-2; ruturn OK; } else {for(j=i+k-1;j<=L->last;j++) elem[j-k]=elem[j]; L->last=L->last-k; return OK; } } 6、算法如下: #define OK 1 #define ERROR 0 Int Delet(LInkList L,int mink,int maxk) { Node *p,*q; p=L; while(p->next!=NULL) p=p->next; if(minknext->data>=mink)||(p->data<=maxk)) { printf(“参数不合法”); return ERROR; } else { p=L; while(p->next-data<=mink)

c语言实验报告总结

篇一:《C语言上机实验心得》 C语言上机实验心得 在科技高度发展的今天,计算机在人们之中的作用越来越突出。而C语言作为一种计算机的语言,学习它将有助于我们更好的了解计算机,与计算机进行交流,因此,我们一定要学好C语言,这对我们以后的发展是十分重要的。 说到这,上机实验当然就是一个必不可少的环节了,C语言灵活、简洁的特点,只有通过编程实践才能真正了解,真正说懂。为了更好地学习语法规定、掌握程序设计方法、提高程序开发能力,我们必须实际上机、编写程序。 通过实验我也发现了自己不少的问题,这都是只看书上的程序而没有自己亲身上机编写程序而无法得知的,假如我们只因看熟书上的程序就以为自己已经掌握了C语言那就大错特错了。 我主要存在以下的这些缺点 1、学习耐心与细心不足,如scanf(“%d”,&n);中的“&”有时候会忘了。而在最后

输出时又错写成printf(“%d”,&n);从而错误得输出了地址而不是我原来想要的答案。 2、编程思想不够发散,看着题目有时想不出解答的方法,更不用说编写程序来解 题了。 3、 4、基本功不够,有些函数的表达不太精通,需要看书来核实,以致耗时较多。知识不够广,有些内容没有学好,不能要用到时及时反映出来,认识程度不够 深刻。 5、 6、有时候不够精简,有一点用处不大或者说没有也可以的文字存在。英语水平较差,对错误的地方虽然电脑有说,但由于是英文,理解上还是存在

一点问题。 为了能更好地学好C语言,在今后学习中我要更多的动脑,综合运用所学,多看相关东西,多上机练习,提高电脑水平,增强自学能力,把已会的东西掌握好。 实验中我深刻意识到完成程序的编写,决不意味着万事大吉。认为万无一失的程序,实际上机运行时可能会出现很多意想不到的问题。有时编译程序检测出一大堆错误,有时程序能够顺利运行,但是运行结果并不是你预期中想要的。因为开发环境所提供的编译系统无法发现程序逻辑错误,或者是你原来所设计时的理论错误,这就只能靠自己的上机经验来分析判断错误的所在了。所以程序的调试是一个技巧性很强的工作,它可能比编一个程序耗时更 多。由此可看出上机实践的重要性。 通过本次C语言上机实验,我对这个介于人类与非人类之间的计算机编程语言有了一定的体验。编程的时候有因为顺利编出程序而开心过、有因为做得比人家慢而郁闷过、有因为不知从何入手而无奈过、有因为不知错出在哪而彷徨过但随着练习的增多,我对C语言比以前熟了很多,不再只是纸上谈兵,我都有能力独立做出一些程序,可能对于一些“高手来说这不算什么,或者他们早就会了,但我依然觉得很开心,因为我跟我自己比是进步了。

C语言顺序结构

第四章C语言顺序结构 4、1 C语句概述 一般来说,程序设计语言中得流程控制结构分为3种:顺序结构、选择结构与循环结构。 表达式语句由表达式加上分号“;”组成,其一般形式为:表达式; 函数调用语句由函数名、实际参数加上分号“;”组成。其一般形式: 函数名(实际参数表) 控制语句用于控制程序得流程,以实现程序得各种结构方式。C语言中共有9种控制语句,可以将其分为如下3类: 复合语句:把多个语句用{}括起来组成得一个语句称为复合语句。在程序中应把复合语句瞧成就是单条语句,而不就是多条语句。 空语句:只有分号“;”组成得语句。 4、2 赋值语句 赋值语句就是表达式语句得一种,就是由赋值表达式再加上分号构成得表达式语句,其一般形式为: 变量=表达式; 注意在变量声明中给变量赋初值与赋值语句得区别。给变量赋初值就是变量声明得一部分,赋初值后得变量与其后得其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。例如int a=1,b;就是在变量声明中对变量a赋初值,其等效于如下两条语句; int a,b; /*定义整型变量a,b*/ a=1; /*为变量a赋值*/ 在变量声明中,不允许给多个连续变量赋初值。下列说明就是错误得:int a=b=c=1;,必须写为int a=1,b=1,c=1; 4、3 格式输入输出 格式输入输出即向标准输出设备显示器输出数据得语句。 4、3、1 printf函数——格式输出 printf函数称为格式输出函数,其关键字最末一个字母“f”即为格式(format)之意。printf函数得功能就是按用户指定得格式,把指定得数据显示到显示器屏幕上。printf函数就是一个标准库函数,它得函数原型在头文件“stdio、h”中。但作为一个特例,不要求在使用printf函数之前必须包含stdio、h文件。 printf函数调用得一般形式为: printf(“格式控制字符串”,输出列表) 其中,格式字符串用于指定输出格式,可由格式字符串与非格式字符串两种组成。格式字符串就是以%开头得字符串,在%后面跟有各种格式字符,以说明输出数据得类型、形式、长度、小数位等。例如: “%d”表示按十进制整型输出,“%f”表示按十进制浮点型输出,“%c”表示按字符型输出。 表4-1 d 以十进制形式输出带符号整数(整数不输出符号) f 以小数形式输出单、双精度实数

C语言实验二程序、总结 顺序结构与输入、输出方法

实验二顺序结构与输入/输出方法 一实验目的 1 学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自增减运算 符的使用。 2 掌握C语言中赋值语句的使用。 3 掌握C语言中各种数据的输入/输出方法,能正确使用基本格式符。 二实验内容 1 输入下面的程序: #include main() { int i,j,m,n; i=8;j=10; printf("%d,%d,%d,%d\n",i,j,m,n); /* 第5行 */ m=++i; n=j++; /* 第6行 */ printf("%d,%d,%d,%d\n",i,j,m,n); /* 第7行 */ } 运行程序,分析第5行和第7行输出的不同。 调试分析:因为第五行的m,n没有赋初值,所以对应的m,n输出是乱的数字,第七行的m,n在第六行已赋初值,且i和j也相应的自加,结果如下图 ⑴将第6行按如下修改以后再运行,分析第5行和第7行输出的不同。 m=i++; n=++j; /* 第6行 */ 调试分析:m=i++是(m=i,i=i+1)。 n=++j;是(j=j+1,n=j)结果如 下图 ⑵在程序最后增加两行,记录并分析该行的输出。 i=j=8; /* 第8行 */ printf("%d,%d,%d,%d\n",i,++i,j,j++); /* 第9行 */ 调试分析:结果如下图

2 运行以下程序,并分析输出结果 #include main() { int a=-2; long b; float c; b=20000+20000; c=1.23e-1; printf("a=%d,%3d,%-3d,b=%Ld\n",a,a,a,b); printf("a=%o,%x,%u\n",a,a,a); printf("d=%f,%8.2f,%.2f\n",c,c,c); printf("d=%e,%8.2e,%g\n",c,c,c); printf("%c,%s,",'\072',"China"); printf("|-%5.2s|%5.2s|\n","China","China"); } 调试分析: 这个实验主要考察整型,长整型和浮点型等之间的输出,对浮点型小数点左右个数的考察,输出结果如下图 3 按格式要求输入、输出数据。 #include main() { int a,b; float x,y; char c1,c2; scanf("a=%d,b=%d",&a,&b); scanf("%f,%e",&x,&y); scanf("%c%c%c",&c1,&c1,&c2); /* 第8行 */ printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b,x,y,c1,c2); } 运行该程序,按如下方式在键盘上输入数据,写出输出的结果。 a=3,b=7 85,71.82 Aa 调试分析:主要是考察对输入输出的理解,以及输入输出要注意的问题,结果

2016年C语言实验报告

通知 各位老师: 本学期非计算机专业《计算机程序设计基础(C语言)》课实验报告要求: 1.统一用《武汉科技大学实验报告》本写。本学期交三次实验报告。 ①循环结构程序设计。 ②数组。 ③函数。 要求学生在完成以下实验报告,参考《C语言程序设计课程实验与题解》中的要求认真完成。 实验1 循环结构程序设计 一、实验目的 1.熟悉用while语句,do-while语句和for语句实现循环的方法。 2.掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等)。 3.熟悉break语句和continue语句用法的不同之处。 二、实验内容 【例】以下程序,输出下三角形状的乘法九九表。 #include void main() { int i,j; for (i=1;i<=9;i++) /* 打印表头*/ printf(" %4d",i); printf("%c",'\n'); for (i=0;i<=50;i++) printf("%c",'_'); printf("%c",'\n'); for (i=1;i<=9;i++) /* 循环体执行一次,打印一行*/ { for (j=1;j<=i;j++) printf(" %4d",i*j); /* 循环体执行一次,打印一个数据*/ printf("%c",'\n'); /* 每行尾换行*/ } printf("%c",'\n'); } 输入并执行该程序,观察输出结果,试着修改程序打印上三角形状的乘法九九表。 三、编程序并上机调试运行。 1.打印出所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和正好等于该数本身。例如:153是一个“水仙花数”,因为153=13+53+33。 解题思路:根据题目要求只要分别求出一个三位数的个位、十位、百位上的数字,然后判断是否满足(某一三位数a=a的百位的立方+a的十位的立方+a的个位的立方)这个公式,满足这个三位数就是“水仙花数”。 2.李先生岁数的平方与他的夫人的岁数之和是1053,而他的夫人的岁数的平方与他

c语言顺序结构程序设计练习题10道

c语言顺序结构程序设计练习题 1、编写程序:输入一矩形的长和宽,计算该矩形的面积。 2、编程:输入求的半径R,计算并输出球的体积。 3、编程:输入三个数,求出这三个数的和以及平均值,并在屏幕上输出。 4、编程:输入一个三位整数x(999=>x>=100),将其分解出百位、十位、各位,并求出各位之和以及各位之积 5、编程:已知三角形的三边a=3,b=4,c=5,求其面积s。(提示:假设有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:S=sqrt(p(p-a)(p-b)(p-c)),而公式里的p 为半周长:p=(a+b+c)/2。 6、编写一个C程序,输出以下信息: ************************** Very Good! ************************** 7、编写一个程序,输入a、b、c三个值,输出其中最大值. 8、写出程序运行的结果: main() { int i,j,m,n; i=8; j=10; m=++i; n=j++; printf(“%d,%d,%d,%d”,i,j,m,n); } 9、写出程序运行的结果: main() { char a ,b, c1,c2; float x ,y; a = 3; b =7; x = 8.5; y = 71.82; c1 = ' A' ; c2 = 'a '; printf("a= %d b = %d/n",a,b); printf("x = %f y = %f",x,y); printf("c1= %c,c2 =%c",c1,c2); } 10、求ax2+bx+c=0方程的根,a,b,c由键盘输入,假设b2-4ac>0。

数据结构(C语言版)(第2版)课后习题答案

数据结构(C语言版)(第2版) 课后习题答案 李冬梅 2015.3

目录 第1章绪论 (1) 第2章线性表 (5) 第3章栈和队列 (13) 第4章串、数组和广义表 (26) 第5章树和二叉树 (33) 第6章图 (42) 第7章查找 (54) 第8章排序 (65)

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

游戏C语言实验报告

嘉应学院计算机学院 实验报告 课程名称: C程序设计 开课学期: 2015—2016学年第1学期 班级:计算机1505 指导老师:陈广明 设计题目:游戏2048 学生姓名(学号):第3组:钟瞻宇

目录 一、实验目的和要求 .................................................................................................................................................... 二、实验环境、内容和方法 ........................................................................................................................................ 三、程序设计 ................................................................................................................................................................ 四、源代码 .................................................................................................................................................................... 五、调试与运行结果.................................................................................................................................................... 六、总结........................................................................................................................................................................

C语言(顺序结构)习题与答案

一、单选题 1、以下程序的功能是:给r输入数据后计算半径为r的圆面积s。程序编译时出错。main() /*Beginning */ { int r; float s; scanf("%d",&r); s=π*r*r; printf("s=%f\n",s); } 出错的原因是()。 A.计算圆面积的赋值语句中使用了非法变量 B.存放圆半径的变量r不应该定义为整型 C.注释语句书写位置错误 D.输出语句中格式描述符非法 正确答案:A 解析: A、π这个符合不是C语言的合法标识符,应提前进行常量定义 2、有以下程序 main() { int m=12,n=34; printf("%d%d",m++,++n); printf("%d%d\n",n++,++m); } 程序运行后的输出结果是()。 A.12343514 B.12353514 C.12343513

D.12353513 正确答案:B 解析: B、m++ ++在m后,先使用m的值输出,后给m增1 ++m,++在m前,先给m的值增1后,再输出m 3、有定义语句:int b;char c[10]; ,则正确的输入语句是()。 A.scanf("%d%s",b,c); B.scanf("%d%s",&b,&c); C.scanf("%d%s",b,&c); D.scanf("%d%s",&b,c); 正确答案:D 解析: D、输入语句整型变量 b 需要取地址 &,c是数组名,本身就代表地址,所以不需要取地址符& 4、有以下程序 main() { int m,n,p; scanf("m=%dn=%dp=%d",&m,&n,&p); printf("%d%d%d\n",m,n,p); } 若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,则正确的输入是()。 A.123 456 789 B.m=123 n=456 p=789 C.m=123n=456p=789 D.m=123,n=456,p=789 正确答案:C 解析: C、输入语句中出现普通字符要按原样输入 5、有以下程序

C语言程序设计实验报告优秀范文

C语言程序设计实验报告优秀范文 实验名称计算出1000以内10个最大素数之和 实验目的 1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和switch语句实现分支选择结构。 2、熟练掌握while语句、do…while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。 3、掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。 实验内容 计算并输出1000以内最大的10个素数以及它们的和。 要求: 在程序内部加必要的注释。 由于偶数不是素数,可以不考虑对偶数的处理。 虽然在1000以内的素数超过10个,但是要对1000以内不够10个素数的情况进行处理。 输出形式为:素数1+素数2+素数3+…+素数10=总和值。 算法描述流程图 main函数: 判断素数: 源程序 #include #include int sushu(int n)/* 判断素数的函数*/ { int t,i; t=sqrt(n); for(i=2;i if(n%i==0)/* 如果不是素数,返回0 */ return 0; return n;/* 如果是素数,返回该数*/ } void main { int i,j=0,n,m=0,a[1000],x; /*clrscr;*/ printf("please input a number form 1 to 1000:"); scanf("%d",&x); if(x==2)/* x=2时的处理*/ printf("%dn",x); else if(x printf("error!n");

c语言程序设计实验报告1--顺序结构

福建农林大学金山学院实验报告 系(教研室):专业:年级: 实验课程: C语言程序设计姓名:学号:实验室号:_ 计算机号:实验时间:指导教师签字:成绩: 实验1:顺序结构程序设计 一、实验目的和要求 1.了解Visual C++ DEV_C++的基本操作方法 2.掌握C程序设计的基本步骤:编辑、编译、连接和运行 3.掌握各种类型数据的输入输出方法 4.能够编写一个简单的程序 二、实验内容和原理 1. 输入并运行一个简单、正确的程序。 # include <> int main( ) { printf ("This is a c program!\n"); return 0; } 2. 要使下面程序的输出语句在屏幕上显示:A,B,34,则从键盘输入的数据格式应为AB34__________ 。 #include<> int main() { char a, b; int c;

scanf("%c%c%d",&a,&b,&c); printf("%c,%c,%d\n",a,b,c); return0; 问题1:要使上面程序的键盘输入数据格式为a=A,b=B,34,输出语句在屏幕上显示的结果也为A,B,34,则应修改程序中的哪条语句怎样修改 scanf( “a=%c,b=%c,%d”,&a,&b,&c ); 问题 2:要使上面程序的键盘输入数据格式为A,B,34,而输出语句在屏幕上显示的结果为“A”,“B”,34,则应修改程序中的哪两条语句怎样修改 scanf( “%c,%c,%d”,&a,&b,&c); printf(“\”%c\”,\”%c\”,%d\n”,a,b,c); 3、编程求一个圆的周长和面积。用scanf输入圆半径,输出保留两位小数。 4、输入一个华氏温度F,要求输出摄氏温度C。公式为 c=5/9(F-32),取两位小数。 5、编程序,用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和printf 函数输出这两个字符。 6. 计算定期存款本利之和。 设银行定期存款的年利率rate为%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。要求定期存款的年利率rate、存款期n和存款本金capital 均由键盘输入。(提示:pow为幂函数:pow(2,3)表示23)。 #include <> #include <> int main() { } 三、实验环境

严蔚敏数据结构题集(C语言版)完整

严蔚敏 数据结构C 语言版答案详解 第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 元的值 Put(&C,k,e) 操作结果:改变复数C 的第k 元的值为e

C语言实验报告

郑州轻工业学院 实践报告 实现内容: OJ1123最佳校友(数组)、OJ1158又是升序(指针)、OJ1180成绩统计(结构)、OJ1203做幻方(文件) 学号:541507020140 学生姓名:王红旭 专业班级:电子信息科学与技术15-01 所在院系:计算机与通信工程学院 指导教师:王秉政 成绩: 实践名称:上机实验课 来源课程:[0404230]C程序设计进阶 实践时间:2016.03-05 实践地点:科学校区实验楼301 报告撰写时间:2016.05.10 1123最佳校友(数组)

1实践目的 为了方便数组的管理和使用,提高程序设计的效率。 2 实践要求 熟练使用数组解决问题。 3 使用的技术、知识点、工具等 C语言程序设计书本教材,数组等。 4 需求分析和功能描述 要求;北京校友会每年举办两次,所有校友都有校友编号,每次到会的校友都在签到簿上写下自己的编号和姓名,在校友会成立5周年的聚会上将颁发“最佳校友奖”,该奖项颁发给到会次数最多的校友。现在请你编写程序,找出这个奖项的得主。若有多个校友并列第一,则均可获奖。 5 系统总体设计 #include int main() { int a[100]={0}; int i,n,max,k; while(scanf("%d",&n),n>=0) a[n]++; max=a[0]; for(i=1;i<100;i++) { if(a[i]>max) max=a[i]; } k=0; for(i=0;i<100;i++) { if(a[i]==max) { if(k==0) printf("%d",i); else printf(" %d",i); k++; } }

C语言(顺序结构程序设计)习题与答案

1、一个C程序的执行是从( )。 A.本程序的main函数开始,到main函数结束。 B.本程序的main函数开始,到本程序文件的最后一个函数结束。 C.本程序文件的第一个函数开始,到本程序文件的最后一个函数结束。 D.本程序文件的第一个函数开始,到本程序main函数结束。 正确答案:A 2、C语言规定:在一个源程序中,main函数的位置( )。 A.必须在系统调用的库函数的后面 B.必须在最开始 C.可以任意 D.必须在最后 正确答案:C 3、下面四个选项中,均是不合法的浮点数的选项是( )。 A.160. 0.12 e3 B.123 2e4.2 .e5 C.-e3 .234 1e3 D..18 123e4 0.

4、下面四个选项中,均是合法浮点数的选项是( )。 A.+le+1 5e-9.4 03e2 B.123e 1.2e-.4 +2e-1 C.-.60 12e-4 -8e5 D.-e3 .8e4 5.e-0 正确答案:C 5、下面正确的字符常量是( )。 A.'' B.'W' C."a" D.'\\'' 正确答案:B 6、下面四个选项中,均是不正确的八进制数或十六进制数的选项是( )。 A. 016 0x8f 018 B. 010 -0x11 0x16

7ff -123 D.oabc 017 0x8 正确答案:C 7、下面不正确的字符串常量是( )。 A."12\12" B."0" C."" D.'abc' 正确答案:D 8、在C语言中,要求运算数必须是整型的运算符是( )。 A./ B.= C.++ D.% 正确答案:D 9、若以下变量均是整型,且num=sum=7;则执行表达式 sum=num++,sum++,++num后sum的值为( )。 A.7 B.9 C.10 D.8 正确答案:D 10、若有定义:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是( )。

数据结构(C语言描述)课后答案习题答案7

习题7 1)选择题 (1)图中有关路径的定义是(A)。 A.由不同顶点所形成的序列 B.由顶点和相邻顶点对构成的边所形成的序列 C.由不同边所形成的序列 D.上述定义都不是 (2)设无向图的顶点个数为n,则该图最多有(B)条边。 A.n-1 B.n(n-1)/2 C.n(n+1)/2 D.n2 (3)一个n个顶点的连通无向图,其边的个数至少为(A)。 A.n-1 B.n C.n+1 D.n log2n (4)要连通具有n个顶点的有向图,至少需要(B)条边 A.n-1 B.n C.n+1 D.2n (5)n个结点的完全有向图含有边的数目为(D)。 A.n2B.n(n+1) C.n/2 D.n(n-1) (6)一个有n个结点的图,最少有(B)个连通分量,最多有(D)个连通分量。 A.0 B.1 C.n-1 D.n (7)在一个无向图中,所有顶点的度数之和等于所有边数的(B)倍,在一个有向图中,所有顶点的入度之和等于所有顶点出度之和的(C)倍。

A.1/2 B.2 C.1 D.4 (8)下面结构中最适于表示稀疏无向图的是(C),适于表示稀疏有向图的是(BDE)。 A.邻接矩阵B.逆邻接表C.邻接多重表D.十字链表E.邻接表 (9)下列哪些图的邻接矩阵是对称矩阵(B)。 A.有向图B.无向图C.有向网D.无向网 (10)下列有关图遍历的说法不正确的是(C)。 A.连通图深度优先搜索是个递归过程 B.图的广度优先遍历中邻接点的搜索具有“先进先出”的特征C.非连通图不能用深度优先搜索 D.图的遍历要求每个顶点仅被访问一次 (11)某图的邻接表如图7-26所示。 1 2 3 4 5 6 7 图7-26 某图的邻接表 ①从顶点v1进行深度优先遍历,遍历过程中要经过的顺序是(A)。

c语言实验报告心得总结

c语言实验报告心得总结 c语言实验报告心得总结一在初学C语言的一个学期后,我们进行了C语言实训阶段,尝试编写一个比较复杂的程序系统。在为期一周的时间中,我们同组的同学共同的感受是:C语言实训和平时上课所接触的程序是有很大不同的,所经受的考验和克服的困难是平时所无法比拟的。好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了C语言实训的复杂程序。在这里,我作为其中的参与者,感触良多。 在这次实训中,我对对C语言有了一个更深的了解认识,也对这个学期学的知识得到巩固,还尝试运行编程,每次运行程序成功,让我对下面的项目就充满信心。通过自己与同学合作编写程序,最终把最初的理论知识转化基本技能。这次的实训,使我对C语言的学习产生浓厚的兴趣。 还是这次实训,最令人激动的就是合作做项目,虽然那只是一个很小很小的项目。每天大家来得很早,大家在一起学习,取长补短,我们很好的在实训中长知识,提高我们的学习热情。实训中深切体会到了老师认真负责的伟大的精神和热情为同学指导的促学方式,虽然对有些时候老师没给我们指出解决问题的方法有些小抱怨,但是到了结束时才知道,这种教学让我们自己学会了自学,学会了去看懂别人的代码。更多是老师给的感动,每天在我们来之前就到了教室,在讲

课中海给我们分享他在公司上班的一些心得和体会,还有那些我们应该注意的事项,这些是平时上课时无法学到的,是更深层次的巨大收获。 通过这次实训,也使我们发现了许多问题。 在实训中,我们认识到自己还有很多的知识没学好,基础知识没理清,而且许多东西还要去翻书,去上网搜索。而且遇到一些小错误运行不出来,就会烦躁不安,觉得有些自暴自弃或者抱怨项目的变态,以后要克服,尽量保持一颗良好的心态,学好C语言,也学好用C语言编写一个按要求的系统。 还有就是对于未来,近程就是下学期,我觉得我还有许多方面需要提高。 首先我要继续学习好C语言的基础知识,然后能在电脑上熟练的运用。然后每天都能写一些程序,上网时候多看一些优秀的教程和优秀的代码。遇到问题时多和同学讨论,并且多弄出几套方案,多锻炼自己结局问题的能力和与同学合作的能力。 总之,这一切都成为我记忆里面的一个篇章,更是在C 语言编程上的一个里程碑。 c语言实验报告心得总结二在科技高度发展的今天,计算机在人们之中的作用越来越突出。而c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,

C语言实验报告

《程序设计基础》实验报告

{ float a, b; printf_s("please input cost price of TV:"); scanf_s("%f", &a); b = a*K; printf_s("the current price of TV:"); printf_s("%f", b); return 0; 2. #include"stdafx.h" int main() { int a, b, c, d, e, f; printf_s("please input three figures:"); scanf_s("%d", &a); b = a / 100; c = a % 100; d = c / 10; e = c % 10; f = e * 100 + d * 10 + b; printf_s("the new three figures:"); printf_s("%d", f); return 0; } 3. #include"stdafx.h" int main() { float a, b, c, d, e; printf_s("please input scores:\n");

scanf_s("%f%f%f", &a, &b, &c); d = a + b + c; e = (a + b + c) / 3; printf_s("the total scores:"); printf_s("%5.1f\n", d); printf_s("the average scores:"); printf_s("%4.1f\n", e); return 0; } 4. #include"stdafx.h" int main() { float a, b; printf("please input a number:"); scanf_s("%f", &a); printf_s("the integer part is:"); printf_s("%d\n", (int)a); b = a - (int)a; printf_s("the decimal part is:"); printf_s("%2.1f", b); return 0; } 5. #include"stdafx.h"

C语言习题:顺序、选择、循环

顺序结构程序设计 2.3.1 要点导读 () 与scanf()语句。 printf() 与scanf()语句是最通用的输入输出函数,它们可以在程序设计者的控制下以各种格式分别实现数据的输出和输入操作。它们位于库文件中。 2.字符数据的输入输出。 最简单的字符输入输出函数是getchar()和putchar()。两者分别从键盘读一个字符或向显示屏写一个字符。 2.3.2 经典例题分析 1.下列程序运行后输出的结果是。 #include <> void main() 、 { int a=0,b=0; a=10; b=20; printf(“a+b=%d”,a+b); } 分析:printf( )是输出函数,它的括号内由两部分组成: 1)控制字符串,是用双引号括起来的字符串,它包括两种信息: (1) 格式说明。由”%”和格式字符组成,如:%d、%f、%c等。它的作用是将输出 的数据转换成指定的格式输出。 (2) 普通字符。需要原样输出的字符。 - 2)”输出表列”是需要输出的一些数据,可以是表达式。 题目中a的值是10,b的值是20,在 printf(“a+b=%d”,a+b); 格式说明输出表列 中,”a+b= “是普通字符,需原样输出。输出表列是一个表达式,它的结果以整型输出。 答案:a+b=30。 2.下列程序运行后输出的结果是。

#include <> void main() { int a=732; ) printf(“%d\n”,a); printf(“%2d\n”,a); printf(“%10d\n”,a); printf(“%-10d\n”,a); } 分析:d格式符,用来输出十进制整数。其中%d,按整型数据的实际长度输出。%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 printf(“%d\n”,a);把a的值按原样输出:732。printf(“%2d\n”,a);结果占2列,但732占3列大于2列,所以按实际位数输出:732。printf(%10d\n”,a);结果占10列,但732占3列小于10列,所以左端补7个空格。printf(“%-10d\n”,a); 结果占10列,“-”表示把数值放到左端,732占3列小于10列,所以右端补7个空格。 答案:732 732 □□□□□□□732 /*□表示空格*/ , 732□□□□□□□ 3.已知char a=‘\103’;则语句printf(“%3d”,a);执行后的输出结果为(□表示空格)。 A)□67B)’c’C)67□D)103 分析:’\103’是一个转义字符,表示一个八进制数所代表的字符,转换为十进制为67。printf(“%3d”,a);把’\103’转换为十进制数输出,结果占3列。但67占2列,小于要求的3列,所以左补空格,即□67。 答案:C。 4.下列程序运行后结果是。 #include <> #define a void main() { printf(“%f\n”,a); @ printf(“%e\n”,a); printf(“%4.2f\n”,a); printf(“%3.1f\n”,a); printf(“%10.3f\n”,a); printf(“%-10.3f\n”,a); } 分析:f格式符,用来输出实数,以小数形式输出,小数点后输出6位。所以printf(“%f\n”,a);输出结果为。 %是指,要输出的数占m列,同时小数点保留n位(四舍五入),如果输出的数大于m,

相关文档
最新文档