数据结构笔试题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构笔试题答案

一、选择题

1.C

插入排序从后面插入的时候,只要把8和9交换一下就行了,遍历到前面都不再有任何操作。

冒泡排序第一次循环把9沉到最后面,然后第二次循环发现没有任何交换操作,说明已经排好序了。

2. A

3. D

已知前序和后序不能唯一确定

4. B

5. D

二、填空题

1.

(1)!=null (2)p->next (3)r!=null (4)r->data < q->data (5)r->next (6)p->next

题中p指向无序区第一个记录,q指向最小值结点,一趟排序结束,p和q所指结点值交换,同时向后移p指针。

2.EACBDGF

3.

sort_b_tree(&((*tree)->right),s)

sort_b_tree(&((*tree)->left),s)

三、简答题

1.数组和链表的区别,请详细解释。

从逻辑结构来看:

a)数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当

数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组

可以根据下标直接存取。

b)链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、

删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链

表必须根据next指针找到下一个元素

从内存存储来看:

a)(静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小

b)链表从堆中分配空间, 自由度大但是申请管理比较麻烦

从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反,如果需要经常插入和删除元素就需要用链表数据结构了。

2.排序算法有哪些?< C语言总共有多少种排序法>

排序算法有很多,每种算法有不同的时间和空间复杂度,效率也有差别,那么针对使用上也有不同的场合。原则上说,数据结构是一门领域,跟语言没有绝对的联系,很多时

候同样的算法可以用很多种语言实现。下面列一些常见的算法:插入排序,冒泡排序,选择排序,快速排序,堆排序,归并排序,基数排序,希尔排序等。

3.怎么理解哈希表,哈希表是什么

摘自百度:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数

4.请写出以下算法的时间复杂度

冒泡排序法插入排序法堆排序法二叉树排序法

O(n^2)O(n^2) O(nlog2 n) 最差O(n2)平均O(n*log2n)

快速排序法希尔排序法

最差O(n2)平均O(n*log2n) O(nlog n)不稳定

5.数据结构,二叉树的相关知识,开销量,为何使用二叉树等。

在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常根的子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在出度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

文件系统和数据库系统一般都采用树(特别是B树)的数据结构数据,主要为排序和检索的效率。二叉树是一种最基本最典型的排序树,用于教学和研究树的特性,本身很少在实际中进行应用,因为缺点太明显了(看看教科书怎么说的)。就像冒泡排序一样,

虽然因为效率问题并不实用,单不失一种教学例子的好手段。

四、编程题

1.编写一个程序,把一个有序整数数组放在二叉树中。

#include

#include

#include

struct student

{

int value;

struct student *lchild;

struct student *rchild;

};

void arraytotree(int *a, int len, struct student **p)

{

if(len)

{

*p = (struct student*)malloc(sizeof(struct student));

(*p)->value = a[len/2];

arraytotree(a, len/2, &((*p)->lchild));

arraytotree(a+len/2+1, len-len/2-1, &((*p)->rchild));

}

else

{

*p = NULL;

}

}

void display_tree(struct student *head)

{

if(head->lchild)display_tree(head->lchild);

printf("%d,", head->value);

if(head->rchild)display_tree(head->rchild);

}

int main()

{

int a[] = {1,2,3,4,9,10,33,56,78,90};

struct student *tree;

arraytotree(a, sizeof(a)/sizeof(a[0]), &tree);

printf("After convert:\n");

相关文档
最新文档