博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构学习笔记之采用邻接表C++实现图
阅读量:3935 次
发布时间:2019-05-23

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

图的C++实现

一、图的基本操作

  • 图的基本操作如下图:
    在这里插入图片描述

二、图的C++实现

  • 采用邻接表实现,并没有全部实现上图的所有操作
    #pragma once#include 
    using namespace std;// 边表节点typedef struct Arcnode{
    int adjevex; //顶点号 Arcnode* next; // 指向下一条弧 int weight; // 边权};// 顶点表typedef struct Vnode{
    int data; // 顶点号 Arcnode* first; // 第一条依附于该顶点的边}AdjList;// 图class Graph{
    private: AdjList* vertice; //邻接表 // 定点数和边数 int vexnum, arcnum;public: Graph(); bool init(int vnum, int anum); bool create(); bool adjacent(int x, int y); void Neighbors(int x); void AddVertx();};// 增加顶点void Graph::AddVertx(){
    if (vertice == NULL) {
    cout << "邻接表未初始化" << endl; return; } vertice[vexnum].data = vexnum; vertice[vexnum].first = NULL; vexnum += 1;}// 输出与 x 邻接的边void Graph::Neighbors(int x){
    if (vertice == NULL) {
    cout << "邻接表未初始化" << endl; return; } Arcnode* p = vertice[x].first; while (p->next != NULL) {
    cout << "边(" << x << " , " << p->adjevex << ")的权为:" << p->weight << endl; p = p->next; }}// 判断边存不存在bool Graph::adjacent(int x, int y){
    if (vertice == NULL) {
    cout << "邻接表未初始化" << endl; return false; } Arcnode* p = vertice[x].first; while (p->next != NULL) {
    if (p->adjevex == y) return true; p = p->next; } return false;}// 构造函数Graph::Graph(){
    vertice = NULL; vexnum = arcnum = 0;}bool Graph::init(int vnum, int anum){
    if (vertice != NULL) return false; vexnum = vnum; arcnum = anum; vertice = new Vnode[vexnum]; for (int i = 0; i < vexnum; i++) {
    vertice[i].data = i + 1; vertice[i].first = NULL; } return true;}// 构造图bool Graph::create(){
    if (vertice == NULL) {
    cout << "邻接表未初始化" << endl; return false; } int** WN = new int* [vexnum]; for (int i = 0; i < vexnum; i++) WN[i] = new int[vexnum]; cout << "请按照图的结构输入边信息到二维数组中,注意从顶点号为 1 的开始" << endl; for (int i = 0; i < vexnum; i++) {
    for (int j = 0; j < vexnum; j++) cin >> WN[i][j]; } for (int i = 0; i < vexnum; i++) {
    for (int j = 0; j < vexnum; j++) {
    if (WN[i][j] != 0) {
    Arcnode* p = new Arcnode; p->adjevex = j + 1; p->weight = WN[i][j]; p->next = NULL; if (vertice[i].first == NULL) vertice[i].first = p; else {
    Arcnode* t = vertice[i].first; while (t->next != NULL) t = t->next; t->next = p; } } } } for (int i = 0; i < vexnum; i++) delete[] WN[i]; delete[] WN; return true;}

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

你可能感兴趣的文章
静态方法应用
查看>>
学习资料
查看>>
技术 +市场必须两手抓
查看>>
服务器抓包
查看>>
vim应用
查看>>
SOA性能管理现状
查看>>
Linux服务器常用命令
查看>>
Linux 检索
查看>>
防止机器注册
查看>>
git操作杂记
查看>>
thrift应用
查看>>
php 按元素值获取最佳元素组合
查看>>
支付服务集成-支付宝
查看>>
使用openssl生成RSA公钥和私钥对
查看>>
Linux常用命令
查看>>
Linux 定时任务应用
查看>>
什么是线程安全
查看>>
第三方支付集成
查看>>
MySQL server has gone away 问题的解决方法
查看>>
常用链接
查看>>