(数据结构)建立图的或邻接表存储表示,计算顶点的度(入度、出度)并实现深度优先或广度优先对图进行遍历。(编译器:VS)

头文件:‘1.h’

#include <stdio.h>
#include <iostream>
#include <malloc.h>
#include <string.h>
#define TRUE  1
#define FALSE 0
#define ERROR 0
typedef int Status;
using namespace std;

头文件:‘2.h’


#include "1.h"
#define  MAX_VERTEX 20
typedef  char  VertexType;
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
    VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX];
typedef struct
{
    AdjList vertices;
    int vexnum, arcnum;
    int kind;
}ALGraph;

//队列
typedef int QElemtype;
#define MAXQSIZE 100
typedef struct
{
    QElemtype *base;
    int front;
    int rear;
}SqQueue;

头文件:‘3.h’(函数的实现)

#pragma once
#include "2.h"


Status LovateVex(ALGraph &G, VertexType v)
{
    int i;
    for (i = 0; i < G.vexnum; i++)
    {
        if (G.vertices[i].data == v)
            return i;
    }
    
}
Status CreatDG(ALGraph &G)//创建有向图
{
    VertexType v1, v2;
    int j, k;
    ArcNode *p;
    cout << "输入定点个数和边数:";
    cin >> G.vexnum >> G.arcnum;
    int i;
    cout << "输入顶点个数和边数:";
    for (i = 0; i < G.vexnum; i++)
    {
        cin >> G.vertices[i].data;
        G.vertices[i].firstarc =NULL;
    }
    cout << "建立图,输入两个顶点:";
    for (i = 0; i < G.arcnum; i++)
    {
        cin >> v1 >> v2;
        j=LovateVex(G, v1);
        k = LovateVex(G, v2);
        p = (ArcNode*)malloc(sizeof(ArcNode));
        p->adjvex = k;
        p->nextarc = G.vertices[j].firstarc;
        G.vertices[j].firstarc = p;

    }
    return OK;


}
Status  CreatUDG(ALGraph &G)//创建无向图
{
    VertexType v1, v2;
    int j, k;
    ArcNode *p,*q;
    cout << "输入顶点个数和边数:";
    cin >> G.vexnum >> G.arcnum;
    int i;
    cout << "输入顶点:";
    for (i = 0; i < G.vexnum; i++)
    {
        cin >> G.vertices[i].data;
        G.vertices[i].firstarc = NULL;
    }
    cout << "建立图,输入两个顶点:";
    for (i = 0; i < G.arcnum; i++)
    {
        cin >> v1 >> v2;
        j = LovateVex(G, v1);
        k = LovateVex(G, v2);
        p = (ArcNode*)malloc(sizeof(ArcNode));
        p->adjvex = k;
        p->nextarc = G.vertices[j].firstarc;
        G.vertices[j].firstarc = p;

        q= (ArcNode*)malloc(sizeof(ArcNode));
        q->adjvex = j;
        q->nextarc = G.vertices[k].firstarc;
        G.vertices[k].firstarc = q;


    }
    return OK;


}
Status GreatGraph(ALGraph &G)//选择自己创建的图的形式
{
    cout << "输入图类型:" << "0-DG,1-UDG" << endl;
    cin >> G.kind;
    switch (G.kind)
    {
    case 0:return CreatDG(G); break;
    case 1:return  CreatUDG(G); break;

    }

}
void PrintGraph(ALGraph G)//打印图的相关信息
{
    ArcNode *p;
    cout << endl << "图的顶点和边数:" << G.vexnum << " " << G.arcnum;
    cout << endl << "顶点的信息:";
    int i;
    for (i = 0; i < G.vexnum; i++)
    {
        cout << " " << G.vertices[i].data;
    }
    cout << endl << "图的领接表:";
    int j;//记录每个点的标号
    for (i = 0; i < G.vexnum; i++)
    {
        cout << endl<< G.vertices[i].data << "的邻接点:";
        p = G.vertices[i].firstarc;
        while (p)
        {
            j = p->adjvex;
            cout << " " << G.vertices[j].data;
            p = p->nextarc;
        }
        cout << endl;
    }
}
void FindOUTDegree(ALGraph G)//计算出度
{
    int i;
    ArcNode *p;
    int count;
    cout << "各顶点的出度如下:" << endl;
    for (i = 0; i < G.vexnum; i++)
    {
        count = 0;
        p = G.vertices[i].firstarc;
        while (p)
        {
            count++;
            p = p->nextarc;
        }
        cout << G.vertices[i].data << ":" << count;
        cout <<endl;
    }
}
void FindINDegree(ALGraph G)//计算入度
{
    int indegree[MAX_VERTEX];
    ArcNode *p;
    int i;
    cout << "各点入度如下:" << endl;
    for (i = 0; i < G.vexnum; i++)
        indegree[i] = 0;
    for (i = 0; i < G.vexnum; i++)
    {
        p = G.vertices[i].firstarc;
        while (p)
        {
            ++indegree[p->adjvex];
            p = p->nextarc;
        }
    }
    int j;
    for (j = 0; j < G.vexnum; j++)
    {
        cout << G.vertices[j].data << " :" << indegree[j] << endl;
    }

    
}
bool visited[MAX_VERTEX];
void DFS(ALGraph G, int i)
{
    visited[i] =true;
    cout << G.vertices[i].data << endl;
    ArcNode *p;
    int w;
    p = G.vertices[i].firstarc;
    while (p)
    {
        w = p->adjvex;
        if (!visited[w])
            DFS(G, w);
        p = p->nextarc;
    }
}


