我在尝试弄清楚如何在向某个配对顶点添加边缘时正确获取指针时遇到了一些麻烦。
以下是关于顶点和节点完成输入后链表应如何显示的简短概念。
我如何在neighborList上保持秩序?如果当前顶点中已存在顶点边缘,是否还有另一个条件?
我试图建立结构化类:
class graph{
private:
typedef struct node{
char vertex;
node * nodeListPtr;
node * neighborPtr;
}* nodePtr;
nodePtr head;
nodePtr curr;
public:
graph();
~graph();
void AddNode(char AddData);
void AddEdge(char V, char E);
void printList();
};
graph::graph(){
head = NULL;
curr = NULL;
}
// Adds a node to a linked list
void graph::AddNode(char AddData){
nodePtr n = new node;
n->nodeListPtr = NULL;
n->vertex = AddData;
if(head != NULL){
curr = head;
while(curr->nodeListPtr != NULL){
curr = curr->nodeListPtr;
}
curr->nodeListPtr = n;
}
else{
head = n;
}
}
// takes 2 Parameters (V is pointing to E)
// I want to set it up where the neighborptr starts a double linked List basically
void graph::AddEdge(char V, char E){
// New Node with data
nodePtr n = new node;
n->neighborPtr = NULL;
n->vertex = E;
// go to the first node in the nodeList and go through till you reach the Vertex V
curr = head;
while(curr->vertex != V){
curr = curr->nodeListPtr;
}
//Once the Vertex V is found in the linked list add the node to the neighborPtr.
curr->neighborPtr = n;
}
答案 0 :(得分:0)
您目前遇到的一个问题是每个节点只能有一个“边缘”节点。在您的插图中,节点A,C和D都是可能的,但节点B并非没有做一点不同的事情。
问题出现在这里:
curr->neighborPtr = n;
每次将AddEdge()调用到同一个顶点时,它都会覆盖该顶点的neighborPtr。在找到空指针之前,您不会遍历neighborPtrs。
考虑添加另一个while循环以递归添加边:
while (curr->neighborPtr != null)
curr = curr->neighborPtr;
curr->neighborPtr = n;
请注意,这不是代码中的唯一问题;你有几个地方应该防范空指针而不是。例如:在AddEdge()中,如果找不到顶点V会发生什么?您的行为是基于它已经创建的假设。如果没有,最终会出现一些空指针错误。如果您正在尝试制作功能强大的代码,请记住这一点。