C++数据结构之实现邻接表

C++数据结构之实现邻接表

在图论中,为了表示节点及其之间的联系,我们需要使用数据结构。邻接表是图的一种常见表示方法,实现方便且高效。

什么是邻接表

邻接表是一种图形式的数据结构,由节点和边组成。它使用链式结构来存储相邻节点的信息。邻接表常用于表示有向图、无向图以及加权图。在邻接表中,每一个节点都存储了一个链表,其中包含了该节点与其他节点之间的连接情况。

实现邻接表

1. 定义节点类

在实现邻接表前,我们需要定义一个节点类来表示每一个图节点的信息。节点类可以有多个属性,例如节点 ID、节点名称等。

//节点类
class Node{
public:
    int id; //节点 ID
    string name; //节点名称
    Node(){}
    Node(int id,string name){
        this->id=id;
        this->name=name;
    }
};

2. 定义邻接表类

定义邻接表类时需要考虑其成员变量和成员函数,一般包括节点数、边数、节点数组等。

//邻接表类
class Adjacency_List{
public:
    int node_num; //节点数
    int edge_num; //边数
    Node* node_array; //节点数组
    Adjacency_List(){}
    Adjacency_List(int node_num,int edge_num,Node* node_array){
        this->node_num=node_num;
        this->edge_num=edge_num;
        this->node_array=node_array;
    }
};

3. 定义链表节点类

为了实现邻接表,我们需要定义一个链表节点类表示每一个节点与其它节点的连接情况。链表节点需要保存连接的节点 ID 和指向下一个链表节点的指针等。

//链表节点类
class List_Node{
public:
    int id; //连接的节点 ID
    List_Node* next; //指向下一个链表节点的指针
    List_Node(){}
    List_Node(int id,List_Node* next){
        this->id=id;
        this->next=next;
    }
};

4. 实现邻接表的插入操作

在邻接表中插入新的连接时,需要遍历链表并找到最后一个节点,然后将新节点插入到最后一个节点的后面。

//邻接表插入操作
void insert_edge(Adjacency_List& g,int from,int to){
    for(int i=0;i<g.node_num;i++){
        //找到出发点
        if(g.node_array[i].id==from){
            //在出发点的链表中插入连接点
            List_Node* p=g.node_array[i].next;
            while(p->next!=NULL){
                p=p->next;
            }
            List_Node* new_node=new List_Node(to,NULL);
            p->next=new_node;
            break;
        }
    }
}

5. 实现邻接表的打印操作

打印邻接表时,需要遍历每一个节点的链表,并输出链表中的每一个节点 ID。

//打印邻接表
void print_graph(Adjacency_List g){
    cout<<"Node number: "<<g.node_num<<"  Edge number: "<<g.edge_num<<endl;
    for(int i=0;i<g.node_num;i++){
        cout<<"Node "<<g.node_array[i].id<<": ";
        List_Node* p=g.node_array[i].next;
        while(p->next!=NULL){
            cout<<p->id<<" ";
            p=p->next;
        }
        cout<<p->id<<endl;
    }
}

示例演示

下面是两个简单的示例演示如何使用邻接表来表示图。

示例 1

假设有一个有向图,其中有 3 个节点分别为 1、2、3,图的连接信息如下:

1 --> 2
1 --> 3

我们可以先定义每个节点,然后定义邻接表并插入连接信息,最后输出邻接表。

int main(){
    Node node1(1,"node1");
    Node node2(2,"node2");
    Node node3(3,"node3");
    Node nodes[]={node1,node2,node3};
    Adjacency_List g(3,2,nodes);
    List_Node node1_2(2,NULL);
    List_Node node1_3(3,NULL);
    node1.next=&node1_2;
    node2.next=NULL;
    node3.next=NULL;
    g.node_array[0]=node1;
    g.node_array[1]=node2;
    g.node_array[2]=node3;
    insert_edge(g,1,2);
    insert_edge(g,1,3);
    print_graph(g);
    return 0;
}

输出如下:

Node number: 3  Edge number: 2
Node 1: 2 3
Node 2: 
Node 3: 

示例 2

假设有一个无向图,其中有 4 个节点分别为 1、2、3、4,图的连接信息如下:

1 --- 2
|     |
|     |
3 --- 4

我们可以先定义每个节点,然后定义邻接表并插入连接信息,最后输出邻接表。

