PTA 统计有向图中各顶点的入度与统计有向图中入度为n的顶点个数(邻接表)c语言解法

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

函数接口定义:

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

其中,Graph为采用邻接表作为存储结构的有向图。

裁判测试程序样例:

#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; 
}
/* 请在这里填写答案 */

输入样例:

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

下面附上我的解法+注释:

//"." 用于访问对象的属性和方法
//"->" 用于表示指针或引用
void InDegree(LGraph Graph,int *num) //统计有向图中各顶点的入度
{
    for(int i=0;i<Graph->Nv;i++)
    {
        PtrToAdjVNode s; //定义一个邻接点的指针
        s=Graph->G[i].FisrtEdge;
        while(s!=NULL)
        {
            num[s->AdjV]++;  //num存储对应节点的下标的入度值
            s=s->Next;
        }
    }
}
int countInDegree(LGraph Graph,int n)  //统计有向图中入度为n的顶点个数
{
    int num[100]={0};
    InDegree(Graph,num);  //计算各顶点的入度,再匹配想要的入度为n
    int count=0;
    for(int i=0;i<Graph->Nv;i++)
        if(num[i]==n) count++;
    return count;
}
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值