统计有向图中各顶点的入度与统计有向图中入度为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
最后两个函数是我敲的可是运行结结果不对为什么?
你把入度和出度弄反了。。。
一个点入度指终点为这个点的边有多少个,所以 InDegree
和 countInDegree
中 num[i]++
应改为 num[p->AdjV]++