求问C语言大神,为什么我这个无向图建立出来有问题,哪位大神帮我调试一下,感激不尽!!!!!!!

#include<stdio.h>
typedef char VertexType ;
typedef int EdgeType ;
typedef int Boolean ;
#define TRUE 1
#define FALSE 0
#define MAXVEX 100
#define INFINITY 65535
typedef struct{
VertexType vexs[MAXVEX] ;
EdgeType arc[MAXVEX][MAXVEX] ;
int numVertexes , numEdges ;
}MGraph ;

Boolean visited[MAXVEX] ;
//函数声明
void CreateGraph( MGraph *G );
void DFS( MGraph G , int i );
void DFSTraversal( MGraph G );
//主函数
int main(){
MGraph G ;
CreateGraph( &G ) ;
printf("DFS遍历\n") ;
DFSTraversal( G ) ;
return 0 ;
}
//函数operation
void CreateGraph( MGraph *G ){
int i,j,k,w ;
printf("无向图\n输入顶点数,边数:") ;
scanf("%d,%d",&G->numVertexes,&G->numEdges) ;
for( j = 0 ; j<G->numVertexes ; j++ ){
scanf("%c",&G->vexs[j]) ;
}
for( i = 0 ; i<G->numVertexes ; i++ ){
for( j = 0 ; j < G->numVertexes ; j++){
G->arc[i][j] = INFINITY ;
}
}
printf("输入(vi,vj)及权值w\n") ;
for( k = 0 ; k<G->numEdges ; k++ ){
scanf("%d %d %d",&i,&j,&w) ;
G->arc[i][j] = w ;
G->arc[j][i] = G->arc[i][j] ;
}
}

void DFS( MGraph G , int i ){
int j = 0;
visited[i] = TRUE ;
printf("%c ", G.vexs[i] ) ;
for( j = 0 ; j < G.numVertexes ; j++ ){
if( G.arc[i][j] != INFINITY && !visited[j])
DFS( G , j ) ;
}
}

void DFSTraversal( MGraph G ){
int i ;
for( i = 0; i<G.numVertexes ; i++ ){
visited[i] = FALSE ;
}
for( i = 0; i<G.numVertexes ; i++ ){
if( !visited[i] ){
DFS(G,i) ;
}
}
}
主要就是scanf("%c",&G->vexs[j]) ;这一步读不了数据 不知道为什么???

测试结果:

无向图
输入顶点数,边数(两个数据之间要带逗号):3,2
abc
输入(vi,vj)及权值w
0 1 5
0 2 10
DFS遍历
a b c


#include<stdio.h>
typedef char VertexType ;
typedef int EdgeType ;
typedef int Boolean ;
#define TRUE 1
#define FALSE 0
#define MAXVEX 100
#define INFINITY 65535
typedef struct
{
    VertexType vexs[MAXVEX] ;
    EdgeType arc[MAXVEX][MAXVEX] ;
    int numVertexes , numEdges ;
}MGraph ;

Boolean visited[MAXVEX] ;
//函数声明
void CreateGraph( MGraph *G );
void DFS( MGraph G , int i );
void DFSTraversal( MGraph G );
//主函数
int main()
{
    MGraph G ;
    CreateGraph( &G ) ;
    printf("DFS遍历\n") ;
    DFSTraversal( G ) ;
    return 0 ;
}
//函数operation
void CreateGraph( MGraph *G )
{
    int i,j,k,w ;

    //原代码printf("无向图\n输入顶点数,边数:") ;
    printf("无向图\n输入顶点数,边数(两个数据之间要带逗号):") ;
    scanf("%d,%d",&G->numVertexes,&G->numEdges) ;

    //输入顶点字符的问题:
    //假设顶点数是3,边数是2,顶点字符是abc
    //当j=0, G->vexs[0]错误地吸收了上个语句的回车符'\n'
    //导致G->vexs[0]='\n',G->vexs[1]='a',G->vexs[2]='b',
    //漏掉了字符'c'
    //解决方案1: 增加函数getchar(),用于吸收回车符'\n'
    //解决方案2: 增加函数fflush(stdin),用于清空输入缓存,吸收掉回车符'\n'
    //注意,有的编译器不能识别fflush(stdin)

    fflush(stdin); //解决方案2,用于清空输入缓存,吸收掉回车符'\n'
    for( j = 0 ; j<G->numVertexes ; j++ )
    {
        scanf("%c",&G->vexs[j]) ;
    }

    //解决方案3,先用数组保存输入的字符串
    //char vertStr[MAXVEX];
    //printf("请输入%d个顶点字符: ",G->numVertexes);
    //scanf("%s",vertStr);
    //for( j = 0 ; j<G->numVertexes ; j++ )
    //{
    //    G->vexs[j]=vertStr[j];
    //}

    for( i = 0 ; i<G->numVertexes ; i++ )
    {
        for( j = 0 ; j < G->numVertexes ; j++)
        {
            G->arc[i][j] = INFINITY ;
        }
    }
    printf("输入(vi,vj)及权值w\n") ;
    for( k = 0 ; k<G->numEdges ; k++ )
    {
        scanf("%d %d %d",&i,&j,&w) ;
        G->arc[i][j] = w ;
        G->arc[j][i] = G->arc[i][j] ;
    }
}

void DFS( MGraph G , int i )
{
    int j = 0;
    visited[i] = TRUE ;
    printf("%c ", G.vexs[i] ) ;
    for( j = 0 ; j < G.numVertexes ; j++ )
    {
        if( G.arc[i][j] != INFINITY && !visited[j])
            DFS( G , j ) ;
    }
}

void DFSTraversal( MGraph G )
{
    int i ;
    for( i = 0; i<G.numVertexes ; i++ )
    {
        visited[i] = FALSE ;
    }
    for( i = 0; i<G.numVertexes ; i++ )
    {
        if( !visited[i] )
        {
            DFS(G,i) ;
        }
    }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-07-31
楼主,如果仅仅是读不了数据,那就容易解决,在每个scanf(...)后面都加一个getchar()就可以了。追问

改成%s就可以读了,但是%c理论上也成立,我想知道为什么不行?