为什么这个邻接列表中存在内存错误?

时间:2016-12-17 05:14:52

标签: c++ graph linked-list segmentation-fault adjacency-list

在代码中,我创建了一个带有数组的邻接列表,并且数组的每个元素都会生成一个包含相邻节点的列表。

要访问我需要使用的数组;但是,我的顶点名称是字符串,所以我将每个顶点名称映射到从0开始计数的int。正如您在nextNode()函数中看到的那样,创建新节点时,'next'节点应始终为null 。

邻接列表的示例结果将类似于此

  • inputVertices:a,b,c,d
  • inputEdges:(a,b),(a,d),(b,c)(d,b)

  • 映射:a< - > 0,b< - > 1,c< - > 2,d< - > 3

  • 邻接清单:

    arr元素|连接到元素的链接列表

    • 0 | - > b-> d

    • 1 | - > c

    • 2 |

    • 3 | - > b

struct Node {
    string vert;
    int weight;
    Node *next;
};

struct List {
    struct Node *head;
};


class Graph {
    int vertices;
    int edges;
    struct List *vertexArray;
    int count = 0;
    map<string, int> vertList;

public:

Graph(int vertices) {
    this->vertices = vertices;
    vertexArray = new List[vertices];
    for (int i = 0; i < vertices; i++) {
        vertexArray[i].head = NULL;
    }
}

~Graph() {
    vertList.clear();
}

Node *nextNode(string vert) {
    Node *newNode = new Node;
    newNode->vert = vert;
    newNode->weight = 0;
    newNode->next = NULL;
    return newNode;
}

void addVertex(string vert) {
    vertList[vert] = count; //maps Vertex to an integer in the order the Vertex is added
    count++;
}

void addEdge(string head, string vert, int weight) {
    Node *newNode = nextNode(vert);
    newNode->weight = weight;
    newNode->next = vertexArray[vertList.at(head)].head;
    vertexArray[vertList.at(head)].head = newNode;
}

我在尝试打印邻接列表时偶然发现了我的问题    这里程序总是在下面的while循环中崩溃。它得到了    通过第一个节点列表很好,但在第二个节点崩溃    列表。

我想出原因是第一个列表指向一切正常array[0].head->next = node1 node1->next = node2...noden->next = null(这会退出循环),但是对于第二个列表,会发生不同的事情:array[1].head->next = node1 node1->next = node2...noden->next = 0xabababab。最后一个节点应为null,但不是。我将所有新节点设置为null。这会导致seg故障并导致程序崩溃。

void print() {
       for (int i = 0; i < vertices; i++) {
           Node *n = vertexArray[i].head;
           for (auto it = vertList.cbegin(); it != vertList.cend(); ++it) {
               if ((*it).second == i) { // true if second type in map (aka int) == current array position
                   cout << (*it).first; //corresponding first type in map
                   while (n) {
                          cout << "-> " << n->vert;
                         n = n->next;
                    }
                    cout << endl;
                }
           }

       }
 }

0 个答案:

没有答案