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

设计算法实现:
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;
}

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

邻接表是一种的存储结构,可以用来表示有向和无向。在邻接表中,每个顶点都对应一个链表,链表中存储了该顶点所指向的其他顶点。邻接表可以用来入度出度入度:对于有向中的每个顶点,遍历整个邻接表,统计指向该顶点的边的数量即为该顶点的入度出度:对于有向中的每个顶点,遍历该顶点对应的链表,统计链表中边的数量即为该顶点的出度。 下面是C++代码实现: ```c++ #include <iostream> using namespace std; #define MaxSize 20 struct Node { int weight; int index; struct Node *next; }; struct HNode { char nodeData; struct Node *next; }; struct Graph { int vertexNum; int arcNum; bool isDireted; HNode verList[MaxSize]; }; // 计算顶点v的入度 int getInDegree(Graph G, int v) { int inDegree = 0; for (int i = 0; i < G.vertexNum; i++) { Node *p = G.verList[i].next; while (p != NULL) { if (p->index == v) { inDegree++; } p = p->next; } } return inDegree; } // 计算顶点v的出度 int getOutDegree(Graph G, int v) { int outDegree = 0; Node *p = G.verList[v].next; while (p != NULL) { outDegree++; p = p->next; } return outDegree; } // 计算出度最大的顶点编号 int getMaxOutDegreeVertex(Graph G) { int maxOutDegree = 0; int maxOutDegreeVertex = -1; for (int i = 0; i < G.vertexNum; i++) { int outDegree = getOutDegree(G, i); if (outDegree > maxOutDegree) { maxOutDegree = outDegree; maxOutDegreeVertex = i; } } return maxOutDegreeVertex; } // 计算出度为0的顶点数 int getZeroOutDegreeVertexNum(Graph G) { int zeroOutDegreeVertexNum = 0; for (int i = 0; i < G.vertexNum; i++) { int outDegree = getOutDegree(G, i); if (outDegree == 0) { zeroOutDegreeVertexNum++; } } return zeroOutDegreeVertexNum; } int main() { // 创建一个有向 Graph G; G.vertexNum = 5; G.arcNum = 7; G.isDireted = true; for (int i = 0; i < G.vertexNum; i++) { G.verList[i].nodeData = 'A' + i; G.verList[i].next = NULL; } int arcs[7][2] = {{0, 1}, {0, 3}, {1, 2}, {1, 3}, {2, 4}, {3, 2}, {4, 3}}; for (int i = 0; i < G.arcNum; i++) { int from = arcs[i][0]; int to = arcs[i][1]; Node *p = new Node; p->index = to; p->next = G.verList[from].next; G.verList[from].next = p; } // 计算每个顶点的入度出度 for (int i = 0; i < G.vertexNum; i++) { cout << "顶点" << G.verList[i].nodeData << "的入度为:" << getInDegree(G, i) << endl; cout << "顶点" << G.verList[i].nodeData << "的出度为:" << getOutDegree(G, i) << endl; } // 计算出度最大的顶点编号 int maxOutDegreeVertex = getMaxOutDegreeVertex(G); cout << "出度最大的顶点编号为:" << maxOutDegreeVertex << endl; // 计算出度为0的顶点数 int zeroOutDegreeVertexNum = getZeroOutDegreeVertexNum(G); cout << "出度为0的顶点数为:" << zeroOutDegreeVertexNum << endl; 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、付费专栏及课程。

余额充值