【问题标题】:Getting a segmentation fault when trying to add vertex to custom Graph data structure?尝试将顶点添加到自定义 Graph 数据结构时出现分段错误?
【发布时间】:2016-04-07 16:16:52
【问题描述】:

我正在尝试在 C++ 中创建自定义 Graph 数据结构。我正在使用 std::set 来跟踪顶点。我在插入新顶点时检查集合以确保它不在图中。我对 C++ 的经验很少,所以我无法正确实现这一点。问题似乎出在contains 函数上。这是图表的代码:

#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#ifndef GRAPH_H
#define GRAPH_H

/*
Graph - Templated graph class
*/

template <typename T>
struct AdjListNode {
    T data;
    int index;
    struct AdjListNode<T> *next;
};

template <typename T>
struct AdjList {
    struct AdjListNode<T> *head;
};


template <class T>
class Graph {
    private:
        std::vector< AdjList<T>* > m_adj_list; //Adjacency list
        std::set<T> m_node_set;
        std::map<T, int> m_index_map; 
        int m_num_vertices;
        bool m_is_directed;
        void addDirectedEdge(T src, T dest);
        bool contains(T vertex);

    public:
        Graph(bool isDirected=true);
        bool isDirected();
        int numVertices();
        bool addVertex(T vertex);
        void addEdge(T src, T dest);
        std::string printGraph();
        AdjListNode<T>* getAdjacent(T vertex);
};

#endif

CPP 文件:

#include <iostream>
#include <vector>
#include <list>
#include <set>
#include "Graph.h"

template <class T>
Graph<T>::Graph(bool is_directed) {
    m_num_vertices = 0;
    m_is_directed = is_directed;
}

template <class T>
bool Graph<T>::isDirected() {
    return m_is_directed;
}

template <class T>
int Graph<T>::numVertices() {
    return m_num_vertices;
}

template <class T>
bool Graph<T>::addVertex(T vertex) {
    //check to make sure node is not in graph
    if (contains(vertex)) { //segfault occurs here
         AdjListNode<T> *newNode = new AdjListNode<T>;
         newNode->index = m_adj_list.size();
         AdjList<T> *newAdjList = new AdjList<T>;
         newAdjList->head = newNode;
         m_adj_list.push_back(newAdjList);
         m_num_vertices++;
        return true;
    } else {
        return false;
    }
}

template <class T>
void Graph<T>::addDirectedEdge(T src, T dest) {
    if (contains(src)) {
        AdjListNode<T> *newNode = new AdjListNode<T>;
        newNode->data = dest;
        newNode->next = NULL;
        AdjList<T> *list = m_adj_list[m_index_map[src]];
        AdjList<T> *currentNode = list->head;
        while (currentNode->next != NULL) {
            currentNode = currentNode->next;
        }
        //insert at the end of adjacency list
        currentNode->next = newNode;
    }
}

template <class T>
bool Graph<T>::contains(T vertex) {
    return m_node_set.find(vertex) == vertex;
}

template <class T>
void Graph<T>::addEdge(T src, T dest) {
    addDirectedEdge(src, dest);
    if (!m_is_directed) {
        addDirectedEdge(dest, src);
    }
}

template <class T>
std::string Graph<T>::printGraph() {
    return "";
}

template <class T>
AdjListNode<T>* Graph<T>::getAdjacent(T vertex) {
    if (*m_node_set.find(vertex) == vertex) {
        AdjListNode<T>* list = m_adj_list[m_index_map[vertex]];
        return list->head->next;
    } else {
        return NULL;
    }
}

谁能指出我解决此问题的正确方向?谢谢。

【问题讨论】:

  • 使用模板时,您应该将所有实现放入头文件中。否则你会得到链接器“未解决”的错误。
  • m_node_set.find(vertex) == vertex 检查不正确。你应该使用 m_node_set.find(vertex) != m_node_set.end
  • @CodeFuller 感谢您的提示。我会继续进行一些重构。

标签: c++ pointers stl


【解决方案1】:

contains方法中,不应该是这样

return (m_node_set.find(vertex) != m_node_set.end());

【讨论】:

  • 如果这解决了您的问题,您能否考虑接受它作为您的答案 - 通过单击计票旁边的空心绿色对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。
  • 成功了!我没有太多使用 STL 的经验
猜你喜欢
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多