数据结构习题集(错题集)

深度为k具有n个结点的完全二叉树,其编号最小的叶结点序号为[2 k-2]+1()×

正确答案是[n/2]+1。因为叶子结点可能出现在最后两层,最小编号的叶子结点为最大编号为n的叶子结点的父结点右边那个结点


分析:两种情况,有可能叶子节点只有1层;则2k-2]+1

叶子节点有2层:[n/2]+1


2.若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右孩子的两个指针。在这种存储结构中,n个结点的二叉树共有_____2n___个指针域,其中有____n-1____个指针域是存放了地址,有____n+1____个指针是空指针。为什么?在线等。


因为有n个节点,每个节点都存了一个lchild,一个rchild,所以共2n个指针域。
因为除了根节点,其他所有的节点都存在自己的父节点,而父节点肯定存在指向其孩子的指针,所以有n-1个存了地址(根节点没有父节点,所以-1),因为总数是2n个所以NULL的就是2n-(n-1)=n+1个


3.在一个具有n个顶点的无向完全图中,包含有________条边,在一个具有n个顶点的有向完全图中,包含有________条边

分析:完全图  和 连通图 不一样   n*(n+1)/2   n*(n+1)


4.一个有N个顶点和E条边的无向图 在其对应的邻接表中所含边结点数为?还有边结点的意思是什么?

无向图就是不分方向的图 连接表的横列有N项,纵列也是N项 形成的N*N项每项都被称为边结点 每项都有纵横两个坐标,例如点(N,N-1),表示的就是从第N点向第N-1点有无路径. 由于有E条边,自然有E条路径,但是由于无向,=双向,所以要乘以二


5.n个顶点的强连通图的边数至少有n个,那n个连通图的边数至少有n-1个,为什么

1、强连通图,指有向图中,任意两点之间都有路径.则最少情况是这N个点排成环.
2、连通图,是无向图中,任意两点间有路径,只需要这N点排成一条线然后相邻的连接起来.

6.

二叉排序树中插入一个结点的时间复杂度是多少_百度知道

最差情况下是O(n) 如果是最一般最基础的二叉树的话, 因为深度不平衡,所以会发展成单链的形状,就是一条线 n个点那么深

如果是深度平衡的二叉树 o(logn)


7.设一组权值集合W={2,3,4,5,6},则由该权值集合构造的哈夫曼树中带权路径长度之和为( ).
(A) 20(B) 30(C) 40(D) 45

数据结构习题集(错题集)_第1张图片

带权路径=6*2+5*2+4*2+3*3+2*3=45

8.设某无向图中有n个顶点e条边,则建立该图邻接表的时间复杂度为(  )。

 (A) O(n+e) (B) O(n) (C) O(ne) (D) O(n)

9.

设某散列表的长度为100,散列函数H(k)=k%p; p通常情况下最好选择

A 91
B 93
C 97
D 99
分析:
C,最好选择,也就只有一个答案,首先明确哈希函数的除留余法的P选择小于长度的最大质数比较好,所以C           
质数也就是素数,就是除了1和本身不能让其他除尽

10.

在初始数据表已经有序时,快速排序算法的时间复杂度为O(nlog2n)。

正确答案:× 在数据基本有序时,快速排序蜕变为起泡排序,时间复杂度是O(n2)。
11.

采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为多少

成功的平均查找次数:(1+2+3+...+n)/n=(n+1)/2 失败的平局查找次数:(0+1+2+...+n-1)/n=(n-1)/2 12.

