添加新节点后,链表头始终为空

时间:2019-05-11 01:24:52

标签: c++ linked-list

这是一个作业问题。我正在努力编写链表数据结构。我认为我的问题出在我的添加函数中。看来我没有设法正确地重新分配头指针,但是我不确定自己在做什么错。

添加():

template<class listType>
void LinkedList<listType>::Add(int i, string n, listType h, listType r)
{
    Node<listType>* newnode = new Node<listType>(i, n, h, r);
    head = newnode;

    newnode->SetNext(head);

但是当从main调用显示功能(将打印头传递到打印头)时,打印功能始终显示列表为空

打印功能:

template<class listType>
 void LinkedList<listType>::Display()
{
    Print(head);
}

template<class listType>
void LinkedList<listType>::Print(Node<listType>* temp)
{
    if (temp == NULL)
    {
        cout << "\nEnd of list.\n";
        return;
    }
    else 
    {
        cout << temp->GetName() << "\n";
        Print(temp->GetNext());
    }
}

我也尝试通过参考传递头,但无济于事。

完整链接列表源:

template <class listType>
class LinkedList {

private:
    Node<listType>* head;
public:
    LinkedList();
    ~LinkedList();
    void Add(int i, string n, listType h, listType r);
    void Display();
    void Print(Node<listType>*);
};

template<class listType>
 bool LinkedList<listType>::IsEmpty() const
{
    return head == NULL;
}

template<class listType>
 LinkedList<listType>::LinkedList()

{
    head = NULL;
}

template<class listType>
 LinkedList<listType>::~LinkedList()
{
}

template<class listType>
void LinkedList<listType>::Add(int i, string n, int h, int r)
{
    Node<listType>* newnode = new Node<listType>(i, n, h, r);
    head = newnode;

    newnode->SetNext(head);

    cout << newnode->GetId() << "\t" << newnode->GetName() << "\t";
    cout << newnode->GetHours() << "\t" << newnode->GetRate() << "\n";
}

template<class listType>
 void LinkedList<listType>::Display()
{
    Print(head);
}

template<class listType>
void LinkedList<listType>::Print(Node<listType>* temp)
{
    if (temp == NULL)
    {
        cout << "\nEnd of list.\n";
        return;
    }
    else 
    {
        cout << temp->GetName() << "\n";
        Print(temp->GetNext());
    }
}

编辑:添加主要功能以及数据示例:

主要

int main()
{
    LinkedList<int> integerList;

    fstream fin("data1.txt");
    LoadData<int>(integerList, fin, "data1.txt");
    cout << "\n testing Display()\n\n";

    integerList.Display();

    return 0;
}

从文本文件填充列表的功能:

template<class type>
void LoadData(LinkedList<type> list, fstream& fin, string fileName)
{
    int id;
    string nameFirst, nameLast, nameFull;
    type hours, rate;

    if (fin.is_open())
    {
        cout << "Loading: " << fileName << '\n';
        while (!fin.eof())
        {
            fin >> id >> nameLast >> nameFirst >> hours >> rate;
            nameFull = nameFirst + " " + nameLast + "\b \b";
            list.Add(id, nameFull, hours, rate);

        }
        cout << fileName << " loaded succesfully.\n";
    }
    else {
        cout << "File not found, exiting.";

    }
    fin.close();
}

文本文件示例:

21169
Ahmed, Marco
40 10
24085
ATamimi, Trevone
30 15
28139
Choudhury, Jacob 
45 12

1 个答案:

答案 0 :(得分:4)

您的第一个问题是您要按值将列表从LoadData传递到main。这意味着LoadData函数实际上从main获取列表的副本并将其添加到副本中。原始列表不受影响。

因此,当您调用integerList.Display()时,它实际上从未更改,仍然为空。

相反,您应该这样引用LoadData来传递列表:

void LoadData(LinkedList<type>& list, fstream& fin, string fileName)

您的下一个问题是您的函数void LinkedList<listType>::Add(int i, string n, listType h, listType r)。以下代码创建一个长度为1的循环。

head = newnode;
newnode->SetNext(head);

您要做的是将newnode添加到列表head的前面,并更新head

newnode->SetNext(head);
head = newnode;