【问题标题】:Organize a linkedlist into an array of linkedlist in C++在 C++ 中将链表组织成链表数组
【发布时间】:2014-01-22 05:56:25
【问题描述】:

我正在编写一个方法,该方法采用一个函数,该函数采用链表的根和图中的顶点数,并根据边结构的第一个顶点将链表组织成链表数组,例如例如,在节点 Edge 的 firVertex = 1、sndVertex = 2 和 weight = 2 的结构中,它将被排序到数组的第一个元素中。另一个具有另一个 firVertex = 1 的节点 Edge 将附加到前一个节点上,等等。我的代码可以编译,但它并不完全符合我的要求。请帮忙。

【问题讨论】:

  • 看起来你正在返回一个指向局部变量的指针。
  • 我对一般的编程和 C++ 非常陌生,你能给我一个关于修复什么的建议吗?
  • 如果是 C++,则返回 std::vector
  • 我感觉你的代码还有其他问题,你应该先多了解C中的内存管理,而不是一味的尝试去修复,你不能在不知道的情况下写C代码。跨度>

标签: c++ arrays pointers linked-list


【解决方案1】:

您的代码中有很多问题。

newNode 分配给数组列表的元素时,它应该是

arrayList[j]= newNode; //not 'i' since i=numberVertices always....

当您找到与j 匹配的firVertex 时,您正在创建一个指向当前节点的临时指针。然后你这样做:

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 指针作为参数。

正如您在问题中指定的那样,如果您有两个具有相同 firVertexEdge 节点,您希望将它们附加到同一个列表中。但是您的代码只是覆盖了前一个节点。 为了防止这种情况,可以写成如下:

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...
}

希望这会有所帮助……我强烈认为您需要了解更多关于指针的知识,然后开始编码。

【讨论】:

    猜你喜欢
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多