下列程序的时间复杂度? i=s=0; while(s

只给提示:每重循环中i增量为1,s增量为i,当s>=n时循环终止。 于是,设循环执行t次,有:1+2+...+t >= n,用n表示出的t就是所求内容。
剩下的可就是数学问题了……t(1+t)/2>=n,然后可以用求根公式(判别式明显大于零)得到t用n的表示,不难发现它是O(根号n)。
13.

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

A 必须连接 B部分地址必须连接 C 一定不连接 D 连接不连接均可
分析:
选择D。

不过应该不是“连接”,而是“连续”。
链式存储结构与顺序存储结构相比,最大的优点就是地址不连续。因此才会使得元素的插入、删除等操作变得方便。
线性表只是逻辑结构,按照链式存储之后,定义操作只能按照线性结构来

15. 顺序栈s中top为栈顶指针,指向栈顶元素所在的位置,elem为存放栈的数组,则元素e进栈操作的主要语句为( )

A.s.elem[top]=e;
s.top=s.top+1;
B.s.elem[top+1]=e;
s.top=s.top+1;
C.s.top=s.top+1;
s.elem[top+1]=e;
D.s.top=s.top+1;
s.elem[top]=e;

分析:假定一个链栈的栈顶指针用top表示,每个结点的结构由一个数据域data和一个指针域组成,当p指向的结点进栈时
,执行的操作为().
A.p->next=top;
B.top=p;p->next=top;
C.p->next=top->next;top->next=p;
D.p->next=top;top=p;

分析:栈顶指针执行栈顶元素,链栈使用头插法

16.

一、线索二叉树的原理

    通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。

因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。

    记ptr指向二叉链表中的一个结点,以下是建立线索的规则:

    (1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点。这个结点称为ptr的中序前驱;

    (2)如果ptr->rchild为空,则存放指向中序遍历序列中该结点的后继结点。这个结点称为ptr的中序后继;

 其中:

    (1)ltag为0时指向该结点的左孩子,为1时指向该结点的前驱;

    (2)rtag为0时指向该结点的右孩子,为1时指向该结点的后继;


则:左子树为空的充要条件是: ptr->ltag==1

17.

C语言 假设变量a.b均为整型,表达式(a=5,b=2,a>b?a++:b++,a+b)的值是?

分析:逗号表达式是最终结果


18.

以下函数调用语句中含有的实参个数是( )。 func((exp1,exp2),(exp3,exp4,exp5));

分析形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
即  实际调用的时候 ,是形参的结果 作为最终结果,给实参传入函数

19.

在turbo C中,系统为整型(int)数据分配两个字节,表示范围在-32768到32767之间。如果不在这个范围内就要使用长整型(long int)来表示了。

在Visual C++中,系统为整型(int)数据分配四个字节,表示的范围在-2147483648到2147483647之间 20. 值为5的枚举常量是() enum week{sun,mon=4, tue,wed,thu,fri,sat}w;  A.tue B.sat C.fri D.thu 允许多个枚举成员有相同的值. 没有显示赋值的枚举成员的值,总是前一个枚举成员的值+1. 21. (设有char a[5],*p=a;)下面的选项中正确的赋值语句是(  )。
A)p=p+2; B)a=a+2;
C)*p=“abcd”; D)*a=“abcd”;

分析:

A)p=p+2;
意思是将a[2]的地址赋给p:p=&a[2];
B)a是个指针常量不能赋值
C)如果将*p的星号去掉就是正确的
D)a是个数组名是一个不能改变的左值

22.设有以下程序段,则值为6的表达式是( ).
struct st{ int n; struct st *next;};
staticstruct st a[3]={5,&a[1],7,&a[2],9,0 },*p;
p=&a[0];
A p++->n B++p->n C p->n++ D (*p).n++

分析:

++p->n的优先级是先取出p指向的结构体中的n值,再对n加一,p指向结构体数组的首元素,p->n = 5,然后5+1 = 6;

23.

int i=20;switch(i/10){case 2:printf("A");case 1:printf("B");} 的输出结果为A

分析:

输出AB,
24.
结构体类型是我们自定义的类型,它和其他的如int、char等是一样的,是一种数据结构。
数据结构是数据的存在形式。
变量可看成是一个对象,结构可看成是一个类。 类是一个抽象,对象是一个实例. 25.

若有定义:char *p(char[10]);则p是函数名。

分析:
如果形式如下:char (*p)(char a[10])此时是定义一个函数指针,名为p

26.

switch(a){ case 'a': case 'b': case 'c': 输出语句; break; }

switch 语句来选择要执行的多个代码块之一。

工作原理:首先设置表达式 n(通常是一个变量)。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配,

则与该 case 关联的代码块会被执行。请使用 break 来阻止代码自动地向下一个 case 运行。

27.

int fseek(FILE *stream, long offset, int fromwhere);
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置: 文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准, 偏移offset( 指针 偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

28.

具有相同类型的指针类型变量p与数组a,不能进行的操作是

A p=a; B *p=a[0]; C p=&a[0]; D p=&a;

分析:

char * 与 char ** 值不同,char * 的结果执行的对象在常量区,但是 char ** 的 结果在 堆栈区域,难以使用字符类型ascii进行转换,所以报错。

尽量按照同类型转换,强制转换也是 同级指针。

指针包含两个方面的内容:一是存储单元的起始地址,二是操作对象的类型,这两个是缺一不可的。在汇编语言中有这样的汇编指令: mov ds:[bx],6 '将数值6存储到ds:bx所确定的存储单元 其实它是不能通过编译的,虽然通过ds:bx可以确定该存储单元的地址,但却不知道是将数值6存储到该地址开始的字节中、字中、还是双子中等,必须明确指出,比如: mov byte ptr ds:[bx],6 '存储到字节中 mov word ptr ds:[bx],6 '存储到字中 mov dword ptr ds:[bx],6 '存储到双字中 这样才能通过编译。

29.

语句enum aa{a=5,b,c}bb;bb=(enum aa)5

分析:
enum aa{a=5,b,c} bb;
是C语言中定义的枚举类型;意思是:定义aa这个数据类型,其取值范围是a,b,c三个数,其中,a=5, b=6,c=7(如果不给b,c指定数值,就是其前一个数+1)。
同时定义aa 这个数据类型的变量bb
bb=(enum aa)5;和你学到的 int a = (int)b;功能一样,是把数值5转义成(enum aa)数据类型,同时赋值给变量bb;
30.






你可能感兴趣的:(C/C++)