统计有向图中各顶点的入度与统计有向图中入度为n的顶点个数(邻接表)

统计有向图中各顶点的入度与统计有向图中入度为n的顶点个数(邻接表)

本题要求实现2个函数,统计有向图中各顶点的入度,并统计入度为n的顶点个数。
函数接口定义:

void InDegree(LGraph Graph,int *num); //统计有向图中各顶点的入度

int countInDegree(LGraph Graph,int n); //统计有向图中入度为n的顶点个数

#include <stdio.h>
#include <stdlib.h>
#define MAXVERTEXNUM 100 

//邻接点的定义
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
    int AdjV;  //邻接点的下标
    PtrToAdjVNode Next;   //指向下一个邻接点的指针 
}; 

//顶点表头结点的定义
typedef struct VNode{
    char Data;  //顶点数据 
    PtrToAdjVNode FisrtEdge;  //边表头指针 
}AdjList[MAXVERTEXNUM];   //AdjList是邻接表类型 

typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;  //顶点数 
    int Ne;  //边数
    AdjList G;  //邻接表 
};

typedef PtrToGNode LGraph;  //以邻接表方式存储的图类型

void InDegree(LGraph Graph,int *num); //统计有向图中各顶点的入度
int countInDegree(LGraph Graph,int n);  //统计有向图中入度为n的顶点个数

LGraph BuildGraph()
{
    int v,i,k,j;
    LGraph Graph;
    PtrToAdjVNode NewNode;

    Graph = (LGraph)malloc(sizeof(struct GNode));

    scanf("%d %d",&Graph->Nv,&Graph->Ne);

    for(v = 0;v < Graph->Nv; v++){
        getchar();
        scanf("%c",&Graph->G[v].Data);
        Graph->G[v].FisrtEdge = NULL;    //将指向边表的指针初始化 
    } 

    //建立边表
    char vi,vj;
    for(k = 0;k < Graph->Ne; k++){  
        getchar();
        scanf("%c %c",&vi,&vj);

        for(i = 0; Graph->G[i].Data != vi; i++)  
                    ;//找vi在顶点数组中的下标 
        for(j = 0; Graph->G[j].Data != vj; j++)  
                    ;//找vj在顶点数组中的下标

        //为vj建立新的邻接点 
        NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
        NewNode->AdjV = j;    
        NewNode->Next = Graph->G[i].FisrtEdge;         //头插法插入边结点 
        Graph->G[i].FisrtEdge = NewNode;
    }
    return Graph;
} 

int main(){    
    LGraph Graph2;
    int i;

    int num[100]={0}; //num统计各顶点的入度
    Graph2 = BuildGraph();

    InDegree(Graph2,&num[0]); 
    for(i = 0;i< Graph2->Nv; i++)
    {
        printf("顶点%c的入度为:%d",Graph2->G[i].Data,num[i]);
        printf("\n");
    }
    
    int num1; 
    num1 = countInDegree(Graph2,1);
    printf("入度为1的顶点个数为:%d",num1);

    return 0; 
}
void InDegree(LGraph Graph,int *num) //统计有向图中各顶点的入度
{
    PtrToAdjVNode p;
    for(int i=0;i<Graph->Nv;i++)
    {
        p=Graph->G[i].FisrtEdge;
        while(NULL!=p)
        {
            num[i]++;
            p=p->Next;
        }
    }
}
int countInDegree(LGraph Graph,int n)  //统计有向图中入度为n的顶点个数
{
    PtrToAdjVNode p;
    int num[100]={0};
    for(int i=0;i<Graph->Nv;i++)
    {
        p=Graph->G[i].FisrtEdge;
        while(NULL!=p)
        {
            num[i]++;
            p=p->Next;
        }
    }
    int s=0;
    for(int i=0;i<Graph->Nv;i++)
    {
        if(num[i]==n)
            s++;    
    }
    return s;
}

输入案列

5 7
A B C D E
A B
A E
B D
C B
D A
D C
D E

输出

顶点A的入度为:1
顶点B的入度为:2
顶点C的入度为:1
顶点D的入度为:1
顶点E的入度为:2
入度为1的顶点个数为:3

最后两个函数是我敲的可是运行结结果不对为什么?

img

你把入度和出度弄反了。。。
一个点入度指终点为这个点的边有多少个,所以 InDegreecountInDegreenum[i]++ 应改为 num[p->AdjV]++