ImageVerifierCode 换一换
格式:DOCX , 页数:65 ,大小:35.04KB ,
资源ID:6012478      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6012478.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构笔试题答案.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构笔试题答案.docx

1、数据结构笔试题答案数据结构笔试题答案一、 选择题1. C插入排序从后面插入的时候,只要把8和9交换一下就行了,遍历到前面都不再有任何操作。冒泡排序第一次循环把9沉到最后面,然后第二次循环发现没有任何交换操作,说明已经排好序了。2. A3. D已知前序和后序不能唯一确定4. B5. D二、 填空题1. (1)!=null (2)p-next (3)r!=null (4)r-data data (5)r-next (6)p-next 题中p指向无序区第一个记录,q指向最小值结点,一趟排序结束,p和q所指结点值交换,同时向后移p指针。2. EACBDGF3. sort_b_tree(&(*tree)

2、-right),s)sort_b_tree(&(*tree)-left),s)三、 简答题1. 数组和链表的区别,请详细解释。从逻辑结构来看:a) 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。b) 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素从内存存储来看:a) (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小b) 链表从堆中

3、分配空间, 自由度大但是申请管理比较麻烦从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表数据结构了。2. 排序算法有哪些?排序算法有很多,每种算法有不同的时间和空间复杂度,效率也有差别,那么针对使用上也有不同的场合。原则上说,数据结构是一门领域,跟语言没有绝对的联系,很多时候同样的算法可以用很多种语言实现。下面列一些常见的算法:插入排序,冒泡排序,选择排序,快速排序,堆排序,归并排序,基数排序,希尔排序等。3. 怎么理解哈希表,哈希表是什么摘自XX:散列表(Hash table,也叫哈希表),是根据关键码值(Key

4、 value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数4. 请写出以下算法的时间复杂度冒泡排序法 插入排序法 堆排序法 二叉树排序法O(n2) O(n2) O(nlog2 n) 最差O(n2)平均O(n*log2n)快速排序法 希尔排序法最差O(n2)平均O(n*log2n) O(nlogn)不稳定5. 数

5、据结构,二叉树的相关知识,开销量,为何使用二叉树等。在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常根的子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存在出度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。文件系统和数据库系统一般都采用树(特别是B树)的数据结构数据,主要为排序和检索的效率。二叉树是一种最基本最典型的排序树,用于教学和研究树的特性,本身很少在实际中进行应用,因为缺点太明显了(看看教科书怎么说的)。就像冒泡排序一样,虽然因为效率问题并

6、不实用,单不失一种教学例子的好手段。四、 编程题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 = alen/2; arraytotree(a,

7、 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 *t

8、ree; arraytotree(a, sizeof(a)/sizeof(a0), &tree); printf(After convert:n); display_tree(tree); printf(n); return 0; 2. 在二叉查找树中查找某一个值所在的位置。int find_btree(btree *bt, datatype x) if(bt) if(bt-key = x) return TRUE; if(!find_btree(bt-lchild,x) if(!find_btree(bt-rchild,x) return FALSE; 3. 二叉树,比父节点大的元素,都在右

9、子树,比父节点小的元素都在左子树。也就是排序二叉树,写出插入一个节点或者删除一个节点。#include #include #include #include #define TRUE 1#define FALSE 0typedef int status;typedef int datatype;typedef struct node datatype key; struct node *lchild, *rchild;btree;void bst_insert(btree *bt, datatype key) /二叉排序树的插入 if(NULL = *bt) btree *node = mal

10、loc(sizeof(btree); node-key = key; node-lchild = node-rchild = NULL; *bt = node; else if(key (*bt)-key) bst_insert(&(*bt)-rchild, key); else bst_insert(&(*bt)-lchild, key); status bst_delete(btree *bt, datatype key) /二叉排序树的删除 btree *tmp = NULL; if(!*bt) return FALSE; else if(key key) /在左子树中找 bst_del

11、ete(&(*bt)-lchild, key); else if(key (*bt)-key) /在右子树中找 bst_delete(&(*bt)-rchild, key); else /找到了 tmp = *bt; if(!(*bt)-lchild) /左子树为空 *bt = (*bt)-rchild; else if(!(*bt)-rchild) /右子树为空 *bt = (*bt)-lchild; free(tmp); return TRUE; void preorder_btree(btree *bt) /二叉树的先序遍历 if(bt != NULL) printf(%d,bt-key

12、); preorder_btree(bt-lchild); preorder_btree(bt-rchild); void inorder_btree(btree *bt) /二叉树的中序遍历 if(bt != NULL) inorder_btree(bt-lchild); printf(%d,bt-key); inorder_btree(bt-rchild); int main (int argc, char *argv) btree *bt = NULL; int n; while(1) scanf(%d,&n); if(n = 0) /输入0则结束 break; else bst_ins

13、ert(&bt, n); preorder_btree(bt); putchar(n); bst_delete(&bt, 8); preorder_btree(bt); putchar(n); return 0;4. 实现单向链表:创建链表、插入链表、查询链表、删除特定序号链表节点、遍历剩余链表节点简单的链表操作,这里假设链表无头结点。可以自己完善有头结点的单向链表。头文件:/* list.h - header file for a simple list type */#ifndef _LIST_H_#define _LIST_H_#include #include #include #in

14、clude /* C99 feature */#ifdef _cplusplus extern C#endif/*_cplusplus*/* program-specific declarations */typedef int dataType;/* general type definitions */typedef dataType Item;typedef struct node Item item; struct node * next; Node;typedef Node * List;/* function prototypes */void ListCreate(List *

15、plist);bool ListIsEmpty(const List *plist); bool ListIsFull(const List *plist);unsigned int ListItemCount(const List *plist);bool AddItem(Item item, List * plist);void EmptyTheList(List * plist);void TraverseTheList(List * plist);unsigned int ListItemSearch(const List * plist,const Item item);void d

16、eleteTheListNode(List * plist,unsigned int num);#ifdef _cplusplus #endif/*_cplusplus*/#endif /*_LIST_H_*/ .c 文件 /*list.c - functions supporting list operations */#include #include #include list.h/* local function definition */static void CopyToNode(const Item item, Node * pnode);static void displayT

17、heNOde(const Node * pnode);static bool ItemIsEqu(const Item Item, const Node * pnode);/*init a empty list*/void ListCreate(List * plist) * plist = NULL;/* returns true if list is empty */bool ListIsEmpty(const List * plist) if (*plist = NULL) return true; else return false;/* returns true if list is

18、 full */bool ListIsFull(const List * plist) Node * pt; bool full; pt = (Node *) malloc(sizeof(Node); if (pt = NULL) full = true; else full = false; free(pt); return full;/* returns number of nodes */unsigned int ListItemCount(const List * plist) unsigned int count = 0; Node * pnode = *plist; while (

19、pnode != NULL) +count; pnode = pnode-next; return count; /*search item in the list */unsigned int ListItemSearch(const List * plist,const Item item) int num = 0; Node * pnode = *plist; while (pnode != NULL) num+; if(ItemIsEqu(item, pnode) return num; pnode = pnode-next; return 0;/* creates node to h

20、old item and adds it to the end of list*/bool AddItem(Item item, List * plist) Node * pnew = NULL; Node * scan = *plist; pnew = (Node *) malloc(sizeof(Node); if (pnew = NULL) return false; CopyToNode(item, pnew); pnew-next = NULL; if (scan = NULL) /* empty list, so place */ *plist = pnew; /* pnew at

21、 head of list */ else while (scan-next != NULL) scan = scan-next; /* find end of list */ scan-next = pnew; /* add pnew to end */ return true;/*delete the node by num*/void deleteTheListNode(List * plist,unsigned int num) Node * pnode = *plist; Node * psave = NULL; if(ListIsEmpty(plist) return; if(1

22、= num) psave = *plist; *plist = psave-next; free(psave); return ; -num; while(pnode-next != NULL & num 1) -num; pnode = pnode-next; if(pnode-next != NULL & 1 = num) psave = pnode-next; pnode-next = psave-next; free(psave); /*Traverse The List */void TraverseTheList(List * plist) Node * pnode = *plis

23、t; while (pnode != NULL) displayTheNOde(pnode); pnode = pnode-next; putchar(n);/* free memory allocated by malloc() */void EmptyTheList(List * plist) Node * psave = NULL; while (*plist != NULL) psave = (*plist)-next; /* save address of next node */ free(*plist); /* free current node */ *plist = psav

24、e; /* advance to next node */ /* local function definition */* copies an item into a node */static void CopyToNode(const Item item, Node * pnode) pnode-item = item; /* structure copy */* display a node data*/static void displayTheNOde(const Node * pnode) printf(%d ,pnode-item);/*To determine the nod

25、e*/static bool ItemIsEqu(const Item Item, const Node * pnode) return Item = pnode-item ?true :false;5. 编程实现判断一个链表是否是递增的假设链表无头结点.若链表为空默认为递增。思路之前结点的数据与之后的数据依次比较typedef int dataType;/* general type definitions */typedef dataType Item;typedef struct node Item item; struct node * next; Node;typedef Node

26、* List;bool listItemIsIncrease(List * plist) Node * preptr = *plist; Node * curptr = NULL; if(NULL = *plist) return true; curptr = preptr-next; while(curptr != NULL) if(preptr-item curptr-item) /*如果是严格递增,则判断用 = */ break; preptr = curptr; curptr = curptr-next; return (curptr = NULL)?true :false;6. 编程

27、实现删除链表中的重复节点假设链表无头结点,挨个遍历链表数据,与之后的结点依次比较,发现重复的就删除typedef int dataType;/* general type definitions */typedef dataType Item;typedef struct node Item item; struct node * next; Node;typedef Node * List;void delRepeatedNodeOnce(List * plist) Node *p=*plist,*q,*u,*y; while(p) q=p-next; u=p; while(q) if(q-item = p-item) u-next=q-next;y=q; q=q-next; free(y); else u=q; q=q-next; p=p-next; 7. 只遍历一次链表,实现链表的倒序假设链表无头节点,链表头插入,直到遍历到链表末尾typedef int dataType;/* general type definitions */typedef dataType Item;typedef struct node Item item; struct node * next; Node;typedef N

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1