我正在编写一个在单链接链表中插入新元素的函数。
该函数接受* head到列表,要放入新元素的数据和l-list中的位置应插入。
如果我不够清楚,This是编程练习的链接。
以下代码完美无缺 -
/*
Insert Node at a given position in a linked list
head can be NULL
First element in the linked list is at position 0
Node is defined as
struct Node
{
int data;
struct Node *next;
}
*/
Node* InsertNth(Node *head, int data, int position)
{
//Takes head of list as input and returns it after inserting a new element
//with `data` at `position` in the l-list
Node *temp = new Node;
temp = head;
Node *newn = new Node;
newn->data = data;
if(position == 0){
newn->next = head;
return newn;
}
while(--position){
temp = temp->next;
}
newn->next = temp->next;
temp->next = newn;
return head;
}
但是,我不明白为什么必须使用Node *temp = new Node; temp = head;
。
为什么不简单地使用Node *temp = head;
工作?
我只使用临时指针遍历l-list,以便在返回最终列表时保留头部的位置。
编辑 - 我了解Node *temp = head;
是要走的路。这也是我最初编程的方式,但我忘了提到这就是给我一个 segfault 的东西。当我将其更改为Node *temp = new Node; temp = head;
时,它适用于所有测试用例(包括head为NULL的测试用例)。
为什么这个看似荒谬的内存分配似乎让它成功才是我想知道的。
答案 0 :(得分:4)
您上面发布的代码泄漏。
Node *temp = new Node; temp = head;
这不好。
Node *temp = head;
这样更好。
您的代码中还有其他问题;但是你的分析表明它很新,然后立即重新分配指针正确。好好发现。
答案 1 :(得分:1)
在我之前发布的答案都是错误的,确定他们指出你的代码泄漏了,但是他们没有检查代码的其余部分,看看它是否真的完成了应该做的事情。您的代码容易出错,因为您没有考虑到头部为NULL,这是明确说明的。
// Returns the new node inserted at the given Position inside the l-list
Node* InsertNth(Node *head, int data, int position)
{
Node *newn = new Node;
newn->data = data;
newn->next = 0;
// No head, return node right away
if(!head)
{
return newn;
}
// Exception - only case where head is not returned
else if(!position)
{
newn->next = head;
return newn;
}
// Create ´temp´ which is a pointer to the next node in the list
Node *temp = head;
// The function allows passing of a signed int, make sure we stay above 0
// as the previously while(--position) would go into an endless loop
// if a signed integer were passed on to the function
while(--position > 0)
{
// Just incase the input is bad, and position exceeds the size of the list
if(!temp->next)
{
break;
}
temp = temp->next;
}
// Now that we found the place in line, insert it between the temp and the next item
// in the list. Which may also be NULL
newn->next = temp->next;
temp->next = newn;
return head;
}
现在您可以看到进行了一些更改,之前的代码没有考虑到head为NULL,并且没有正确地将成员'next'设置为0,这最终会导致崩溃有人迭代了所谓的空终止的单链表。
答案 2 :(得分:0)
使用
Node *temp = new Node;
temp = head;
导致内存泄漏。第一行中分配的内存丢失。你需要使用:
Node *temp = head;