C++ 邻接表的实现

C++ 邻接表的实现,c++,arrays,C++,Arrays,我正在尝试实现一个简单的邻接列表。我知道数组的索引是该点顶点的键 例如: 如果我有格式的边缘:(开始、结束、成本) (1,2,4) (2,3,5) (1,3,27) (3,4,8) 我会有一个数组 [0]->null [1] ->2 | 4->3 | 27->null [2] ->3 | 5->null [3] ->4 | 8->空 一个问题是,保存边的容器有指针,但插入其中的元素(边)没有指针。我迷路了 编辑这篇文章是因为我不知道如何在评论中添加代码 struct Node{ E

我正在尝试实现一个简单的邻接列表。我知道数组的索引是该点顶点的键

例如: 如果我有格式的边缘:(开始、结束、成本) (1,2,4) (2,3,5) (1,3,27) (3,4,8)

我会有一个数组

[0]->null [1] ->2 | 4->3 | 27->null [2] ->3 | 5->null [3] ->4 | 8->空 一个问题是,保存边的容器有指针,但插入其中的元素(边)没有指针。我迷路了

编辑这篇文章是因为我不知道如何在评论中添加代码

struct Node{
       Edge *head;
       Node *next;
}

Node *root;

void adjacencyList::insert(const Edge &edge)
{

  if(root == NULL)
   {
      root = new Node;
      root->head = edge;
    }
  else
    {
      while(root != NULL)
        {          
          root = root->next;
          if(root == NULL);
          {
            root = new Node;
            root->head = edge;
            root = root ->next;

          }
        }
     }
}
边缘对象有3个属性(源、目标、成本)
现在,这只会继续在链表中添加边。如何按来源区分列表

邻接列表不必是链表。即使是这样,也不要自己实现(侵入性的)链表,而是使用现有的实现

但我们走了;只需拥有(节点、成本)对的向量:

现在让我们假设您想要遍历图(深度优先搜索),您将执行以下操作(同样,C++11语法,因为它更简洁):

void dfs(图\u t const&graph,std::vector&visted,int节点){
已访问[节点]=真;
for(自动常量和邻居:图形[节点])
如果(未访问[邻居])
dfs(图、访问、邻居优先);
}
这样称呼它:

std::vector<bool> visited(graph.size());
dfs(graph, visited, 1);
访问的向量(graph.size()); dfs(图表,访问,1);
问题到底是什么?你需要提供一些代码,特别是让你困惑的代码。我不知道如何在评论中发布代码,所以我编辑了这篇文章。对不起,谢谢,我不太熟悉这双,但我想试试这个。是否可以使用此实现遍历图形?例如:如果一个顶点有两个或多个邻居,我如何到达它们。在这种情况下,它将是{3,27}。它是图[1][1]。加权节点吗?它只是一个数组数组。为了遍历它,您需要访问索引。等等,让我添加一个示例。谢谢Konrad,但我是否必须像您给出的示例那样静态分配我的图,因为我试图将值放入图[1]中,它会给我错误(运算符不匹配)。如果我理解正确,向量图包含成对对象。如果我做一个图,t[0]=make_对(1,2)。然后是图[0]。第一个值应该是1,依此类推。@user2205018该图是可动态修改的。它只是使用标准向量(尽管它是嵌套的!)。因此,您的代码应该是
graph[0]。将_向后推(生成_对(1,2))。阅读并获得一本关于C++编程的书,学习如何使用它。抱歉,我已经很久没有写代码了。是的,拥有一个单独的数组是存储节点元信息的标准解决方案,在大多数情况下非常有效。如果缺少缓存局部性成为一个问题,您可以用专用类替换节点的简单
int
表示,但是您必须用字典类型(例如
无序映射
)替换邻接列表中的外部向量,这有其自身的性能影响。
graph_t graph{
    {},
    {{2, 4}, {3, 27}},
    {{3, 5}},
    {{4, 8}}
};
void dfs(graph_t const& graph, std::vector<bool>& visited, int node) {
    visited[node] = true;
    for (auto const& neighbor : graph[node])
        if (not visited[neighbor])
            dfs(graph, visited, neighbor.first);
}
std::vector<bool> visited(graph.size());
dfs(graph, visited, 1);