C++ 邻接表的实现
我正在尝试实现一个简单的邻接列表。我知道数组的索引是该点顶点的键 例如: 如果我有格式的边缘:(开始、结束、成本) (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->空 一个问题是,保存边的容器有指针,但插入其中的元素(边)没有指针。我迷路了 编辑这篇文章是因为我不知道如何在评论中添加代码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
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);