北京化工大学软件技术基础考试复习重点docWord文档下载推荐.docx
《北京化工大学软件技术基础考试复习重点docWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《北京化工大学软件技术基础考试复习重点docWord文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
![北京化工大学软件技术基础考试复习重点docWord文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/16/719776fe-3485-437d-97bf-1ad454c3fe87/719776fe-3485-437d-97bf-1ad454c3fe871.gif)
7hanoi(n-l,B,A,C);
8}
9}
voidtrial(inti’intn){
/*进入木函数时,在nxn棋盘前已放置了互不攻击的i-1个棋了。
现从第i行起示示续棋了选择合适的位置,当i>
n时,求得合法布局并输出。
*/
if(i>
n)
then输出棋盘的当前布局;
elsefor(j=1;
jv二n;
++j){
在第i行第j列放一个棋了;
if(当前布局合法)trialfi+l,n);
移走第i行第j列的棋子;
}
算法时间复杂度指执行算法所需要的计算工作量。
算法空间复杂度指执行算法所需要的内存空间。
算法评价标准正确性可读性健壮性时间与空间效率
第二章数据结构
线性表定义线性表是由n(n^O)个类型相同的数据元素组成的有限序列。
通常表示成
下列形式:
L=(al,a2,…J其中L为线性表名称,ai为纟ft成该线性表的数据元素;
顺序存储结构
线性表的顺序存储结构是指用一组连续的存储单元依次存储线性表屮的毎个数据元素。
线性表的逻辑结构与存储结构(物理结构)一致;
线性表屮所有元素所占存储空间是连续的线性表屮各元素按逻辑顺序依次存放;
丿帧序线"
性表插入在顺序线性表SL第idx个数据元素之前插入数据元素elem
voidinsert(SeqListSL,intidx,ElemTypeelem){
//检杳是否有剩余空间
if(SL.Iength==MAX_LIST_SIZE)
returnERROR;
//检查idx值是否合法
if(idx<
011idx>
SL.Iength)
//将线性表笫i个元素Z后的所有元素向后移动
for(j=SL.Iength-l;
j>
=idx-l;
j--)
SL.elems[j+l]=SL.elemsU];
//将新元素的内容放入线性表的第i个位置,
SL.elems[idx-l]=elem;
SL.Iength++;
顺序线性表删除删除顺序线性表第idx个数据元素
ElemTypedelete(SeqListSL,intidx){//检测线性表是否为空if(isEmpty(SL))returnERROR;
//检查idx值是否合法if(idx<
011i>
=SL.Iength)
//将欲删除的数据元素内容保存在变量elem屮
ElemTypeelem=SL.elems[i-l];
//将线性表第i+1个元索ZfJ的所有元索向前移动for(j=i;
j<
SL」ength;
j++)
SL.elems[j-l]=SL.elems[j];
SL.Iength-;
returnelem;
链式存储结构链式存储结构指用一-组任意的存储单元(可以连续,也可以不连续)存储
线性表屮的数据元素,而数据元素Z间的逻辑关系由存储结点的指针域来确定。
线性表屮的数据元素在存储单元屮的存放顺序与逻辑顺序不一定一致;
访问数据元素时,只能由头指针进入链表,并通过结点的指针域向后扫描其余结点
链式线性表插入在链表LL屮第idx个数据元素之前插入数据元素elemintinsert(LinkedListLL,intidx,ElemTypeelem){
linode*p,s;
intj;
//开辟新结点空间
s=(llnode*)malloc(sizeof(llnode));
讦(s==NULL)returnERROR;
s->
data=elem;
length(LL))returnERROR;
//寻找第i-1个结点
for(p=LL.headj=O;
p&
&
i-l;
p=p->
next;
j++);
//W新结点插入到链表中sonext=p->
p・>
next=s;
returnOK;
ElemTypedelete(LinkedListLL,intidx){
intj;
//寻找第i-1个结点for(p=LL.headj=0;
p&
j<
idx-l;
nextj++);
〃用s指向将要删除的结点s=p->
next;
ElemTypeelem=s->
data;
p・>
next=s->
free(s);
栈定乂栈是一种特殊的线性表,即LIFO线性表(LastInFirstOut,示进先出)。
栈的特点在于限泄插入和删除数据元索的操作只能在线性表的一端进行
顺序栈基本操作
入栈
voidpush(SeqStackSS,ElemTypeelem){if(SS.top==MAX_STACK_SIZE-l)ERROR("
TheStackisfull"
);
elseSS.elems[++SS.top]=elem;
出栈
ElemTypepop(SeqStackSS){if(isEmpty(SS))
ERROR("
Stackisempty"
else
returnSS.elems[SS.top-];
栈的链式存储结构
入栈voidpush(LinkedStackLS,ELemTypeelem){
p=(lsnode*)malloc(sizeof(lsnode));
if(!
p)
ERROR(,zOverflow"
else{
p->
p-〉next=LS.top;
IS.top=p;
ElemTypepop(LinkedStackLS){
if(isEmpty(LS))
ERROR(/zStackisempty"
ElemTypeelem=LS.top->
p=LS.top;
LS.top=p->
free(p);
队歹!
J定义队列也是一种特殊的线性表,即FIFO线性表(FirstInFirstOut,先进先出)
队列特殊性在于限定插入操作在线性表的一端进行,而删除操作在线性表的另一端;
插入端和删除端都是浮动的。
通常我们将插入端称为队尾,用一个“队尾指针”指示;
而删除端称为队头,用一个“队头指针”指示;
队列顺序存储
入对操作
voidenQueue(SeqQueueSQ,ElemTYpeelem){
讦((SQ.rear+l)%MAX_QUEUE_SIZE==SQ.front)
ERROR(/zOverfloww);
SQ.rear=(SQ.rear+l)%MAX_QUEUE_SIZE;
SQ.elems[SQ.rear]=elem;
出对操作
ElemTypedeQueue(SeqQueueSQ){
if(isEmpty(SQ))
Queueisempty"
SQ.front=(Q.front+l)%MAX_QUEUE_SIZE
returnSQ.elems[SQ.front];
队列的链式存储
voidenQueue(LinkedQueueLQ,ElemTypeelem){
s=(lqnode*)malloc(sizeof(lqnode));
ERROR;
next=NULL;
LQ.rear->
next=s;
LQ.rear二s;
ElemTypedeQueue(LinkedQueueLQ){
if(isEmpty(LQ))
ElemTypeelem=LQ.front・>
next->
s=LQ.front・>
LQ.front・>
next=s-〉next;
二叉树二叉树是另一种树形结构。
二叉树与树形结构的区别:
每个结点最多有两棵了树;
了树有左右之分;
满二叉树如果一个深度为K的二叉树拥有2K-1个结点,则将它称为满二叉树。
完全二叉树有一棵深度为h,具有n个结点的二叉树,若将它与一棵同深度的满二叉树屮的所有结点按从上到下,从左到右的顺序分别进行编号,且该二叉树屮的每个结点分别与满二叉树屮编号为的结点位置一一对应,则称这棵二叉树为完全二叉树。
二叉树基本性质
性质一在二叉树的笫i层上至多有个结点
性质二深度为k的二叉树至多有/一1个结点(k^l).
性质三对于任意一棵二叉树BT,如果度为0的结点个数为nO,度为2的结点个数为n2则有n0=n2+l.
性质四具有n个结点的完全二叉树的深度为Llog2nJ+lo其中,llog2nJ的结果是不大TLlog2nJ的最大整数。
性质五对于有n个结点的完全二叉树屮的所有结点按从上到下,从左到右的顺序进行编号,则对任意一个结点i(lWiWn),都有:
o如果i=l,则结点i是这棵完全二叉树的根,没有双亲;
否则其双亲结点的编号为li/2_l;
。
如果2i>
n,则结点i没有左孩了;
否则其左孩了结点的编号为2i;
o如果2i+l>
n,则结点i没有右孩了;
否则其右孩结点的编号为2i+l;
图定义图是一个二元组<
V,E>
o其屮V是顶点的有•穷非空集合,E是两个顶点关系的集合
基木概念
完全图具有n(n・l)条弧的有向图称作有向完全图;
具有n(n-l)/2条边的无向图称作无向完全图;
路径长度路径上边或弧的数目;
简单路径顶点没有重复出现的路径;
创建有向图邻接表
voidcreateGraph(AdjListadj,intn){//初始化顶点数组
for(i=0;
ivn;
i++){
seanf(&
adj[i].adjvex);
adj[i].firstarc=NULL;
}〃输入弧
scanf(&
i”&
j);
while(i){
s=(edgenode*)malloc(sizeof(edgenode));
//创建新的弧结点
adgvex=j
nextarc=adj[i-l].firstarc;
//将新的弧结点插入到相应的位置
adj[i-l].firstarc=s;
//输入下一条弧