数据结构自考2009年1月真题及答案解析
-
假设以带头结点的单链表表示线性表,单链表的类型定义如下:
typedef int DataType;
typedef struct node {
DataType data;
struct node * next;
} LinkNode, * LinkList;
编写算法,删除线性表中最大元素(假设最大值唯一存在)。函数原型为:
void f34(LinkList head) ;
-
设有向图邻接表定义如下:
typedef struct {
VertexNode adjlist[ MaxVertexNum ] ;
int n,e; //图的当前顶点数和弧数
}ALGraph; //邻接表类型
其中顶点表结点VertexNode边表结点EdgeNode结构为:
阅读下列算法,并回答问题:
(1)已知某有向图存储在如图所示的邻接表G中,写出执行f32(&G)的输出;
(2)简述算法f32的功能。
int visited[ MaxNum ];
void DFS(ALGraph * G, int i) {
EdgeNode * p;
visited [ i ] = TRUE ;
if (G - >adjlist[ i]. firstedge = = NULL)
printf( "% c ", G - >adjlist[ i]. vertex);
else {
p = G - >adjlist[ i]. firstedge;
while (p ! = NULL) {
if ( ! visited[p ->adjvex] )
DFS( G, p - >adjvex) ;
p = p->next;
}
}
}
void f32 ( ALGraph * G) {
int i;
for (i = 0; i< G->n; i ++)
visited [ i ] = FALSE ;
for (i = 0; i< G->n; i++)
if ( ! visited[i] ) DFS(G, i) ;
}
-
下列算法f33的功能是对记录序列进行双向冒泡排序。算法的基本思想为,先从前往后通过交换将关键字最大的记录移动至后端,然后从后往前通过交换将关键字最小的记录移动至前端,如此反复进行,直至整个序列按关键字递增有序为止。请在空缺处填入合适的内容,使其成为完整的算法。
#define MAXLEN 100
typedef int KeyType;
typedef struct {
KeyType key;
InfoType otherinfo;
} NodeType ;
typedef NodeType SqList[ MAXLEN ];
void f33 ( SqList R, int n)
{ int i,j,k;
NodeType t;
i =0;
j =n-l;
while (i< j) {
for ( (1) )
if (R[k].key >R[k +l].key) {
t = R[k];
R[k] = R[k +1];
R[k +1] = t;}
j--;
for (k =j; k >i; k -- )
if ( (2) ) {
t = R[k];
R[k] = R[k-1];
R[k-1] = t;
}
(3) ;
}
}
-
假设以二叉链表表示二叉树,其类型定义如下:
typedef struct node {
DataType data;
struct node * lchild, * rchild; //左右孩子指针
} * BinTree ;
阅读下列算法,并回答问题:
(1)已知以T为根指针的二叉树如图所示,写出执行f31(T)之后的返回值;
(2)简述算法f31的功能。
int f31 ( BinTree T)
{ int d;
if ( ! T) return 0;
d = f31 ( T - >lchild) + f31 ( T - >rchild) ;
if (T - >lchild && T - >rchild)
return d + 1 ;
else
return d;
-
已知3阶B—树如图所示,
(1)画出将关键字6插入之后的B—树;
(2)画出在(1)所得树中插入关键字2之后的B—树。
-
假设以带头结点的单链表表示线性表,单链表的类型定义如下:
typedef int DataType;
typedef struct node {
DataType data;
struct node * next;
} LinkNode, * LinkList;
阅读下列算法,并回答问题:
(1)已知初始链表如图所示,画出执行f30(head)之后的链表;
题 30图
(2)简述算法f30的功能。
void f30( LinkList head)
{ LinkList p,r, s;if (head - >next) {
r = head - >next;
p = r->next;
r - >next = NULL;
while (p) {
s =p;
p = p->next;
if ( s - >data% 2 = = 0) {
s - >next = head - >next;
head - >next = s;
} else {
s - >next = r - >next;
r->next = s;
r =s;
}
}
}
}
-
假设通信电文使用的字符集为{a,b,c,d,e,f,g,h},各字符在电文中出现的频度分别为:7,26,2,28,13,10,3,11,试为这8个字符设计哈夫曼编码。
要求:
(1)画出你所构造的哈夫曼树(要求树中左孩子结点的权值不大于右孩子结点的权值);
(2)按左分支为0和右分支为1的规则,分别写出与每个字符对应的编码。
-
对关键字序列(5,8,1,3,9,6,2,7)按从小到大进行快速排序。
(1)写出排序过程中前两趟的划分结果;
(2)快速排序是否是稳定的排序方法?
-
假设有一个形如
的8×8矩阵,矩阵元素都是整型量(次对角线以上的元素都是0)。若将上述矩阵中次对角线及其以下的元素按行优先压缩存储在一维数组B中,
请回答下列问题:
(1)B数组的体积至少是多少?
(2)若存储在B[0]中,存储在B[k]中,则k值为多少?
-
VSAM文件的实现依赖于操作系统中的_________存取方法的功能。
-
索引顺序查找的索引表由各分块中的最大关键字及各分块的_________构成。
-
对关键字序列(15,18,11,13,19,16,12,17,10,8)进行增量为5的一趟希尔排序的结果为_________。
-
在含有3个结点a,b,c的二叉树中,前序序列为abc且后序序列为cba的二叉树有_________棵。
-
若用邻接矩阵表示有向图,则顶点i的入度等于矩阵中_________。
-
广义表(a,(d,(c)))的深度为_________。
-
链串的结点大小定义为结点的_________中存放的字符个数。
-
在双向循环链表中插入一个新的结点时,应修改_________个指针域的值。
-
若进栈序列为a,b,c,且进栈和出栈可以穿插进行,则可能出现_________个不同的出栈序列。
-
估算算法时间复杂度时考虑的问题规模通常是指算法求解问题的_________。
-
数据库文件是由大量带有结构的( )
- A.记录组成的集合
- B.字符组成的集合
- C.数据项组成的集合
- D.数据结构组成的集合
-
对长度为15的有序顺序表进行二分查找,在各记录的查找概率均相等的情况下,查找成功时所需进行的关键字比较次数的平均值为( )
- A.
- B.
- C.
- D.
-
已知一个散列表如图所示,其散列函数为H(key)=key%11,采用二次探查法处理冲突,则下一个插入的关键字49的地址为( )
- A.2
- B.3
- C.8
- D.9
-
下列关键字序列中,构成大根堆的是( )
- A.5,8,1,3,9,6,2,7
- B.9,8,1,7,5,6,2,33
- C.9,8,6,3,5,1,2,7
- D.9,8,6,7,5,1,2,3
-
已知含6个顶点(v0,v1,v2,v3,v4,v5)的无向图的邻接矩阵如图所示,则从顶点v0出发进行深度优先遍历可能得到的顶点访问序列为( )
- A.(v0,v1,v2,v5,v4,v3)
- B.(v0,v1,v2,v3,v4,v5)
- C.(v0,v1,v5,v2,v3,v4)
- D.(v0,v1,v4,v5,v2,v3)
-
如图所示有向图的一个拓扑序列是( )
- A.ABCDEF
- B.FCBEAD
- C.FEDCBA
- D.DAEBCF
-
已知在一棵度为3的树中,度为2的结点数为4,度为3的结点数为3,则该树中的叶子结点数为( )
- A.5
- B.8
- C.11
- D.18
-
下列所示各图中是中序线索化二叉树的是( )
-
高度为5的完全二叉树中含有的结点数至少为( )
- A.16
- B.17
- C.31
- D.32
-
二维数组A[4][5]按行优先顺序存储,若每个元素占2个存储单元,且第一个元素A[0][0]的存储地址为1000,则数组元素A[3][2]的存储地址为( )
- A.1012
- B.1017
- C.1034
- D.1036
-
栈是一种操作受限的线性结构,其操作的主要特征是( )
- A.先进先出
- B.后进先出
- C.进优于出
- D.出优于进
-
判断两个串大小的基本准则是( )
- A.两个串长度的大小
- B.两个串中首字符的大小
- C.两个串中大写字母的多少
- D.对应的第一个不等字符的大小
-
假设以数组A[n]存放循环队列的元素,其头、尾指针分别为front和rear。若设定尾指针指向队列中的队尾元素,头指针指向队列中队头元素的前一个位置,则当前存于队列中的元素个数为( )
- A.(rear-front-1)%n
- B.(rear-front)%n
- C.(front-rear+1)%n
- D.(rear-front+n)%n
-
假设某个带头结点的单链表的头指针为head,则判定该表为空表的条件是( )
- A.head==NULL;
- B.head->next==NULL;
- C.head!=NULL;
- D.head->next==head;
-
下列程序段的时间复杂度为( )
- A.O(1)
- B.O(n)
- C.O(2n)
- D.