数据结构笔试题答案文档格式.docx
- 文档编号:19007056
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:65
- 大小:35.04KB
数据结构笔试题答案文档格式.docx
《数据结构笔试题答案文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构笔试题答案文档格式.docx(65页珍藏版)》请在冰豆网上搜索。
从内存存储来看:
a)(静态)数组从栈中分配空间,对于程序员方便快速,但是自由度小
b)链表从堆中分配空间,自由度大但是申请管理比较麻烦
从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;
相反,如果需要经常插入和删除元素就需要用链表数据结构了。
2.排序算法有哪些?
<
C语言总共有多少种排序法>
排序算法有很多,每种算法有不同的时间和空间复杂度,效率也有差别,那么针对使用上也有不同的场合。
原则上说,数据结构是一门领域,跟语言没有绝对的联系,很多时候同样的算法可以用很多种语言实现。
下面列一些常见的算法:
插入排序,冒泡排序,选择排序,快速排序,堆排序,归并排序,基数排序,希尔排序等。
3.怎么理解哈希表,哈希表是什么
摘自XX:
散列表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。
也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash)函数
4.请写出以下算法的时间复杂度
冒泡排序法插入排序法堆排序法二叉树排序法
O(n^2)O(n^2)
O(nlog2n)最差O(n2)平均O(n*log2n)
快速排序法希尔排序法
最差O(n2)平均O(n*log2n)O(nlog
n)不稳定
5.数据结构,二叉树的相关知识,开销量,为何使用二叉树等。
在计算机科学中,二叉树是每个结点最多有两个子树的有序树。
通常根的子树被称作“左子树”(leftsubtree)和“右子树”(rightsubtree)。
二叉树常被用作二叉查找树和二叉堆或是二叉排序树。
二叉树的每个结点至多只有二棵子树(不存在出度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
文件系统和数据库系统一般都采用树(特别是B树)的数据结构数据,主要为排序和检索的效率。
二叉树是一种最基本最典型的排序树,用于教学和研究树的特性,本身很少在实际中进行应用,因为缺点太明显了(看看教科书怎么说的)。
就像冒泡排序一样,虽然因为效率问题并不实用,单不失一种教学例子的好手段。
四、编程题
1.编写一个程序,把一个有序整数数组放在二叉树中。
#include<
stdio.h>
stdlib.h>
string.h>
structstudent
{
intvalue;
structstudent*lchild;
structstudent*rchild;
};
voidarraytotree(int*a,intlen,structstudent**p)
if(len)
{
*p=(structstudent*)malloc(sizeof(structstudent));
(*p)->
value=a[len/2];
arraytotree(a,len/2,&
((*p)->
lchild));
arraytotree(a+len/2+1,len-len/2-1,&
rchild));
}
else
*p=NULL;
}
voiddisplay_tree(structstudent*head)
if(head->
lchild)display_tree(head->
lchild);
printf("
%d,"
head->
value);
rchild)display_tree(head->
rchild);
intmain()
inta[]={1,2,3,4,9,10,33,56,78,90};
structstudent*tree;
arraytotree(a,sizeof(a)/sizeof(a[0]),&
tree);
Afterconvert:
\n"
);
display_tree(tree);
return0;
2.在二叉查找树中查找某一个值所在的位置。
intfind_btree(btree*bt,datatypex)
if(bt){
if(bt->
key==x)
returnTRUE;
if(!
find_btree(bt->
lchild,x))
if(!
rchild,x))
returnFALSE;
3.二叉树,比父节点大的元素,都在右子树,比父节点小的元素都在左子树。
也就是排序二叉树,写出插入一个节点或者删除一个节点。
strings.h>
assert.h>
#defineTRUE1
#defineFALSE0
typedefintstatus;
typedefintdatatype;
typedefstructnode
datatypekey;
structnode*lchild,*rchild;
}btree;
voidbst_insert(btree**bt,datatypekey)//二叉排序树的插入
{
if(NULL==*bt)
btree*node=malloc(sizeof(btree));
node->
key=key;
lchild=node->
rchild=NULL;
*bt=node;
elseif(key>
(*bt)->
key)
bst_insert(&
(*bt)->
rchild,key);
lchild,key);
statusbst_delete(btree**bt,datatypekey)//二叉排序树的删除
btree*tmp=NULL;
if(!
*bt)
returnFALSE;
{
if(key<
key)//在左子树中找
{
bst_delete(&
}
elseif(key>
key)//在右子树中找
else//找到了
tmp=*bt;
lchild)//左子树为空
{
*bt=(*bt)->
rchild;
}
elseif(!
rchild)//右子树为空
lchild;
free(tmp);
voidpreorder_btree(btree*bt)//二叉树的先序遍历
if(bt!
=NULL){
printf("
bt->
key);
preorder_btree(bt->
voidinorder_btree(btree*bt)//二叉树的中序遍历
inorder_btree(bt->
intmain(intargc,char*argv[])
btree*bt=NULL;
intn;
while
(1)
scanf("
%d"
&
n);
if(n==0)//输入0则结束
break;
else
bst_insert(&
bt,n);
preorder_btree(bt);
putchar('
\n'
bst_delete(&
bt,8);
4.实现单向链表:
创建链表、插入链表、查询链表、删除特定序号链表节点、遍历剩余链表节点
简单的链表操作,这里假设链表无头结点。
可以自己完善有头结点的单向链表。
头文件:
/*list.h--headerfileforasimplelisttype*/
#ifndef__LIST_H_
#define__LIST_H_
stdbool.h>
/*C99feature*/
#ifdef__cplusplus
extern"
C"
#endif/*__cplusplus*/
/*program-specificdeclarations*/
typedefintdataType;
/*generaltypedefinitions*/
typedefdataTypeItem;
Itemitem;
structnode*next;
}Node;
typedefNode*List;
/*functionprototypes*/
voidListCreate(List*plist);
boolListIsEmpty(constList*plist);
boolListIsFull(constList*plist);
unsignedintListItemCount(constList*plist);
boolAddItem(Itemitem,List*plist);
voidEmptyTheList(List*plist);
voidTraverseTheList(List*plist);
unsignedintListItemSearch(constList*plist,constItemitem);
voiddeleteTheListNode(List*plist,unsignedintnum);
#endif/*__LIST_H_*/
.c文件
/*list.c--functionssupportinglistoperations*/
#include"
list.h"
/*localfunctiondefinition*/
staticvoidCopyToNode(constItemitem,Node*pnode);
staticvoiddisplayTheNOde(constNode*pnode);
staticboolItemIsEqu(constItemItem,constNode*pnode);
/*initaemptylist*/
voidListCreate(List*plist)
*plist=NULL;
/*returnstrueiflistisempty*/
boolListIsEmpty(constList*plist)
if(*plist==NULL)
returntrue;
returnfalse;
/*returnstrueiflistisfull*/
boolListIsFull(constList*plist)
Node*pt;
boolfull;
pt=(Node*)malloc(sizeof(Node));
if(pt==NULL)
full=true;
full=false;
free(pt);
returnfull;
/*returnsnumberofnodes*/
unsignedintListItemCount(constList*plist)
unsignedintcount=0;
Node*pnode=*plist;
while(pnode!
=NULL)
++count;
pnode=pnode->
next;
returncount;
}
/*searchiteminthelist*/
unsignedintListItemSearch(constList*plist,constItemitem)
intnum=0;
num++;
if(ItemIsEqu(item,pnode))
returnnum;
/*createsnodetoholditemandaddsittotheendoflist*/
boolAddItem(Itemitem,List*plist)
Node*pnew=NULL;
Node*scan=*plist;
pnew=(Node*)malloc(sizeof(Node));
if(pnew==NULL)
CopyToNode(item,pnew);
pnew->
next=NULL;
if(scan==NULL)/*emptylist,soplace*/
*plist=pnew;
/*pnewatheadoflist*/
while(scan->
next!
scan=scan->
/*findendoflist*/
scan->
next=pnew;
/*addpnewtoend*/
/*deletethenodebynum*/
voiddeleteTheListNode(List*plist,unsignedintnum)
{
Node*psave=NULL;
if(ListIsEmpty(plist))
return;
if(1==num)
psave=*plist;
*plist=psave->
free(psave);
return;
--num;
while(pnode->
=NULL&
&
num>
1)
--num;
if(pnode->
1==num)
psave=pnode->
pnode->
next=psave->
/*TraverseTheList*/
voidTraverseTheList(List*plist)
displayTheNOde(pnode);
pnode=pnode->
/*freememoryallocatedbymalloc()*/
voidEmptyTheList(List*plist)
while(*plist!
psave=(*plist)->
/*saveaddressofnextnode*/
free(*plist);
/*freecurrentnode*/
*plist=psave;
/*advancetonextnode*/
/*copiesanitemintoanode*/
staticvoidCopyToNode(constItemitem,Node*pnode)
pnode->
item=item;
/*structurecopy*/
/*displayanodedata*/
staticvoiddisplayTheNOde(constNode*pnode)
%d"
pnode->
item);
/*Todeterminethenode*/
staticboolItemIsEqu(constItemItem,constNode*pnode)
returnItem==pnode->
item?
true:
false;
5.编程实现判断一个链表是否是递增的
假设链表无头结点.若链表为空默认为递增。
思路之前结点的数据与之后的数据依次比较
boollistItemIsIncrease(List*plist)
Node*preptr=*plist;
Node*curptr=NULL;
if(NULL==*plist)
returntrue;
curptr=preptr->
while(curptr!
if(preptr->
item>
curptr->
item)/*如果是严格递增,则判断用>
=*/
break;
preptr=curptr;
curptr=curptr->
return(curptr==NULL)?
6.编程实现删除链表中的重复节点
假设链表无头结点,挨个遍历链表数据,与之后的结点依次比较,发现重复的就删除
voiddelRepeatedNodeOnce(List*plist)
Node*p=*plist,*q,*u,*y;
while(p)
q=p->
u=p;
while(q)
if(q->
item==p->
item)
u->
next=q->
y=q;
q=q->
free(y);
else
u=q;
p=p->
7.只遍历一次链表,实现链表的倒序
假设链表无头节点,链表头插入,直到遍历到链表末尾
typedefN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 笔试 答案