数据结构邻接矩阵邻接表图实验报告Word格式.docx
《数据结构邻接矩阵邻接表图实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构邻接矩阵邻接表图实验报告Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
if(v==G.vexs[i])
returni;
}
if(i=G.vexnum)
printf("
输入的顶点不合法\n"
);
return0;
}
VertexTypev1,v2;
VRTypew;
voidCreateUDG(MGraph&
G)
inti,j,k;
printf("
请输入顶点数:
\n"
scanf("
%d"
&
G.vexnum);
请输入弧数:
G.arcnum);
i=0;
while(i<
G.vexnum)
请输入第%d个顶点\n"
i);
getchar();
scanf("
%c"
G.vexs[i]);
++i;
for(i=0;
for(j=0;
j<
++j)
G.arcs[i][j].adj=0;
for(k=0;
k<
G.arcnum;
++k)
请输入一条边依附的顶点及权值(v1v2w)\n"
%c%c%d"
v1,&
v2,&
w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[j][i]=G.arcs[i][j];
return;
voidDFSTraverse(MGraph&
G,inti)
%c"
G.vexs[i]);
Visit[i]=true;
for(intj=0;
j++)
if(G.arcs[i][j].adj==1&
&
!
Visit[j])
{
DFSTraverse(G,j);
}
voidDFS(MGraph&
inti;
i++)Visit[i]=false;
i++)
if(!
Visit[i])
DFSTraverse(G,i);
voidmain()
MGraphgraph;
CreateUDG(graph);
顶点集合为:
:
"
for(inti=0;
graph.vexnum;
graph.vexs[i]);
\n深度遍历结果是:
DFS(graph);
2.
#include"
stdlib.h"
typedefintInfoType;
typedefVertexTypeQElemType;
boolvisited[MaxVertexNum];
typedefstructArcNode
intadjvex;
//该弧指向的顶点位置
structArcNode*nextarc;
//指向下一条弧的指针
InfoType*info;
}ArcNode;
typedefstructVNode
VertexTypedata;
//顶点信息
ArcNode*firstarc;
//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MaxVertexNum];
typedefstruct
AdjListvertices;
}ALGraph;
typedefstructQNode
QElemTypedata;
structQNode*next;
}QNode,*Queueptr;
Queueptrfront;
Queueptrrear;
}LinkQueue;
voidInitQueue(LinkQueue&
Q)
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
if(!
Q.front)return;
Q.front->
next=NULL;
voidEnQueue(LinkQueue&
Q,QElemTypee)
Queueptrp=NULL;
p=(Queueptr)malloc(sizeof(QNode));
p)return;
p->
data=e;
Q.rear->
next=p;
Q.rear=p;
QElemTypeDeQueue(LinkQueue&
Q,QElemType&
e)
Queueptrp;
if(Q.front==Q.rear)return'
'
;
p=Q.front->
next;
e=p->
data;
next=p->
if(Q.rear==p)
Q.rear=Q.front;
free(p);
returne;
intQueueEmpty(LinkQueueQ)
if(Q.front==Q.rear)
return1;
else
return0;
intLocate(ALGraphG,VertexTypev)
for(intk=0;
if(v==G.vertices[k].data)
returnk;
if(k=G.vexnum)
voidCreateALGraph(ALGraph&
VertexTypev1,v2;
ArcNode*p,*r;
请输入顶点数和弧数(以空格分开):
"
%d%d"
G.vexnum,&
请输入第%d个结点:
G.vertices[i].data);
G.vertices[i].firstarc=NULL;
请输入第%d条弧(格式:
顶点顶点(以空格隔开)):
%c%c"
v2);
k=Locate(G,v1);
j=Locate(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
r=(ArcNode*)malloc(sizeof(ArcNode));
p->
adjvex=j;
info=NULL;
r->
adjvex=k;
nextarc=G.vertices[k].firstarc;
G.vertices[k].firstarc=p;
nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=r;
voidBFSTraverse(ALGraphG,QElemTypex)
inti,v;
ArcNode*p;
QElemTypev1;
for(v=0;
v<
++v)
visited[v]=false;
LinkQueueQ;
InitQueue(Q);
EnQueue(Q,x);
i=Locate(G,x);
visited[i]=true;
while(!
QueueEmpty(Q))
DeQueue(Q,v1);
printf("
v1);
i=Locate(G,v1);
p=G.vertices[i].firstarc;
while(p!
=NULL)
{
if(!
visited[p->
adjvex])
{
visited[p->
adjvex]=true;
EnQueue(Q,G.vertices[p->
adjvex].data);
}
p=p->
nextarc;
}
visited[v])
visited[v]=true;
EnQueue(Q,G.vertices[v].data);
charflag1;
ALGraphgraph2;
QElemTypex;
CreateALGraph(graph2);
flag1='
Y'
while(flag1=='
||flag1=='
y'
)
请输入遍历的起点:
x);
广度遍历结果是:
BFSTraverse(graph2,x);
\n继续遍历(Y/N):
flag1);
3.
#defineStackInitSize20
#defineStackIncrement5
typedefVertexTypeSElemType;
typedefstruct
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
typedefstructArcNode
intindegree;
boolInitStack(SqStack&
s)
s.base=(SElemType*)malloc(StackInitSize*sizeof(SElemType));
s.base)returnfalse;
s.top=s.base;
s.stacksize=StackInitSize;
returntrue;
boolPop(SqStack&
s,int&
if(s.top==s.base)
returnfalse;
e=*--s.top;
boolPush(SqStack&
s,inte)
if(s.top-s.base>
=s.stacksize)
s.base=(SElemType*)realloc(s.base,(s.stacksize+StackIncrement)*sizeof(SElemType));
s.base)
returnfalse;
s.top=s.base+s.stacksize;
s.stacksize+=StackIncrement;
*s.top++=e;
boolStackEmpty(SqStacks)
if(s.top==s.base)
returntrue;
else
}
G)//邻接表存储
G.vertices[i].indegree=0;
请输入第%d条有向弧弧(格式:
voidFindInDegree(ALGraphG,inta[MaxVertexNum])
inti,k;
for(p=G.vertices[i].firstarc;
p;
p=p->
nextarc)
k=p->
adjvex;
a[k]=++G.vertices[k].indegree;
voidTopologicalSort(ALGraphG)//拓扑排序算法
inti,j,count;
SqStacks;
intindegree[MaxVertexNum];
MaxVertexNum;
indegree[i]=0;
FindInDegree(G,indegree);
InitStack(s);
indegree[i])
Push(s,i);
count=0;
while(!
StackEmpty(s))
Pop(s,i);
G.vertices[i].data);
++count;
j=p->
if(!
(--indegree[j]))Push(s,j);
if(count<
错误!
该有向图有回路!
elsereturn;
ALGraphgraph3;
CreateALGraph(graph3);
拓扑排序的结果是:
TopologicalSort(graph3);