这是一个作业问题。我正在努力编写链表数据结构。我认为我的问题出在我的添加函数中。看来我没有设法正确地重新分配头指针,但是我不确定自己在做什么错。
添加():
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
答案 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;