在代码中,我创建了一个带有数组的邻接列表,并且数组的每个元素都会生成一个包含相邻节点的列表。
要访问我需要使用的数组;但是,我的顶点名称是字符串,所以我将每个顶点名称映射到从0开始计数的int。正如您在nextNode()
函数中看到的那样,创建新节点时,'next'节点应始终为null 。
邻接列表的示例结果将类似于此
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;
}
}
}
}