图的算法2Word格式.docx
《图的算法2Word格式.docx》由会员分享,可在线阅读,更多相关《图的算法2Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
structSLNode*Next;
}slnodetype;
slnodetype*Head;
slnodetype*Rear;
}qqtype;
intInitiateQQueue(qqtype*q)
if((q->
Head=(slnodetype*)malloc(sizeof(slnodetype)))==NULL)
{
printf("
\n申请空间失败!
"
);
return0;
}
q->
Rear=q->
Head;
Head->
Next=NULL;
return1;
}
intAppendQQueue(qqtype*q,elemtypex)//进队列操作。
slnodetype*p;
if((p=(slnodetype*)malloc(sizeof(slnodetype)))==NULL)
p->
Data=x;
Rear->
Next=p;
Rear=p;
elemtypeDeleteQQueue(qqtype*q)//出队列操作算法。
elemtypex;
if(q->
Next==NULL)
Next==q->
Rear)
{q->
p=q->
Next;
x=p->
Data;
else{p=q->
Next=p->
x=p->
free(p);
returnx;
intNotEmtyQQueue(qqtype*q)
Rear==q->
Head)return0;
elsereturn1;
intLocVertex(adjlisttypeGraph,intv)
intk;
for(k=0;
k<
MAXNNODE;
k++)//有些不合理。
if(Graph[k].Vertex==v)
return(k);
return0;
intFirstVertex(adjlisttypeGraph,intv)//求图中顶点v的第一条相邻的无向边的顶点。
arctype*p;
v=LocVertex(Graph,v);
p=Graph[v].FirstArc;
if(p==NULL)return-1;
else
return(Graph[p->
AdjVertex].Vertex);
intNextVertex(adjlisttypeGraph,intv,intw)//求图的顶点v相邻顶点w的下一个相邻无向边。
while(p!
=NULL&
&
Graph[p->
AdjVertex].Vertex!
=w)
p=p->
NextArc;
if(p->
NextArc==NULL||p==NULL)
printf("
参数出错!
\n"
return(-1);
p=p->
voidDeleteArc(adjlisttypeGraph,intv,intw)//删除无向图v与w的边。
arctype*r1,*r2;
w=LocVertex(Graph,w);
r1=Graph[v].FirstArc;
//在v中删除w结点。
r2=r1;
while(r1!
r1->
AdjVertex!
=w)
{
r1=r1->
if(r1==NULL)
\n无此边"
return;
elseif(r1==r2)
Graph[v].FirstArc=r1->
free(r1);
}
else
r2->
NextArc=r1->
free(r1);
r1=Graph[w].FirstArc;
//在w中删除v结点。
=v)
Graph[w].FirstArc=r1->
voidBFSearch(adjlisttypeGraph,intk,intVisited[])
arctype*p;
qqtypea,*QQueue=&
a;
intw;
InitiateQQueue(QQueue);
Visited[k]=1;
%d"
Graph[k].Vertex);
AppendQQueue(QQueue,k);
while(NotEmtyQQueue(QQueue)==1)
w=DeleteQQueue(QQueue);
p=Graph[w].FirstArc;
while(p!
=NULL)
{if(Visited[p->
AdjVertex]==0)
{
Visited[p->
AdjVertex]=1;
printf("
Graph[p->
AppendQQueue(QQueue,p->
AdjVertex);
}
p=p->
}
voidTrave(adjlisttypeGraph,intn)
inti,Visited[MAXNNODE];
for(i=0;
i<
n;
i++)
Visited[i]=0;
//printf("
1111"
for(i=0;
if(Visited[i]==0)BFSearch(Graph,i,Visited);
2222"
voidmain()
inti,j,n,e,k;
intv1,v2,v,w;
arctype*p,*q;
adjlisttypeGraph;
输入图中顶点的个数n:
scanf("
%d"
&
n);
输入图中顶点的边数e:
e);
输入顶点的数据:
for(k=0;
k++)
Graph[k].Vertex);
Graph[k].FirstArc=NULL;
//Graph[k].FirstArc->
NextArc=NULL;
\n输入图中各边:
//输入各边并将相应的边结点插入到链表中
e;
%d%d"
v1,&
v2);
//注意是这样输入,如:
13。
i=LocVertex(Graph,v1);
j=LocVertex(Graph,v2);
q=(arctype*)malloc(sizeof(arctype));
AdjVertex=j;
NextArc=Graph[i].FirstArc;
Graph[i].FirstArc=q;
p=(arctype*)malloc(sizeof(arctype));
AdjVertex=i;
NextArc=Graph[j].FirstArc;
Graph[j].FirstArc=p;
\n图的邻接表结构为:
Graph[%d]."
i);
v1=Graph[i].Vertex;
Vertex%d:
v1);
p=Graph[i].FirstArc;
while(p!
v2=p->
AdjVertex;
-->
v2);
输出广度优先搜索结果:
Trave(Graph,n);