主题:关于图的建立和深度遍历的问题
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX 30
#define NULL 0
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
char data;
ArcNode *firstarc;
}VNode,Graph[MAX];
//typedef AdjList Graph;
int n;
int visted[MAX];
int getid(Graph G,char c)
{
int i;
for(i=0;i<n;i++)
if(G[i].data==c)
return(i);
}
void creatGraph(Graph &G)
{
char q,b;
ArcNode *p;
int i,j,k,m;
printf("请输入结点的个数和边的个数:\n");
scanf("%d%d",&n,&j);
for(i=0;i<n;i++)
{
printf("请输入第%d个结点的信息:\n",i+1);
scanf("%c",&G[i].data);
G[i].firstarc=NULL;
}
printf("输入边的顶点对:\n");
for(i=0;i<j;i++)
{
printf("请输入第%d边的顶点对次序为弧尾和弧头:\n",i+1);
scanf("%c%c",&q,&b);
k=getid(G,q);
m=getid(G,b);
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=m;
p->nextarc=G[k].firstarc;
G[k].firstarc=p;
}
}
/*int FirstAdjvex(Graph G,int v)
{
ArcNode *p;
p=G[v].firstarc;
if(p)
return(p->adjvex);
else
return(-1);
}
int NextAdjvex(Graph G,int v,int w)
{
ArcNode *p;
p=G[v].firstarc;
while(p&&p->adjvex!=w)
p=p->nextarc;
if(p->nextarc==NULL)
return(-1);
else
{
p=p->nextarc;
return(p->adjvex);
}
}
void biaoji()
{
int i=0;
for(i=0;i<n;i++)
visted[i]=0;
}
void DFS(Graph G,int v)
{
int w;
printf("%5c",G[v].data);
visted[v]=1;
for(w=FirstAdjvex(G,v);w>=0;w=NextAdjvex(G,v,w))
if(!visted[w])
DFS(G,w);
}*/
void main()
{
ArcNode *p;
int i;
Graph G;
creatGraph(G);
/*biaoji();
printf("图优先搜索的遍历如下:\n");
DFS(G,0);
printf("\n");*/
printf("邻接表的结构如下:\n");
for(i=0;i<n;i++)
{
printf("%5c",G[i].data);
p=G[i].firstarc;
while(p)
{
printf("-->%5c",G[p->adjvex].data);
p=p->nextarc;
}
printf("\n");
}
}
我先写的是建立图并深度遍历的算法但是完全是不能输出!于是就把那几个深度遍历的函数注释掉.输出邻接表也得不到结果!而且我输入结点时每输入一个就输入两行"如请输入第一个结点:请输入第二个结点"只能输入你给定结点个数的一半.输入弧时也是这个问题!望高手帮忙看下!!!
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX 30
#define NULL 0
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
char data;
ArcNode *firstarc;
}VNode,Graph[MAX];
//typedef AdjList Graph;
int n;
int visted[MAX];
int getid(Graph G,char c)
{
int i;
for(i=0;i<n;i++)
if(G[i].data==c)
return(i);
}
void creatGraph(Graph &G)
{
char q,b;
ArcNode *p;
int i,j,k,m;
printf("请输入结点的个数和边的个数:\n");
scanf("%d%d",&n,&j);
for(i=0;i<n;i++)
{
printf("请输入第%d个结点的信息:\n",i+1);
scanf("%c",&G[i].data);
G[i].firstarc=NULL;
}
printf("输入边的顶点对:\n");
for(i=0;i<j;i++)
{
printf("请输入第%d边的顶点对次序为弧尾和弧头:\n",i+1);
scanf("%c%c",&q,&b);
k=getid(G,q);
m=getid(G,b);
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=m;
p->nextarc=G[k].firstarc;
G[k].firstarc=p;
}
}
/*int FirstAdjvex(Graph G,int v)
{
ArcNode *p;
p=G[v].firstarc;
if(p)
return(p->adjvex);
else
return(-1);
}
int NextAdjvex(Graph G,int v,int w)
{
ArcNode *p;
p=G[v].firstarc;
while(p&&p->adjvex!=w)
p=p->nextarc;
if(p->nextarc==NULL)
return(-1);
else
{
p=p->nextarc;
return(p->adjvex);
}
}
void biaoji()
{
int i=0;
for(i=0;i<n;i++)
visted[i]=0;
}
void DFS(Graph G,int v)
{
int w;
printf("%5c",G[v].data);
visted[v]=1;
for(w=FirstAdjvex(G,v);w>=0;w=NextAdjvex(G,v,w))
if(!visted[w])
DFS(G,w);
}*/
void main()
{
ArcNode *p;
int i;
Graph G;
creatGraph(G);
/*biaoji();
printf("图优先搜索的遍历如下:\n");
DFS(G,0);
printf("\n");*/
printf("邻接表的结构如下:\n");
for(i=0;i<n;i++)
{
printf("%5c",G[i].data);
p=G[i].firstarc;
while(p)
{
printf("-->%5c",G[p->adjvex].data);
p=p->nextarc;
}
printf("\n");
}
}
我先写的是建立图并深度遍历的算法但是完全是不能输出!于是就把那几个深度遍历的函数注释掉.输出邻接表也得不到结果!而且我输入结点时每输入一个就输入两行"如请输入第一个结点:请输入第二个结点"只能输入你给定结点个数的一半.输入弧时也是这个问题!望高手帮忙看下!!!