图的邻接表的建立, 求入出度 (注:图的创建时,直接输入字符和定点之间关系)

本文介绍了一种基于邻接表的有向图算法实现方法,包括图的创建、输出及计算顶点的入度、出度和度。通过具体代码展示了如何用C++实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计算法实现:
1.建立有向邻接表
2.求有向图的入度,出度,度
3.输出图(图的遍历)
(注:图的创建时,直接输入字符和定点之间关系)

这里写图片描述

#include <iostream>
#include <stdio.h>//注意
#include <stdlib.h>//注意
using namespace std;
#define MAX_VERTEX_NUM  20
typedef char VertexType,VexType;
typedef int EdgeType,InfoType;
typedef struct ArcNode{ //边(弧)结点的类型定义
    int  adjvex;   //边(弧)的另一顶点的在数组中的位置
    ArcNode *nextarc;//指向下一边(弧)结点的指针
    InfoType *info;      //该弧相关信息的指针
}ArcNode;
typedef struct Vnode{//顶点结点及其数组的类型定义
    VertexType data;    //顶点信息
    ArcNode * firstarc;    //指向关联该顶点的边(弧)链表
} Vnode, AdjList[MAX_VERTEX_NUM];
typedef struct {
    AdjList  vertices;
    int  vexnum, arcnum;    //图的当前顶点数和弧数
    int  kind;    //图的种类标志
} ALGraph;    //图邻接表类型

int  LocateVex(ALGraph  &G , VexType vp)
{
    int  k=0 ;
    for (k=0 ; k<G.vexnum ; k++)
    {if (G. vertices[k].data==vp)  return(k) ;}
    return(-1) ;     /*  图中无此顶点  */
}
void CreatALGraph(ALGraph &G)//有向带权图的创建
{
    char e1,e2=0;
    int k,l=0,m=0;
    ArcNode *s;
    cin>>G.vexnum>>G.arcnum; //输入顶点数和边数
    for( int i=0;i<G.vexnum;i++)
    {   cin>>G.vertices[i].data;//输入顶点信息
        G.vertices[i].firstarc=NULL;
    }
    for(k=0;k<G.arcnum;k++)
    {   cin>>e1>>e2;
        s=(ArcNode*)malloc(sizeof(ArcNode));
        l=LocateVex(G, e1);
        m=LocateVex(G , e2);
        s->adjvex=m;
        s->nextarc=G.vertices[l].firstarc;
        G.vertices[l].firstarc=s;
    }
}
void OutputALGraph(ALGraph &G)//邻接表的输出
{   int i;
    for(i=0;i<G.vexnum;i++)
    {   ArcNode * s;
        s=G.vertices[i].firstarc;
        while(s!=NULL)
        {  printf("\t%d",s->adjvex);
            s=s->nextarc;   }
        printf("\n");
    }
}
void Degree(ALGraph &G)//入度 出度 度
{   int k,t;
    ArcNode *p ;
    int indegree[100];
    int outdegree[100];
    for (k=0; k<G.vexnum; k++)
    {   indegree[k]=0 ;/*  顶点入度初始化  */}

    for (k=0; k<G.vexnum; k++)
    {
        outdegree[k]=0;/*  顶点出度初始化  */
        p=G.vertices[k].firstarc ;
        t=0;
        while (p!=NULL)     /*  顶点入度统计  */
        {   t=p->adjvex;
            outdegree[k]++;
            //printf("%d",t);
            indegree[t]++ ;
            p=p->nextarc ;   }
    }
    for(int i=0;i<G.vexnum;i++)
    {
        cout <<G.vertices[i].data<<" "<<indegree[i]<<" "<<outdegree[i]<<" "<<indegree[i]+outdegree[i]<<endl;
    }
}

int main()
{
    ALGraph G;
    CreatALGraph(G);
    //OutputALGraph(G);
    Degree(G);
    return 0;
}

结果如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laura_Wangzx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值