【问题标题】:C++: How to do a linked list with struct passed as parameter?C ++:如何使用结构作为参数传递的链表?
【发布时间】:2018-09-22 13:53:08
【问题描述】:

所以我(大部分)理解带指针的链表的概念。但是,我不确定如何创建结构对象的链表,该链表在方法中传递。我需要另一个指针来指向结构上的指针吗? 我的结构包含指针:

// define a structure to hold bid information
struct Bid {
    string bidId; // unique identifier
    string title;
    string fund;
    double amount;
    Bid *next;
    Bid() {
        amount = 0.0;
        next = NULL;
    }
};

我将结构对象传递给此方法以附加新的投标结构:

  void LinkedList::Append(Bid bid) {
    // FIXME (3): Implement append logic

    //reference bid being passed??? Bid struct has pointers, do we need another pointer?
    Bid *currNode = &bid;

    //set node's next pointer to NULL (end)
    currNode->next = NULL;

    //if list is empty
    if (head == NULL) {
        head = currNode;
        tail = currNode;
    }
    else {
        tail->next = currNode;
        tail = currNode;
    }
}

【问题讨论】:

  • 我不明白你的确切问题是什么
  • 你不需要传递结构。你可以只传递一个指向它的指针。
  • 我正在尝试访问正在传递的结构对象的指针,并用它创建一个链表。这就是我习惯的做法ListAppend(list, newNode) { if (list->head == 0) { // List empty list->head = newNode list->tail = newNode } else{ list->tail->next = newNode list->tail = newNode } }
  • 你有什么理由不使用std::forward_list - 你的是另一个重新实现,用“C with objects”风格编写,手动内存管理极易出错。这是一道作业题——请注明。

标签: c++ data-structures linked-list


【解决方案1】:

按值传递链表节点的问题在于它们会被复制。您可以在函数中设置一个指向bid 值的指针,但这几乎肯定不是您想要的,因为它会在函数结束时消失,从而使指针悬空。链表节点实际上总是堆分配的,并通过指针传递,因为您可以手动控制堆分配对象的生命周期(这在这里很重要)。

现在,从 OO 的角度来看,让这有点问题的是,您的 Bid 类违反了单一责任原则 (SRP),因为它既是有关投标的具体信息的存储 /em> 将某些投标链接在一起的参与者。这是您很少在 OO 语言中看到侵入式容器的原因之一。根据您的具体用例,最好将无指针的Bid 存储在BidNode 中,这样可以进行链接。如果这样做,您可以按值传递Bid,并将其复制到堆分配的BidNode 中。或者,当然,您也可以使用 std::list

【讨论】:

  • OO 语言中的侵入式容器没有问题,只要将侵入作为单独的关注点处理即可。是的,Bid 中应该没有链接,但它并不排除列表实现将对象与链接一起放置,在 Bid 类不知道任何相关信息的情况下实现侵入式列表。
  • 是的,这就是我讨论过的BidNode 方法。但这仍然是一个突出的容器,因为进行链接的对象与存储的对象不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2013-01-18
  • 1970-01-01
相关资源
最近更新 更多