博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java数据结构与算法(十) 图
阅读量:6228 次
发布时间:2019-06-21

本文共 6327 字,大约阅读时间需要 21 分钟。

###1.什么是图

  • 图是一种和树相像的数据结构,通常有一个固定的形状,这是有物理或者抽象的问题来决定的。 ###2.邻接
  • 如果两个定点被同一条便连接,就称这两个定点是邻接的。 ###3.路径
  • 路径是从一个定点到另一个定点经过的边的序列。 ###4. 连通图和非连通图
  • 至少有一挑路径可以连接所有的定点,那么这个图就是连通的,否则是非连通的。 ###5.有向图和无向图
  • 有向图的边是有方向的,入只能从A到B,不能从B到A。
  • 无向图的边是没有方向的,可以从A到B,也可以从B到A。 ###6.带权图
  • 在有些图中,边被富裕了一个权值,权值是一个数字,他可以代表如两个顶点的物理距离,或者是一个顶点到另一个顶点的时间等等,这样的图叫做带权图。 ###7.程序实现
#include 
#define MAXVEX 100 //最大顶点数#define INFINITY 65535 //最大权值typedef int EdgeType; //权值类型自己定义typedef char VertexType; //顶点类型自己定义#pragma once#pragma region 邻接矩阵结构体typedef struct { VertexType vex[MAXVEX]; //顶点表 EdgeType arg[MAXVEX][MAXVEX]; ///权值表-邻接矩阵 int numVertexes,numEdges; //图中的边数和顶点数}GraphArray;#pragma endregion#pragma region 邻接表结构体//边表结点typedef struct EdgeNode{ int nNodevex; //邻接点的点表中结点的坐标 EdgeType nNodeWeight; //用于网图中边的权值 EdgeNode* next; //链域,指向下一个邻接点}EdgeNode,*pEdgeNode;//顶点表结点typedef struct VertexNode{ VertexType nNodeData; //顶点表中存储的数据 pEdgeNode pFirstNode; //顶点表和边表中关联指针,指向边表头指针}VertexNode,pVertexNode,VertexList[MAXVEX];//图结构typedef struct{ VertexList vertexList; int numVertess,numEdges;}GraphList;#pragma endregionclass GraphData{public: GraphData(void); ~GraphData(void); #pragma region 创建邻接矩阵 void CreateGraphArray(GraphArray* pGraphArray,int numVer,int numEdegs); int GetGraphLocation(GraphArray* pGraphArrray,char chpoint); #pragma endregion #pragma region 创建邻接表 void CreateGraphList(GraphList* pList,int numVer,int numEdegs); int GetGraphListLocation(GraphList* pList,char chpoint); #pragma endregion};复制代码
#include "GraphData.h"GraphData::GraphData(void){}GraphData::~GraphData(void){}int GraphData::GetGraphLocation(GraphArray* pGraphArrray,char chpoint){    int i = 0;    for (i = 0;i< pGraphArrray->numVertexes;i++)    {        if (pGraphArrray->vex[i] == chpoint)        {            break;;        }    }    if (i >= pGraphArrray->numVertexes)    {        return -1;    }    return i;}/// /// 创建邻接矩阵///         void GraphData::CreateGraphArray(GraphArray* pGraphArray,int numVer,int numEdegs){    int weight = 0;    pGraphArray->numVertexes = numVer;    pGraphArray->numEdges = numEdegs;        //创建顶点表    for (int i= 0; i < numVer;i++)    {        pGraphArray->vex[i] = getchar();        while(pGraphArray->vex[i] == '\n')        {            pGraphArray->vex[i] = getchar();        }    }    //创建邻接表的边矩阵    for (int i = 0; i < numEdegs; i++)    {        for (int j = 0;j < numEdegs ; j++)        {            pGraphArray->arg[i][j] = INFINITY;        }            }    for(int k = 0; k < pGraphArray->numEdges; k++)    {        char p, q;        printf("输入边(vi,vj)上的下标i,下标j和权值:\n");        p = getchar();        while(p == '\n')        {            p = getchar();        }        q = getchar();        while(q == '\n')        {            q = getchar();        }        scanf("%d", &weight);            int m = -1;        int n = -1;        m = GetGraphLocation(pGraphArray, p);        n = GetGraphLocation(pGraphArray, q);        if(n == -1 || m == -1)        {            fprintf(stderr, "there is no this vertex.\n");            return;        }        //getchar();        pGraphArray->arg[m][n] = weight;        pGraphArray->arg[n][m] = weight;  //因为是无向图,矩阵对称    }    }#pragma regionvoid GraphData::CreateGraphList(GraphList* pList,int numVer,int numEdegs){    int weight = 0;    GraphList *pGraphList = pList;    pGraphList->numVertess = numVer;    pGraphList->numEdges = numEdegs;    EdgeNode* firstNode,*secondNode;    //创建顶点表    for (int i= 0; i < numVer;i++)    {        pGraphList->vertexList[i].nNodeData = getchar();        pGraphList->vertexList[i].pFirstNode = NULL;        while(pGraphList->vertexList[i].nNodeData == '\n')        {            pGraphList->vertexList[i].nNodeData = getchar();        }    }    //创建边表        for(int k = 0; k < pGraphList->numEdges; k++)    {        char p, q;        printf("输入边(vi,vj)上的下标i,下标j和权值:\n");        p = getchar();        while(p == '\n')        {            p = getchar();        }        q = getchar();        while(q == '\n')        {            q = getchar();        }        scanf("%d", &weight);            int m = -1;        int n = -1;        m = GetGraphListLocation(pGraphList, p);        n = GetGraphListLocation(pGraphList, q);        if(n == -1 || m == -1)        {            fprintf(stderr, "there is no this vertex.\n");            return;        }        //getchar();        //字符p在顶点表的坐标为m,与坐标n的结点建立联系权重为weight        firstNode = new EdgeNode();        firstNode->nNodevex = n;        firstNode->next = pGraphList->vertexList[m].pFirstNode;        firstNode->nNodeWeight = weight;        pGraphList->vertexList[m].pFirstNode = firstNode;        //第二个字符second        secondNode = new EdgeNode();        secondNode->nNodevex = m;        secondNode->next = pGraphList->vertexList[n].pFirstNode;        secondNode->nNodeWeight = weight;        pGraphList->vertexList[n].pFirstNode = secondNode;    }}int GraphData::GetGraphListLocation(GraphList* pList,char chpoint){    GraphList *pGraphList = pList;    int i = 0;    for (i = 0;i< pGraphList->numVertess;i++)    {        if (pGraphList->vertexList[i].nNodeData == chpoint)        {            break;;        }    }    if (i >= pGraphList->numVertess)    {        return -1;    }    return i;}#pragma endregion复制代码
#include 
#include "GraphData.h"using namespace std;//void PrintGrgph(GraphList *pGraphList){ int i =0; while(pGraphList->vertexList[i].pFirstNode != NULL && i
vertexList[i].nNodeData); EdgeNode *e = NULL; e = pGraphList->vertexList[i].pFirstNode; while(e != NULL) { printf("%d ", e->nNodevex); e = e->next; } i++; printf("\n"); } }int main(){ int numVexs,numEdges; GraphData* pTestGraph = new GraphData(); GraphArray graphArray; GraphArray* pGraphArray = &graphArray; GraphList* pGgraphList = new GraphList(); cout<<"输入顶点数和边数"<
>numVexs>>numEdges; cout<<"顶点数和边数为:"<
<
<
CreateGraphArray(pGraphArray,numVexs,numEdges); for(int i = 0; i< numEdges;i++) { for (int j = 0;j< numEdges;j++) { cout<
arg[i][j]; } cout<
CreateGraphList(pGgraphList,numVexs,numEdges); PrintGrgph(pGgraphList); system("pause");}复制代码

借鉴文章

转载地址:http://qtina.baihongyu.com/

你可能感兴趣的文章
修改上传文件控件的样式-----html,css
查看>>
Firebug控制台详解[转]
查看>>
使用Flash Builder 4.6出现 新建配置 失败 java.lang.NullPointerException错误
查看>>
Frp基础配置模版
查看>>
JDK源码阅读--Object
查看>>
有关于认证和加密
查看>>
深入浅出Git教程(转载)
查看>>
[转载]MySQL5.6 PERFORMANCE_SCHEMA 说明
查看>>
max_allowed_packet引起同步报错处理
查看>>
006 复杂的数据类型&函数(方法)
查看>>
javascript:getElementsByName td name
查看>>
ASP.NET连接SQL、Access、Excel数据库(二)——连接实例
查看>>
FreeRTOS 特性简介
查看>>
Linux--前后端分离部署
查看>>
java阶段学习目标
查看>>
Azure IoT 技术研究系列2
查看>>
day24-3-2子类继承构造方法
查看>>
我们一起学习WCF 第五篇数据协定和消息协定
查看>>
Linux 与 Windows 文件互传(VMWare)
查看>>
Python学习笔记八 面向对象高级编程(一)
查看>>