所以我试图在列表容器类中用C ++创建一个链表。 list类包含成员头(一个节点)和insert函数,而node类包含我需要添加的数据(名字,姓氏,年龄)。但是,我不认为我实际上是在创建一个列表,而只是在输入循环中写入p
这是主程序中从文件中读取数据的while循环
while(!infile.eof())
{ infile >> first >> last >> age;
// Process if okay
if(infile.good())
a.insert(first,last,age);
};
这是实际的插入函数定义
void list::insert(string first, string last, int age)
{
node *p;
p = new node;
p->first = first;
p->last = last;
p->age = age;
if (head == NULL)
{
head = p;
head->put(cout);
} else
{
if (head->next != NULL)
{
head->put(cout);
insert((p->next)->first, (p->next)->last, (p->next)->age);
} else
{
p->next = p;
p->put(cout);
}
}
}
我无法更改Node标头或主程序,因此我需要在函数调用中使用这些参数。有任何想法吗?
答案 0 :(得分:0)
当列表为空时,在链表中插入节点很简单。
head = p;
你已经完成了。
当列表不为空时,在链表的末尾插入一个节点有点牵扯。以图示方式,我们说你有:
并且您希望在结尾添加新节点。您需要在现有链接列表的最后一个节点和新节点之间建立链接,以便最终得到:
为了能够做到这一点,你必须走链表才能到达最后一个节点。然后,您可以使用:
lastNode->next = p;
你已经完成了。
忽略创建输出的调用,这是你的函数的样子。
void list::insert(string first, string last, int age)
{
node *p = new node;
p->first = first;
p->last = last;
p->age = age;
if (head == nullptr)
{
// The simple case
head = p;
}
else
{
// Gather the last node in the linked list.
node* lastNode = head;
while ( lastNode->next != nullptr )
{
lastNode = lastNode->next;
}
lastNode->next = p;
}
}
使用递归插入节点看起来非常不同。这是一个未经考验的建议:
void list::insert(node*& ptr, node* p)
{
if ( ptr == nullptr )
{
ptr = p;
}
else
{
insert(ptr->next, p);
}
}
void list::insert(string first, string last, int age)
{
node *p = new node;
p->first = first;
p->last = last;
p->age = age;
insert(head, p);
}
我不推荐使用递归方法。它不仅消除了算法的可读性,而且在运行时也更加昂贵。如果你有一个包含大量项目的链表,它甚至可能导致堆栈溢出。