邻接列表实施

时间:2013-03-24 17:21:00

标签: c++ arrays

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

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

我会有一个

的数组

[0] - >空

[1] - > 2 | 4 - > 3 | 27 - >空

[2] - > 3 | 5 - >空

[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;

          }
        }
     }
}

edge对象有3个属性(source,destination,cost) 现在,这只会在链表中添加边缘。我如何通过源分隔列表?

1 个答案:

答案 0 :(得分:1)

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

但我们走了;只有一个(节点,成本)对的向量:

typedef std::pair<int, int> weighted_node_t;
typedef std::vector<std::vector<weighted_node_t>> graph_t;

然后,您可以按如下方式表示图形(使用C ++ 11初始化语法):

graph_t graph{
    {},
    {{2, 4}, {3, 27}},
    {{3, 5}},
    {{4, 8}}
};

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

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);