c语言实现图的数据结构


#include
#include 
#define MAX_VERT_NUM 10

typedef char VertexData;
typedef enum{
    FG,DN,UDG,UDN
}GraphKind;


typedef struct{
    VertexData vexs[MAX_VERT_NUM];
    int arcs[MAX_VERT_NUM][MAX_VERT_NUM];
    int vexnum,arcnum;
    GraphKind kind; 
}Adjmatrix;



int locateAdjMatrix(Adjmatrix * g,VertexData v){
    int i,j;
    j=-1;
    for(i = 0 ; i < g->vexnum; i++){
        if(g->vexs[i] == v){
            j = i;
            break;    
        }    
    }
    return j; 
        
}






void createAdjMtrix(Adjmatrix *g){
    
    printf("0:DG,1.DN,3:UDG,4.UDN\n");
    scanf("%d",&g->kind);
    printf("定点的数量\n");
    scanf("%d",&g->vexnum); 
    printf("边的数量\n");
    scanf("%d",&g->arcnum); 
    
    int i,j;
    for(i = 0 ; i < g->vexnum ; i++){
        for(j = 0 ; j < g->vexnum ; j++)
        if(i == j){
                g->arcs[i][j] = 0;
        }else{
        g->arcs[i][j] = INT_MAX;
        } 
    }
    
    for(i = 0 ; i < g->vexnum ; i++){
        scanf("%c",&g->vexs[i]);
    }
    
    int k; 
    char c1,c2;
    int w;
    for(k = 0 ; k < g->arcnum ; k++){
        scanf("%c%c%d",&c1,&c2,&w);
        i = locateAdjMatrix(g,c1);
        j = locateAdjMatrix(g,c2);
        if(i != -1 && j != -1){
            g->arcs[i][j] = w;
            if(g->kind == UDN && g->kind == UDG){
                g->arcs[j][i] = w;
            }
        }
    }

}

void dfsAdjmatrix(Adjmatrix * g,VertexData v,int *visited){
    int i = locateAdjMatrix(g,v);
    printf("%c  ",g->vexs[i]);
    visited[i] = 1;
    int  j;
    for(j = 0 ; j < g->vexnum ; j++){
        if(!visited[j] && g->arcs[i][j] != 0 && g->arcs[i][j] != INT_MAX){
            dfsAdjmatrix(g,g->vexs[j],visited);
        }        
    }
}

void efsaAdjmatrix(Adjmatrix * g,VertexData v,int *visited){
    int q[MAX_VERT_NUM];
    int f=-1;
    int r=-1;
    int j;
    int i = locateAdjMatrix(g,v);
    printf("%c  ",g->vexs[i]);
    q[++r] = i;
    while(f!= r){
        i = q[++f];
        for(j = 0 ; j < g->vexnum ; j++){
            if(!visited[j] && g->arcs[i][j] != 0 && g->arcs[i][j] != INT_MAX){
                printf("%c ",g->vexs[j]);
                visited[j] = 1;
                q[++r] = j;
            }
        }
    }
}


//5 5  abcde  ab1ac2bc3ae4ed5
int main(){
    Adjmatrix g;
    createAdjMtrix(&g);
    
    int visited[MAX_VERT_NUM];
    int i;
    for(i = 0 ; i < g.vexnum ; i++){
        visited[i] = 0 ;
    }
    printf("sheng\n");    
    dfsAdjmatrix(&g,'a',visited);
    printf("\n");
    
    for(i = 0 ; i < g.vexnum ; i++){
    visited[i] = 0 ;
    }
    printf("广\n");
    efsaAdjmatrix(&g,'a',visited);
    printf("\n");
    
    return 0;
}

img

为啥遍历出的元素不全 dfsAdjmatrix()方法 efsaAdjmatrix()方法那个地方出错了