链表打印/删除功能炸弹程序

时间:2014-03-06 23:51:22

标签: c++ pointers linked-list

我意识到这可能是一个简单的问题,但我没有抓住它。我的要求是我必须“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;

1 个答案:

答案 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);