数据结构笔试题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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");