1025: 邻接表(1)

1025: 邻接表(1)

Description

已知有向图采用邻接表存储,部分代码如下,请补充完成计算各个顶点的入度,出度算法。

#include <iostream>
#include <string>
using namespace std;
const int MaxSize = 20; // 顶点个数的最大值
int visited[MaxSize];   // 访问标志数组(0表示未访问,1表示已访问)

// 定义边表结点
struct ArcNode
{
    int adjvex;    // 邻接点的序号
    ArcNode *next; // 指向下一个边结点的指针
};

// 定义顶点表结点
template <class T>
struct VertexNode
{
    T vertex;           // 顶点的名称
    ArcNode *firstedge; // 指向第一个边表结点的头指针
};

// 邻接表类
template <class T>
class ALGraph
{
public:
    ALGraph(T a[], int n, int e); // 构造函数,初始化一个有n个顶点e条边的图
    ~ALGraph();                   // 析构函数,释放邻接表中各边表结点的存储空间
    void DispALGraph();           // 输出邻接表
    void CountInD(int ind[]);     // 计算各个顶点的入度,存储在ind中
    void CountOutD(int outd[]);   // 计算各个顶点的出度,存储在outd中
private:
    VertexNode<T> adjlist[MaxSize]; // 存放顶点表的数组
    int vertexNum, arcNum;          // 图的顶点数和边数
};

/*
 *前置条件:图不存在
 *输    入:无
 *功    能:图的初始化
 *输    出:无
 *后置条件:得到一个无向图
 */
template <class T>
ALGraph<T>::ALGraph(T a[], int n, int e)
{
    arcNum = e;    // 边数
    vertexNum = n; // 顶点数
    int i, j;
    for (i = 0; i < vertexNum; i++)
    {
        adjlist[i].vertex = a[i];
        adjlist[i].firstedge = NULL;
    }
    for (int k = 0; k < arcNum; k++) // 依次输入每一条边,并在相应边表中插入结点
    {
        cin >> i >> j; // 输入边所依附的两个顶点的序号
        ArcNode *s = new ArcNode;
        s->adjvex = j;                  // 生成一个边表结点s
        s->next = adjlist[i].firstedge; // 将结点s插入到i号表的头结点之后
        adjlist[i].firstedge = s;
    }
}
/*   前置条件:图已存在
 *   输    入:无
 *   功    能:销毁图
 *   输    出:无
 *   后置条件:释放图所占用的存储空间
 */
template <class T>
ALGraph<T>::~ALGraph()
{
    for (int i = 0; i < vertexNum; i++)
    {
        ArcNode *p = adjlist[i].firstedge;
        while (p != NULL) // 循环删除
        {
            adjlist[i].firstedge = p->next;
            delete p; // 释放结点空间
            p = adjlist[i].firstedge;
        }
    }
}

/*
 *前置条件:图已存在
 *输    入:无
 *功    能:输出图中所有顶点及边的数据信息
 *输    出:图中所有顶点及边的数据信息
 *后置条件:图保持不变
 */
template <class T>
void ALGraph<T>::DispALGraph()
{
    int i;
    ArcNode *p;
    cout << "图的邻接表:\n";
    for (i = 0; i < vertexNum; i++)
    {
        cout << i << " " << adjlist[i].vertex << " "; // 输出图中顶点的序号i及值
        for (p = adjlist[i].firstedge; p; p = p->next)
            cout << p->adjvex << " "; // 输出i号顶点的邻接点的序号
        cout << endl;
    }
}

// 计算各个顶点的入度
template <class T>
void ALGraph<T>::CountInD(int ind[])
{
}
// 计算各个顶点的出度
template <class T>
void ALGraph<T>::CountOutD(int outd[])
{
}
int main()
{
    string a[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"}; // 顶点信息
    int i, n, e;
    cin >> n >> e; // 输入顶点个数和边个数
    ALGraph<string> G(a, n, e);
    G.DispALGraph();
    int ind[MaxSize];
    cout << "Indegree:";
    G.CountInD(ind);
    for (i = 0; i < n; i++)
        cout << ind[i] << " "; // 输出各个顶点的入度
    cout << endl;
    int outd[MaxSize];
    cout << "OutDegree:";
    G.CountOutD(outd);
    for (i = 0; i < n; i++)
        cout << outd[i] << " "; // 输出各个顶点的出度
    return 0;
}

Input

Output

Sample Input

6 7
0 1 0 3 1 2 1 5 2 4 3 5 4 5

Sample Output

Graph adjlist:
0 A 3 1 
1 B 5 2 
2 C 4 
3 D 5 
4 E 5 
5 F 
Indegree:0 1 1 1 1 3 
OutDegree:2 2 1 1 1 0 
posted @ 2023-06-06 16:35  杨与S8  阅读(12)  评论(0编辑  收藏  举报