void DFSTraverse(ALGraph G)//深度遍历
{
    int i;
    for (i = 0; i < G.vexnum; i++)
        visited[i] = false;
    for (i = 0; i < G.vexnum; i++)
    {
        if (!visited[i])
            DFS(G, i);
    }
}
//队列函数
#pragma once

Status InitQueue(SqQueue &Q)
{
    Q.base = (QElemtype*)malloc(MAXQSIZE * sizeof(QElemtype));
    if (!Q.base) return OVERFLOW;
    Q.front = Q.rear = 0;
    return OK;
}
Status EnQueue(SqQueue &Q, QElemtype e)
{
    if ((Q.rear + 1) % MAXQSIZE == Q.front) return ERROR;
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXQSIZE;
    return OK;

}
Status DeQueue(SqQueue &Q, QElemtype &e)
{
    if (Q.front == Q.rear) return ERROR;
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAXQSIZE;
    return OK;
}
Status QueueEmpty(SqQueue Q)
{
    return Q.front == Q.rear;
}

void BFSTraverse(ALGraph G)//广度遍历
{
    bool visited[MAX_VERTEX];
    int i;
    int w;
    QElemtype e;
    ArcNode *p;
    for (i = 0; i < G.vexnum; i++)
        visited[i] = false;
    SqQueue Q;
    InitQueue(Q);
    for (i = 0; i < G.vexnum; i++)
    {
        if (!visited[i])
        {
            visited[i] = true;
            cout << G.vertices[i].data << endl;
            EnQueue(Q, i);
            while (!QueueEmpty(Q))
            {
                DeQueue(Q, e);
                for (p = G.vertices[i].firstarc; p; p = p->nextarc)
                {
                    w = p->adjvex;
                    if (!visited[w])
                    {
                        visited[w] = true;
                        cout << G.vertices[w].data << endl;
                        EnQueue(Q,w);
                    }
                }
            }

        }
    }
}

主函数:

#include "3.h"
int main()
{
    ALGraph G;
    GreatGraph(G);
    PrintGraph(G);
    FindOUTDegree(G);
    FindINDegree(G);
    cout << "深度搜索结果:" << endl;
    DFSTraverse(G);
    cout << "广度搜索结果如下:" << endl;
    BFSTraverse(G);

    system("pause");

}




    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/GUAN_GUAN_A/article/details/85074937
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