int main(){
    Node node1(1,"node1");
    Node node2(2,"node2");
    Node node3(3,"node3");
    Node node4(4,"node4");
    Node nodes[]={node1,node2,node3,node4};
    Adjacency_List g(4,4,nodes);
    List_Node node1_2(2,NULL);
    List_Node node1_3(3,NULL);
    node1.next=&node1_2;
    node2.next=NULL;
    node3.next=NULL;
    List_Node node2_1(1,NULL);
    List_Node node2_4(4,NULL);
    node2.next=&node2_1;
    node1_2.next=&node2_1;
    node4.next=NULL;
    List_Node node3_1(1,NULL);
    List_Node node3_4(4,NULL);
    node3.next=&node3_4;
    node1_3.next=&node3_1;
    List_Node node4_2(2,NULL);
    List_Node node4_3(3,NULL);
    node4.next=&node4_2;
    node2_4.next=&node4_2;
    node3_4.next=&node4_3;
    g.node_array[0]=node1;
    g.node_array[1]=node2;
    g.node_array[2]=node3;
    g.node_array[3]=node4;
    print_graph(g);
    return 0;
}

输出如下:

Node number: 4  Edge number: 4
Node 1: 2 3 
Node 2: 1 4 
Node 3: 1 4 
Node 4: 2 3 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++数据结构之实现邻接表 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 环形队列的实现 [详解在代码中]

    1 package DataStructures.Queue.Array.Exerice; 2 3 /** 4 * @author Loe. 5 * @project DataStructures&Algorithms 6 * @date 2023/5/8 7 * @ClassInfo 环形队列 8 * 主要使用取模的特性来实现环形特征 9 */ 1…

    算法与数据结构 2023年5月8日
    00
  • java数据结构基础:稀疏数组

    Java数据结构基础:稀疏数组 在开发过程中,我们需要处理一些稀疏矩阵(大部分元素为0)的数据。这时候,使用稀疏数组是比较高效的方法。 什么是稀疏数组 稀疏数组是由很多元素值相同的元素组成,这些元素的值通常为0。而这些值不同时都存储在一个数组中会浪费很多内存空间。因此,我们使用稀疏数组来存储这些元素。 稀疏数组的定义: 稀疏数组的行数可以理解为矩阵的行数,而…

    数据结构 2023年5月17日
    00
  • C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)

    下面是关于C++二叉树数据结构的详细攻略。 什么是二叉树 二叉树是一种树形数据结构,每个节点最多有两个子节点:左节点和右节点。一个节点没有左节点或右节点则分别为左子树和右子树为空。 递归遍历二叉树 前序遍历 前序遍历是指对于一棵二叉树,在访问右子树之前,先访问根节点,然后访问左子树。 下面是C++递归遍历二叉树的前序遍历示例代码: template <…

    数据结构 2023年5月17日
    00
  • 如何配置git环境

    首先我们新建一个文件夹;    然后我们右键git Bash Here一下;在里面输入: cd ssh-keygen cd.ssh ls (注意,我们要是之前就生成过密钥,直接输入ls就好了) 输入ls之后,会显示出来我们的公钥,我们输入: cat id_rsa.pub 然后密钥就出来了,密钥出来之后,我们把密钥复制一下,打开github 选择设置; 中会有…

    算法与数据结构 2023年4月18日
    00
  • C++数据结构之单链表的实现

    C++数据结构之单链表的实现可分为以下步骤: 1. 定义链表节点类 链表节点类需要包含两个成员变量,一个是存储数据的变量,另一个是指向下一个节点的指针变量。同时,需要实现构造函数和析构函数。 class Node{ public: int data; // 存储节点数据 Node* next; // 指向下一个节点的指针 Node(int data):dat…

    数据结构 2023年5月17日
    00
  • Java数据结构之栈与队列实例详解

    Java数据结构之栈与队列实例详解攻略 简介 栈和队列是常见的数据结构,在Java中也有对应的实现方式。本文将介绍栈和队列的概念、常见实现方式、应用场景和两个示例。 栈 概念 栈是一种具有后进先出(Last In First Out)特性的数据结构。栈可以使用数组或链表实现。 常见实现方式 基于数组的栈实现 使用数组作为底层存储结构实现栈时,需要注意栈顶指针…

    数据结构 2023年5月17日
    00
  • C语言数据结构中约瑟夫环问题探究

    C语言数据结构中约瑟夫环问题探究 什么是约瑟夫环问题? 约瑟夫环问题(Josephus problem)是一个经典的问题,据说是Flavius Josephus发现并命名的。该问题描述为,编号从1到n的n个人按照顺时针方向围坐成一圈,每人持有一个密码。从第1个人开始,顺时针方向每次完整的数m个人,然后让这m个人出圈并把他们的密码拿走不算。当到达队尾时,又从队…

    数据结构 2023年5月17日
    00
  • 深入PHP中的HashTable结构详解

    深入PHP中的HashTable结构详解 在PHP中,HashTable是一种基础数据结构,常用于存储对象的属性和方法等各种数据,本篇攻略将深入介绍HashTable的实现原理和应用。 HashTable的实现原理 HashTable并不是一种单一的数据结构,它可以根据不同的需求来采用不同的实现方式。在PHP中,我们经常使用的是基于链表的实现方式,也就是链式…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部