Description 实现图的邻接表存储结构及一些基本操作函数。在此基础上实现图的深度遍历算法并加以测试。本题只给出部分代码,请补全内容。
#include"string.h"
#include"malloc.h"
#include"stdio.h"
#include"stdlib.h"
typedef int InfoType;
#define MAX_NAME 3
typedef char VertexType[MAX_NAME];
#define MAX_VERTEX_NUM 20
typedef enum{DG,DN,AG,AN}GraphKind;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
InfoType *info;
}ArcNode;
typedef struct
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
int kind;
}ALGraph;
int LocateVex(ALGraph G,VertexType u)
{
int i;
for(i=0;i<G.vexnum;++i)
if(strcmp(u,G.vertices[i].data)==0)
return i;
return -1;
}
void CreateGraph(ALGraph *G)
{
int i,j,k;
int w;
VertexType va,vb;
ArcNode *p;
scanf("%d",&(*G).kind);
scanf("%d%d",&(*G).vexnum,&(*G).arcnum);
for(i=0;i<(*G).vexnum;++i)
{
scanf("%s",(*G).vertices[i].data);
(*G).vertices[i].firstarc=NULL;
}
for(k=0;k<(*G).arcnum;++k)
{
if((*G).kind==1||(*G).kind==3)
scanf("%d%s%s",&w,va,vb);
else
scanf("%s%s",va,vb);
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
if((*G).kind==1||(*G).kind==3)
{
p->info=(int *)malloc(sizeof(int));
*(p->info)=w;
}
else
p->info=NULL;
p->nextarc=(*G).vertices[i].firstarc;
(*G).vertices[i].firstarc=p;
if((*G).kind>=2)
{
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=i;
if((*G).kind==3)
{
p->info=(int*)malloc(sizeof(int));
*(p->info)=w;
}
else
p->info=NULL;
p->nextarc=(*G).vertices[j].firstarc;
(*G).vertices[j].firstarc=p;
}
}
}
VertexType* GetVex(ALGraph G,int v)
{
if(v>=G.vexnum||v<0)
exit(0);
return &G.vertices[v].data;
}
int FirstAdjVex(ALGraph G,VertexType v)
{
ArcNode *p;
int v1;
v1=LocateVex(G,v);
p=G.vertices[v1].firstarc;
if(p)
return p->adjvex;
else
return -1;
}
int NextAdjVex(ALGraph G,VertexType v,VertexType w)
{
ArcNode *p;
int v1,w1;
v1=LocateVex(G,v);
w1=LocateVex(G,w);
p=G.vertices[v1].firstarc;
while(p&&p->adjvex!=w1)
p=p->nextarc;
if(!p||!p->nextarc)
return -1;
else
return p->nextarc->adjvex;
}
int visited[MAX_VERTEX_NUM];
void(*VisitFunc)(char* v);
void DFS(ALGraph G,int v)
{
}
void DFSTraverse(ALGraph G)
{
printf("\n");
}
void print(char *i)
{
printf("%s ",i);
}
int main()
{
ALGraph g;
CreateGraph(&g);
DFSTraverse(g);
return 1;
}
输入格式
第一行:输入0到3之间整数(有向图:0,有向网:1,无向图:2,无向网:3);
第二行:输入顶点数和边数;
第三行:输入各个顶点的值(字符型,长度〈3);(遍历从输入的第一个顶点开始)
第四行:输入每条弧(边)弧尾和弧头(以空格作为间隔),如果是网还要输入权值;
输出格式
输出对图深度遍历的结果。
输入样例
0
3 3
a b c
a b
b c
c b
输出样例
a b c
#include <iostream>
#include<cstring>
#include<stack>
#include<algorithm>
using namespace std;
char v[10005];
stack<int>e[105];
int visit[10005]={0};
void dd(int x)
{
if(visit[x]==1)
return ;
cout<<v[x]<<' ';
visit[x]=1;
int len=e[x].size();
for(int i=1;i<=len;i++)
{
int t=e[x].top();
e[x].pop();
if(visit[t]==0)
dd(t);
}
}
int main()
{
int i,j,n,m;
int type;
cin>>type;
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>v[i];
for(i=0;i<m;i++)
{
int x=-1,y=-1,w;
char a,b;
if(type==0||type==2)
cin>>a>>b;
else
cin>>a>>b>>w;
for(j=1;j<=n;j++)
{
if(v[j]==a)
x=j;
else if(v[j]==b)
y=j;
if(x!=-1&&y!=-1)
break;
}
if(type<=1)
e[x].push(y);
else
{
e[x].push(y);
e[y].push(x);
}
}
for(i=1;i<=n;i++)
dd(i);
return 0;
}