#include<stdlib.h>
#include<stdio.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
typedef int InfoType;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
InfoType *info;
}ArcNode;
typedef struct VNode
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
//返回顶点v在图顶点向量中的位置
int LocateVex(ALGraph G,char v)
{ int i;
for(int i=0;v!=G.vertices[i].data&&i<G.vexnum;++i);
if(i>=G.vexnum)
return -1;
return i;
}
//建立有向图连接链表
void creatDG(ALGraph &G)
{
int i,j;
char v1,v2;
ArcNode *s;
printf("输入有向图的顶点数:");
scanf("%d",&G.vexnum);
printf("输入有向图的边数:");
scanf("%d",&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
printf("输入第%d的顶点的信息:",i+1);
scanf("%s",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
for(int i1=0;i1<G.arcnum;i1++)//该弧所指的顶点的位置
{
printf("输入第%d条边的弧尾顶点:",i1+1);
scanf("%s",&v1);
printf("输入第%d条边的弧头顶点:",i1+1);
scanf("%s",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
s=(ArcNode *)malloc(sizeof(ArcNode));
s->adjvex=j;//弧所指的顶点的位置为j
s->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=s;
}
}
//从第v个顶点出发,递归的深度优先遍历有向图 G
void DFS(ALGraph G,int v,int *visited)
{
int w;
ArcNode *s;
visited[v]=1;
printf("%c->",G.vertices[v].data);
s=(ArcNode *)malloc(sizeof(ArcNode));
s=G.vertices[v].firstarc;
while(s!=NULL)
{
w=s->adjvex;
if(visited[w]==0)
DFS(G,w,visited);
s=s->nextarc;
}
}
//对图做深度优先遍历
void DFSTraverse(ALGraph G)
{
int v;
int visited[MAX_VERTEX_NUM];
for(v=0;v<G.vexnum;++v)
visited[v]=0;//初始化
for(v=0;v<G.vexnum;++v)
if(visited[v]==0)
DFS(G,v,visited);//对未访问的顶点调用DFS()
printf("完成\n");
}
//输出邻接表
void printAdjList(ALGraph G)
{
int i;
ArcNode *p;
printf("%4s%6s%12s\n","编号","顶点","相邻边编号");
for(i=0;i<G.vexnum;i++)
{
printf("%4d%5c",i,G.vertices[i].data);
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
printf("%3d",p->adjvex);//弧所指的顶点的位置
printf("\n");
}
}
int main(){
ALGraph G;
creatDG(G);//调用有向图创建函数CreateDG()
printf("有向图的邻接表为;\n");
printAdjList(G);
printf("深度优先遍历该有向图:\n");
DFSTraverse(G);//调用图的深度优先函数DFSTraverse()
}
#include<stdio.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
typedef int InfoType;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
InfoType *info;
}ArcNode;
typedef struct VNode
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
//返回顶点v在图顶点向量中的位置
int LocateVex(ALGraph G,char v)
{ int i;
for(int i=0;v!=G.vertices[i].data&&i<G.vexnum;++i);
if(i>=G.vexnum)
return -1;
return i;
}
//建立有向图连接链表
void creatDG(ALGraph &G)
{
int i,j;
char v1,v2;
ArcNode *s;
printf("输入有向图的顶点数:");
scanf("%d",&G.vexnum);
printf("输入有向图的边数:");
scanf("%d",&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
printf("输入第%d的顶点的信息:",i+1);
scanf("%s",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
for(int i1=0;i1<G.arcnum;i1++)//该弧所指的顶点的位置
{
printf("输入第%d条边的弧尾顶点:",i1+1);
scanf("%s",&v1);
printf("输入第%d条边的弧头顶点:",i1+1);
scanf("%s",&v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
s=(ArcNode *)malloc(sizeof(ArcNode));
s->adjvex=j;//弧所指的顶点的位置为j
s->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=s;
}
}
//从第v个顶点出发,递归的深度优先遍历有向图 G
void DFS(ALGraph G,int v,int *visited)
{
int w;
ArcNode *s;
visited[v]=1;
printf("%c->",G.vertices[v].data);
s=(ArcNode *)malloc(sizeof(ArcNode));
s=G.vertices[v].firstarc;
while(s!=NULL)
{
w=s->adjvex;
if(visited[w]==0)
DFS(G,w,visited);
s=s->nextarc;
}
}
//对图做深度优先遍历
void DFSTraverse(ALGraph G)
{
int v;
int visited[MAX_VERTEX_NUM];
for(v=0;v<G.vexnum;++v)
visited[v]=0;//初始化
for(v=0;v<G.vexnum;++v)
if(visited[v]==0)
DFS(G,v,visited);//对未访问的顶点调用DFS()
printf("完成\n");
}
//输出邻接表
void printAdjList(ALGraph G)
{
int i;
ArcNode *p;
printf("%4s%6s%12s\n","编号","顶点","相邻边编号");
for(i=0;i<G.vexnum;i++)
{
printf("%4d%5c",i,G.vertices[i].data);
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
printf("%3d",p->adjvex);//弧所指的顶点的位置
printf("\n");
}
}
int main(){
ALGraph G;
creatDG(G);//调用有向图创建函数CreateDG()
printf("有向图的邻接表为;\n");
printAdjList(G);
printf("深度优先遍历该有向图:\n");
DFSTraverse(G);//调用图的深度优先函数DFSTraverse()
}