我意识到这可能是一个简单的问题,但我没有抓住它。我的要求是我必须“4)删除链接列表并再次打印列表。(确保它从内存中消失)”
所以我调用了delete函数并单步执行它,当函数完成时,head应设置为NULL。
/*----------------------------------------------------------------------------
* Function: deleteList
* Purpose: delete a link list
* Arguments: head - a pointer to the first node in the linked list
* Returns: N/A
------------------------------------------------------------------------------*/
void deleteList(node *head)
{
struct node *temp;
// Loop through the list, deleting one node at a time.
while(head != NULL)
{
temp = head->next;
delete(head);
head = temp;
}
}
因此,当我调用print函数并发送head时,它应为NULL并捕获第一个if语句并返回main。但它反而爆炸了。
/*----------------------------------------------------------------------------
* Function: printList
* Purpose: prints a link list
* Arguments: head - a pointer to the first node in the linked list
* Returns: N/A
------------------------------------------------------------------------------*/
void printList(node *head)
{
if (head == NULL)
{
cout << "Empty List!\n";
return;
}
struct node *temp;
temp = head;
// Loop through the list, printing one node at a time.
while(temp->next != NULL)
{
cout << temp->next->element << endl;
temp = temp->next;
}
}
现在如果我在main中使用以下内容它可以正常工作。但是我想知道打印功能中缺少什么小东西。我现在已经开了一段时间了,所以我想我会退后一步,寻求一点指导。
int main()
{
....
cout << "\n***************** DELETE LIST & PRINT ********************\n";
deleteList(head);
cout << head->element << endl; // This works and shows the list is empty.
//printList(head); // This bombs the program.
....
}
非常感谢。
节点定义如下:
struct node
{
string element;
struct node *next;
};
在主要部门宣布:
struct node *head;
//creating head node.
if ((head=new(node)) == NULL)
{
cout << "Error: Could not create head node.\n";
return 1;
}
head->next = NULL;
答案 0 :(得分:3)
在主要
中使用时deleteList(head);
指向同一位置的指针“head”的副本作为参数传递。 因此,如果您更改“head”指向的变量,例如:
delete(head);
这将在main()中可见。但是当你更新指针“head”本身时,例如:
head = temp;
更新的唯一指针是函数范围内的指针,而不是主指针中的指针。所以现在主要的“头部”指针指向一个已删除的变量。
要解决此问题,您可以返回“head”应指向的新位置,如下所示:
node *deleteList(node *head)
{
struct node *temp;
// Loop through the list, deleting one node at a time.
while(head != NULL)
{
temp = head->next;
delete(head);
head = temp;
}
return head;
}
并用
调用它head = deleteList(head);