本题要求实现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;
}