逆邻接表求有向图的度
邻接表,存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。图的邻接表表示法可以节约储存空间,只储存关联的信息,由表头结点表与边表俩部分组成。建立逆邻接表可以帮助求入度。
图中某个顶点的度的定义:依附于某个顶点的边的数目。在有向图中也可以分别用出度和入度来表示。
1、TD(x) x的度
2、OD(x) x的出度
3、ID(x) x的入度
1利用邻接矩阵求度很方便,OD为对应行的总和,TD为对应列的组合。
利用邻接表求度,在初始化时要建立,邻接表求OD,逆邻接表求ID。
TD=OD+ID
代码如下:
graph creat(graph *b)//创建邻接表
{
graph a;
dnode *p;
int i,x,y,e;
printf("顶点数和边数 :");
scanf("%d%d",&a.num,&e);
printf("===========================\n");
printf("输入各个顶点的数据:\n");
for(i=1;i<=a.num;i++)
{
printf("顶点%d: ",i);
scanf("\n%c", &a.arry[i].vex);//将顶点数据放入数据域
a.arry[i].first=NULL;
}
*b=a;
for(i=1;i<=e;i++)
{
printf("输入%d个边:",i);
scanf("%d%d",&x,&y);
p=(dnode*)malloc(sizeof(dnode));
p->data=y;
p->next=a.arry[x].first;
a.arry[x].first=p;
p=(dnode*)malloc(sizeof(dnode)); //逆邻接矩阵
p->data=x;
p->next=b->arry[y].first ;
b->arry[y].first=p;
}
//邻接表输出
dnode* curp;
printf("===========================\n邻接表输出:\n");
for(i=1;i<=a.num;i++)
{
printf("%c",a.arry[i].vex);
curp=a.arry[i].first;//边节点指针指向第一个边节点
while(curp!=NULL)
{
printf("-->%d",curp->data);
curp=curp->next;//依次往后遍历
}
printf("\n");
}
//逆邻接表输出
printf("===========================\n逆邻接表输出:\n");
for(i=1;i<=a.num;i++)
{
printf("%c",b->arry[i].vex);
curp=b->arry[i].first;//边节点指针指向第一个边节点
while(curp!=NULL)
{
printf("--<%d",curp->data);
curp=curp->next;//依次往后遍历
}
printf("\n");
}
运行结果如下: