当前位置: 首页 > 知识库问答 >
问题:

添加新节点时,链表节点尾部不更新

司浩壤
2023-03-14

我正在玩一个链接列表类项目的指针,我不知道如何创建到新节点的链接。我有一个Linked List类,它包含像append这样的方法来操作数据结构。我希望这些节点是从csv文件中读取的出价。

当我从CSV加载所有数据时,我想

  1. 创建一个新的出价
  2. 将新的出价传递给append函数
  3. 设置Bid对象的nextBid指针,并更新链接列表的尾部

我将不胜感激为每个出价对象创建新地址的任何指针,因为现在尾节点只'记得'第一个出价的地址。

Old Tail: 0x7ffeefbfee48
New Tail: 0x7ffeefbfee48
Old Tail: 0x7ffeefbfee48
New Tail: 0x7ffeefbfee48

我复制了下面的代码,省略了与从csv文件加载出价无关的部分:

#include <algorithm>
#include <iostream>
#include <time.h>

#include "CSVparser.hpp"

using namespace std;

// forward declarations
double strToDouble(string str, char ch);

// define a structure to hold bid information
struct Bid {
    string bidId; // unique identifier
    string title;
    string fund;
    double amount;
    Bid* nextBid; //each bid has a pointer that can point to another bid
    Bid() {
        amount = 0.0;
    }
};

class LinkedList {
    
private:
    // FIXME (1): Internal structure for list entries, housekeeping variables
    Bid* head;
    Bid* tail;
    
public:
    LinkedList();
    virtual ~LinkedList();
    void Append(Bid bid);
    void Prepend(Bid bid);
    void PrintList();
    void Remove(string bidId);
    Bid Search(string bidId);
    int Size();
};

LinkedList::LinkedList() {
    // FIXME (2): Initialize housekeeping variables
    head=nullptr; //initialize head to point to nothing
    tail=nullptr;
}

void LinkedList::Append(Bid bid) { //<---I'm having trouble with this method
    // FIXME (3): Implement append logic
    if (this->head==nullptr){ //first node in a linked list
        cout << "initialize head and tail" << endl;
        this->head=&bid; //point to the bid
        this->tail=&bid;
    }
    else {
        cout << "Old Tail: " << this->tail << endl;
        this->tail->nextBid=&bid; //this refers to bid
        this->tail=&bid; //update last bid
        cout << "New Tail: " << &bid << endl;
        this->tail->nextBid=nullptr; //set pointer after last bid to null
    }
}

void displayBid(Bid bid) {
    cout << bid.bidId << ": " << bid.title << " | " << bid.amount
    << " | " << bid.fund << endl;
    return;
}

void LinkedList::PrintList() {
    // FIXME (5): Implement print logic
    //dont loop with the head, loop with bid name, because you dont want head pointer to change
    Bid* bid = this->head; //start at list's beginning
    cout << "List Head: " << this->head << endl;
    while(bid!=nullptr){
        displayBid(*(bid));
        cout << "Printing Address: " << bid << endl;
        bid = bid->nextBid; //move to the next bid
    }
}

Bid getBid() {
    Bid bid;
    //enter bid title, amount, etc.    
    return bid;
}

int main(int argc, char* argv[]) {
    
    // process command line arguments
    string csvPath = "eBid_Monthly_Sales_Dec_2016.csv";
    
    LinkedList bidList;
    
    Bid bid;
    
    int choice = 0;
    while (choice != 9) {
        cout << "Menu:" << endl;
        cout << "  1. Enter a Bid" << endl;
        cout << "  2. Load Bids" << endl;

        switch (choice) {
            case 1:{
                Bid addBid;
                cout << "new Bid Object's address is " << &addBid << endl; //address of the pointer
                bidList.Append(addBid);
//                displayBid(bid);
                bidList.PrintList();
                break;
            }
                

共有3个答案

岳谦
2023-03-14

append()中的参数不应该是Bid,而应该是Bid*。这是因为,由于参数是通过函数中的值传递的,所以bid对象只是原始对象的副本
这意味着当分配

陈浩
2023-03-14

此处第行void LinkedList::Append(Bid-Bid)Bid是一个局部变量,将在控件从函数返回后解除分配。

现在这里这个-

您可以做的是动态分配节点,并将其地址传递给Append方法

void LinkedList::Append(Bid* bid) // function signature

添加节点:

Bid addBid;
bidList.Append(&addBid);

岳正浩
2023-03-14

问题是您试图在append函数中为临时变量分配指针

void LinkedList::Append(Bid bid) { //<---I'm having trouble with this method
// FIXME (3): Implement append logic
if (this->head==nullptr){ //first node in a linked list
    cout << "initialize head and tail" << endl;
    this->head=&bid; //point to the bid
    this->tail=&bid;
}
else {
    cout << "Old Tail: " << this->tail << endl;
    this->tail->nextBid=&bid; //this refers to bid
    this->tail=&bid; //update last bid
    cout << "New Tail: " << &bid << endl;
    this->tail->nextBid=nullptr; //set pointer after last bid to null
}

Bid对象传递给函数,而不是指针,然后将tail指针设置为指向该对象,但该对象将在函数结束后删除,因为它是在本地创建的。因此,tail将指向已删除的对象,这将导致未定义的行为(就我个人而言,我在Linux上遇到“分段错误”)。作为一个选项,您可以将指向Bid对象的指针传递给函数,所有操作都将正常工作,因为指针将被设置为在函数外部声明的有效Bid对象。

void LinkedList::Append(Bid* bid) { //<---I'm having trouble with this method
// FIXME (3): Implement append logic
if (this->head==nullptr){ //first node in a linked list
    cout << "initialize head and tail" << endl;
    this->head=bid; //point to the bid
    this->tail=bid;
}
else {
    cout << "Old Tail: " << this->tail << endl;
    this->tail->nextBid=bid; //this refers to bid
    this->tail=bid; //update last bid
    cout << "New Tail: " << bid << endl;
    this->tail->nextBid=nullptr; //set pointer after last bid to null
}
 类似资料:
  • 我需要在XML中保留很少的值,并且需要通过XSLT添加新的节点。 价值需要保留,新的选项需要添加。 如何实现这一点。下面是我的代码。 有人能帮忙吗? 谢谢

  • 公共类插入节点{ } 您好,代码在LinkedList add head和add last的实现之上。但是,当我运行代码时,我可以添加新节点作为链表上的最后一个节点,但我不能将新节点添加到链表的请求中。 运行此代码时,输出为: 加数法有效,但为什么不加前置呢?

  • 我正在尝试按顺序逐个删除窗格中的所有节点,以便可以看到每一行被删除。为此,我创建了一个新线程,使用task类,并将方法delWalls()包装在一个平台中。runLater()。然后我用了线。睡眠会让循环变慢,这样当每一行被删除时,我就可以看到UI更新了,但是发生的是整个UI冻结,然后循环完成后,所有节点都消失了?有办法解决这个问题吗。。。谢谢 *所有节点都是线顺便说一句 //delWalls方法

  • 问题内容: 这是我所拥有的: 如何编写代码以在列表末尾添加节点? 所以如果我有 我怎么去 其实…我什至不确定是否要添加到最后。我认为添加然后排序是有效的吗?不确定。 谢谢! 问题答案:

  • 我在课堂上有一个关于Java的作业。它是关于雇员的,所以有三个类,雇员,雇员列表和节点。我需要用这个做一个双链接列表。链表是我们定制的类,而不是Java提供的类。 现在我被困在添加(雇员)方法中。该方法输入参数一个雇员对象,并被要求添加到列表的末尾。 这是密码 简单地说,当列表为空时,该方法会将员工完美地添加到节点中,即使我将第二个员工添加到列表中,也没有问题;但当我再添加,并尝试检索它时,我最终

  • 而这是我的主课,有没有其他方法做得更有效率?