我正在编写一个方法,该方法采用一个函数,该函数采用链表的根和图中的顶点数,并根据边结构的第一个顶点将链表组织成链表的数组,例如,在节点Edge具有firVertex = 1,sndVertex = 2和weight = 2的结构中,它将被排序到数组的第一个元素中。另一个节点具有另一个firVertex = 1的节点将被附加到前一个节点等等。我的代码编译但它并不完全按照我的意愿行事。请帮忙。
答案 0 :(得分:0)
您的代码中存在许多问题。
在将newNode
分配给数组列表的元素时,它应该是
arrayList[j]= newNode; //not 'i' since i=numberVertices always....
当您找到与firVertex
匹配的j
时,您正在创建一个指向当前节点的临时指针。然后你这样做:
newNode -> next = NULL;
它实际上将给定列表中节点的next
更改为NULL
,从而将current->next
设为NULL
,您的代码将不会处理整个列表。它应该如下:
Edge* newNode = new Edge(current);//create a copy of the 'current' node..
newNode -> next = NULL;//now make the 'next' of this node NULL..
上述代码可防止列表进行任何修改。我还假设有Edge
的构造函数,它将另一个Edge
指针作为参数。
正如您在问题中指定的那样,如果您有两个Edge
个节点具有相同的firVertex
,则您希望将它们附加到同一列表中。但是您的代码只是覆盖了前一个节点。
为了防止这种情况,可以写成如下:
Edge* newNode = new Edge(current);
newNode -> next = NULL;
Edge* tmp = arrayList[j];
if(tmp==NULL)//then this is the first node..
{
arrayList[j] = new Edge(current);
arrayList[j]->next = NULL;
}
else
{
while(tmp->next!=NULL)//go to the end of the list...
tmp = tmp->next;
tmp->next = new Edge(current);//create a copy of the 'current' node...
tmp->next->next=NULL;//make the next of this new node NULL...
}
希望这有帮助...我强烈认为你需要了解更多关于指针然后开始编码。