05到09年福建专升本数据结构真题详解 下载本文

C、后根 D、层次

8、用邻接表表示图进行深度优先遍历时,其非递归算法通常采用 ( A )来实现算法。

A、栈 B、队列 C、树 D、图

9、广度优先遍历类似于二叉树的( D )。 A、先序遍历 B、中序遍历 C、后序遍历 D、层次遍历

10、在一个有向图中,所有顶点的人度之和等于所有顶点的出度 之和的( B )。 A、1/2倍 B、1倍 C、2倍 D、4倍

11、任何一个带权无向连通图的最小生成树( B )。 A、只有一棵 B、一棵或多棵 C、一定有多棵 D、可能不存在

12、设非空单链表的数据域为data,指针域为next,指针P指向单链表的第i个结点,s指向生成的新结点,现将s结点插入到单链表中,使其成为第i结点,下列算法段能正确完成上述要求 的是( C )。 A、s->next=p->;p->next=s

B、p->next=s;s->next=p->next;

C、S->next=p->next;p->next=s;交换p->data和s->data D、p=s;s->next=p

二、填空题(每空2分,共20分)

1、数据的逻辑结构反映_____成分数据逻辑关系______。

2、对于队列,只能在___队尾_____插入元素,在____队头_____删除元素。 3、算法是一运算序列,它应有:有限性、____确定性____、可行性、可以无任何输入,但必须___有输出____。

4、由一棵二叉树的前序序列和____中序序列____可唯一确定这棵二叉树的结构。

5、如果图的存储结构用____邻接表/邻接矩阵___表示,从某指定顶点作为初始点进行广度优先搜索,得到的广度优先搜索序列唯一。

6、用Dijkstra算法求某一顶点到其余各顶点间的最短路径是按路径长度____递增___的次序来得到最短路径的。

7、线性表(a1,a2,a3,??an)(n>=1)中,每个元素占c个存储单元,m为a1首地址,则按顺序存储方式存储线性表,ai存储地址是_____m+(i-1)*c___。 8、n个结点的无向图,最多有___n*(n-1)/2__条边。 三、应用题 (本大题共4小题,每小题8分,共32分)

1、用Prim算法求下图连通的带权图的最小代价生成树,在算法执行的某一刻,已选取的顶点集合U=[1,2,3],边的集合 TE=[(1,2),(2,3)],要选取下一条权值最小的边,应当从哪些边中选择?

2、若用插入排序方法对线性表(25,84,21,47,]5,27,68,35,20)进行排序时,请给出前四趟排序结点序列的变化情况。 答:25

25 84 21 25 84 21 25 47 84 3、已知一棵二叉树的中序序列和后序序列分别为BDCEAFHG和DECBHGFA,请画出该二叉树。

A / \\

BDCE FHG 中 DECB HGF 后

4、设将整数a,b,c,d依次进栈,请回答:若入、出栈次序为 Push(a),Pop(),Push(b),Push(c),Pop(),Push(d),Pop(), 则出栈的字符序列是什么? 答:acd

四、算法设计 (本大题共3小题,每小题8分,共24分)

1、二叉树以二叉链表为存储结构,类型声明如下,请写出一个求二叉树中结点个数的算法。

typedef struct node{ datatype data;

struct node *Lchild; struct node *Rchild; }BinaTree;

答:int f(BinaTree *t){

if(t = = NULL) return; else

return f(t->left)+ f(t->right)+1;

}

2、设线性表用顺序结构实现,声明如下: typedef struct sqlist{ char data[maxsize]; int n;

}Sqlist;

请写一个算法,判断其是否回文?(顺读与倒读 一样如:“ababbaba\为回文) 答:

解法1:形参和实参直接传递结构变量 #include

#define MAXLENGTH 100

typedef struct sqlist{

char data[MAXLENGTH]; int n; }Sqlist;

void f(Sqlist a){ int i;

if(a.n<=0)return;

for(i=0;i<(a.n)/2;i++){

if(a.data[i]!=a.data[a.n-i]){

printf(\return;

}

printf(\ } }

void main(){ Sqlist s;

printf(\输入n: \ scanf(\

printf(\输入字符串: \ scanf(\ f(s); }

解法2:形参是指针变量,实参是结构变量地址值 void f(Sqlist *a){ int i;

if(a->n<=0)return; for(i=0;i<(a->n)/2;i++)

if(a->data[i]!=a->data[a->n-i-1]){ printf(\ return; }

printf(\}

void main(){

Sqlist s;

printf(\ scanf(\ printf(\ scanf(\ f(&s); }

解法3:类似解法2,为指针变量定义了类型List #include

#define MAXLENGTH 100

typedef struct sqlist *List;

typedef struct sqlist{

char data[MAXLENGTH]; int n; }Sqlist;

void f(List a){ int i;

if(a->n<=0)return; for(i=0;i<(a->n)/2;i++)

if(a->data[i]!=a->data[a->n-i-1]){ printf(\ return; }

printf(\}

void main(){ Sqlist s;

printf(\ scanf(\ printf(\ scanf(\ f(&s); }

3、阅读下列程序,判断它是用什么方法实现排序(升序)的?并完善下列程序。 #include

void bubble(int[],int);

main(){