2016-04-07 27 views
0

Ich versuche, eine benutzerdefinierte Graph-Datenstruktur in C++ zu erstellen. Ich verwende std :: set, um die Scheitelpunkte zu verfolgen. Ich überprüfe die Menge, wenn ich eine neue Ecke einfüge, um sicherzustellen, dass sie nicht bereits in der Grafik ist. Meine Erfahrung mit C++ ist minimal, daher habe ich Schwierigkeiten, dies richtig zu implementieren. Das Problem scheint mit der contains Funktion zu sein. Hier ist der Code für das Diagramm:Fehler beim Segmentieren beim Hinzufügen eines Scheitelpunkts zur benutzerdefinierten Diagrammdatenstruktur?

#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-Datei:

#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; 
    } 
} 

Kann mir jemand in die richtige Richtung weisen dieses Problem zu beheben? Vielen Dank.

+1

werden, wenn Vorlagen Sie alle Implementierung in Header-Dateien setzen sollte. Andernfalls erhalten Sie Linker 'unaufgelöste' Fehler. – CodeFuller

+1

m_node_set.find (Vertex) == Vertex ist eine falsche Prüfung. Sie sollten m_node_set.find (Vertex) verwenden! = M_node_set.end – CodeFuller

+0

@CodeFuller Danke für den Tipp. Ich werde weitermachen und etwas umgestalten. –

Antwort

1

Im contains Verfahren, sollte es nicht

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

Wenn dies Ihr Problem löst, können Sie es bitte als Ihre Antwort akzeptieren - indem Sie auf das hohle grüne Häkchen neben der Stimmenzählung klicken. Wenn nicht, sag bitte, was nicht funktioniert hat, damit ich oder jemand anderes dir weiter helfen kann. Vielen Dank. – mask

+1

Das hat funktioniert! Ich habe nicht viel Erfahrung mit der Arbeit mit STL –

Verwandte Themen