一、 选择题(每小题2分,共24分)
1.计算机识别、存储和加工处理的对象被统称为( A)
A.数据B.数据元素
C.数据结构D.数据类型
2.栈和队列都是( A )
A.限制存取位置的线性结构B.顺序存储的线性结构
C.链式存储的线性结构D.限制存取位置的非线性结构
3.链栈与顺序栈相比,比较明显的优点是( D )
A.插入操作更加方便B.删除操作更加方便
C.不会出现下溢的情况D.不会出现上溢的情况
4.采用两类不同存储结构的字符串可分别简称为( B)
A.主串和子串B.顺序串和链串
C.目标串和模式串D.变量串和常量串
5. 一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是:B
A. 110 B .108
C. 100 D. 120
6.串是一种特殊的线性表,其特殊性体现在:B
A.可以顺序存储 B .数据元素是一个字符
C. 可以链接存储 D. 数据元素可以是多个字符
7.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为: C
A. 2h B .2h-1
C. 2h+1 D. h+1
软件开发网
8.树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历和后序遍历。这里,我们把 由树转化得到的二叉树叫做这棵树对应的二叉树。下列结论哪个正确? A
A. 树的先根遍历序列与其对应的二叉树的先序遍历序列相同
B .树的后根遍历序列与其对应的二叉树的后序遍历序列相同
C. 树的先根遍历序列与其对应的二叉树的中序遍历序列相同
D. 以上都不对
9.一个有n个顶点的无向图最多有多少边?C
A. n B .n(n-1)
C. n(n-1)/2D. 2n
10.在一个图中,所有顶点的度数之和等于所有边数的多少倍?C
A. 1/2 B .1
C. 2 D. 4
11.当在二叉排序树中插入一个新结点时,若树中不存在与待插入结点的关键字相同的结点,且新结点的关键字小于根结点的关键字,则新结点将成为( A )
A.左子树的叶子结点 B.左子树的分支结点
C.右子树的叶子结点 D.右子树的分支结点
软件开发网
12.对于哈希函数H(key)=key%13,被称为同义词的关键字是( D )
A.35和41B.23和39
C.15和44D.25和51
二、已知某棵二叉树的前序遍历结果为A,B,D,E,G,C,F,H,I,J,其中中序遍历的结果为D,B,G,E,A,H,F,I,J,C。请画出二叉的具体结构。(注意要写出具体步骤)(10分)
原理见课本128页
三、有图如下,请写出从顶点c0出发的深度优先及宽度优先遍历的结果。(10分)
深度优先;C0-C1-C3-C4-C5-C2
宽度优先:C0-C1-C2-C3-C4-C5
四、有图如下,按Kruskal算法求出其最小生成树。要求写出完整的步骤。(10分)
原理见课本250页
五、给定线性表(12,23,45,66,76,88,93,103,166),试写出在其上进行二分查找关键字值12,93,166的过程。并写出二分查找的算法。(20分)
0 1 2 3 4 5 6 7 8
12 23 45 66 76 88 93 103 166
过程:
mid=(0+8)/2=4
high=3,low=0 mid=1
high=0,low=0 mid=0(找到12)
high=8,low=5,mid=6(找到93)
high=8,low=7,mid=7
high=8 low=8 mid=8
算法:见课本84页上
六、知单链表的结点结构为
Data next
下列算法对带头结点的单链表L进行简单选择排序,使得L中的元素按值从小到大排列。
请在空缺处填入合适的内容,使其成为完整的算法。 (可用文字说明该算法的基本思想及执行的过程,10分)
void SelectSort(LinkedList L)
{
LinkedList p,q,min
DataType rcd
p= (1)
while(p!=NULL) {
min=p
q=p->next
while(q!=NULL){
if((2))min=q
q=q->next
}
if( (3) ){
rcd=p->data
p->data=min->data
min->data=rcd
}
(4)
}
}
本题不会。嘿嘿。。。。
七、一个完整的算法应该具有哪几个基本性质?分别简要说明每一性质的含意。(5分)
输入:
四个基本性质:1.输入:有零个或多个有外部提供的量作为算法的输入
2:输出:算法产生至少一个量作为输出
3.:确定性:组成算法的每条指令是清晰的,无歧异的。
4.:有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的
八、何谓队列的"假溢"现象?如何解决?(5分)
队列的假溢现象是指数组实现的顺序队列中,队尾指针已到达数组的下表上界产生上溢而队头指针之前还有若干 空间闲置的现象。解决的办法之一是利用循环队列技术使数组空间的首尾相连。
九、说明并比较文件的各种物理结构。(6分)
不保证对。。。一
1.B
2.B
3.A
4.A或者C,吃不准,C的面大
5.C,题意不明确
6.C
7.B
8.D
9.A
10.A
三
1。错
2。对
3。对
4。错
5。错
6。错
7。错,吃不准
8。错,吃不准
9。对
10。错,好像题目写错了?
这是按题目要求写的,有任何问题追问
#include <stdio.h>typedef int StackDataType
typedef struct _StackData{
StackDataType data
_StackData *up
_StackData *next
}StackData
typedef struct _Stack{
_StackData *head
_StackData *last
int length
}Stack
void initStack(Stack *s)
{
s->head=0
s->last=0
s->length=0
}
void push(Stack *s, StackDataType dat)
{
StackData *curr
if(!s->last)
{
s->head=s->last=new StackData
curr=s->last
curr->up=0
}
else
{
curr=s->last
curr->next=s->last=new StackData
s->last->up=curr
curr=s->last
}
curr->next=0
curr->data=dat
s->length++
}
int pop(Stack *s, StackDataType *pdat)
{
StackData *curr
if(!s->last) return 0
curr=s->last
if(curr->up)
{
s->last=curr->up
s->last->next=0
}
else
{
s->head=s->last=0
}
*pdat=curr->data
delete[]curr
s->length--
return 1
}
void freeStack(Stack *s)
{
StackData *curr,*curr2
curr=s->head
while(curr)
{
curr2=curr->next
delete[]curr
curr=curr2
}
s->head=0
s->last=0
s->length=0
}
void main()
{
int i,dat
Stack s1,s2
initStack(&s1) //初始化栈1
initStack(&s2) //初始化栈2
for(i=1i<=5i++)
{
push(&s1,i) //栈1分别入栈数据1 2 3 4 5
}
for(i=0i<5i++)
{
pop(&s1,&dat) //栈1出栈
push(&s2,dat) //栈2入栈
}
for(i=0i<5i++)
{
if(i) printf(" ") //显示第一个数据前面不加空格
pop(&s2,&dat) //栈2出栈
printf("%d",dat) //显示栈2出栈的数据
}
freeStack(&s1) //释放栈1内存,如果数据未全部出栈,会把未释放的内存释放
freeStack(&s2) //释放栈2内存,如果数据未全部出栈,会把未释放的内存释放
}