If(!
visited[v])
{
Visited[v]=TRUE; visit(v);
EnQueue(Q,v);
While(!
QueueEmpty(Q))
{
DeQueue(Q,u);
For(w=FirstAdjVex(G,u);w;w=NextAdjVex(G,u,w))
If(!
Visted[w])
{
Visited[w]=TRUE; visit(w);
EnQueue(Q,W);
}
}
}
}
七.
(1)2*h
(2)a[h]=a[j](3)a[h]=temp
(4)n/2(5)n(6)HeapAdjust(a,1,i-1)
4试卷参考答案
一.填空题
1.O(nlogn)2.18.43.EDCBA4.求解最小生成树5、2n-1
6、旋转7、p28、p!
=NULL; p=p->lchild; p=p->rchild;
二.解答:
3. 1)if((Q.rear+1)%maxqsize==Q.front)队列满
2)if((q.rear==q.front)and(q.flag==1)队列满
5.堆为:
(12,38,25,50,76,66,49,98)
四.解答:
intpartition(SqList&L,intlow,inthigh)
{ L.r[0]=L.r[low];
Pivotkey=L.r[low].key;
while(low {
while(low=pivotkey) --high;
L.r[low]=L.r[high];
while(low L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
}
Voidqsort(sqlist&L,intlow,inthigh)
{ if(low pivotloc=partition(L,low,high);
qsort(L,low,pivotloc-1);
qsort(L,pivotloc+1,high);
}
}
Voidquicksort(sqlist&L)
{
qsort(L,1,L.length);
}
五.解答:
intcomputbal(BiTreebt)
{
inthl,hr,max;
if(bt==NULL) return(0);
else{
hl=computbal(bt->LChild);/*求左子树的深度*/
hr=computbal(bt->RChild);/*求右子树的深度*/
bt->bal=hl-hr;/*求出平衡因子*/
max=hl>hr?
hl:
hr;/*得到左、右子树深度较大者*/
return(max+1);/*返回树的深度*/
}
}
六.解答:
Statustopologicalsort(ALGraphG)
{
findInDegree(G,indegree);
initstack(s);
for(i=0;i if(!
indegree[i]) push(s,i);
count=0;
while(!
srtackempty(s))
{
pop(s,i);
printf(I,G.vertices[i].data);
++count;
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
{
k=p->adjvex;
if(!
(--indegree[k])) push(s,k);
}
}
if(count else returnok;
}
七.解答:
顺序栈类型定义:
Typedefstruct
{ selemtype*base;
selemtype*top;
int stacksize;
}sqstack;
循环队列的类型定义:
Typedefstruct
{
Qelemtype*base;
int front;
int rear;
}squeue;
二叉链表的类型定义
TypedfstructBitNode
{
TElemType data;
StructBitNode *lchild,*rchild;
}BitNode,*BitTree;
邻接表类型定义:
#defineMAX_VERTEX_NUM 20
Typedefstructarcnode
{
intadjvex;
structarcnode *nextarc;
infotype *info;
}arcnode;
Typedefstrcutvnode
{
vertextype data;
arcnode *firstarc;
}vnode,adjlist[MAX_VERTEX_NUM];
Typedefstruct
{
Adjlist vertices;
int vexnum,arcnum;
int kind;
}algraph;
5试卷参考答案
一、填空题
1.随机存取数据方便2.1003.EDCBA4.插入5.(rear-qulen+m+1)%(m+1)
6.m+n-17.P29.O(log10n)10.52
二、
Prim算法:
假设N=(V,{E})是连通网,TE是N的最小生成树的边的集合。
算法从U={u0}(u0∈V),TE={}开始,重复执行下述操作:
在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直到U=V为止。
此时TE中有n-1条边,则T=(V,{TE})为N的最小生成树。
时间复杂度为O(n2),与边数无关,适合于求边稠密的网的最小生成树。
Kruskal算法从另一个途径求网的最小生成树。
假设N=(V,{E})是连通网,则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。
在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将该边加入到T中,否则舍去此边而选择下一条代价最小的边。
依此类推,直到T中所有顶点都在同一个连通分量上为止。
时间复杂度为O(eloge),与边数有关,适合于求边稀疏的网的最小生成树。
三、
四.快速排序不稳定。
例如:
35531排序后结果:
13355
五.
//统计字符串s中t的个数
#include
#include
//子串定位
intFindSubString(chars[],chart[],intpos)
{
inti=pos,j=0;
intslen=strlen(s);
inttlen=strlen(t);
while(i{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==tlen)
returni-j;
elsereturn-1;
}
//主程序
voidmain()
{
char*s="abcdbcdefgbcdabcd";
char*t="bcd";
intpos=0;
intcnt