是否有必要使用' new'分配一个新指针到一个结构相同于先前存在指向同一结构的指针?如果是这样,为什么?

时间:2016-07-14 18:12:48

标签: c++ pointers struct new-operator

我正在编写一个在单链接链表中插入新元素的函数。

该函数接受* 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的测试用例)。

为什么这个看似荒谬的内存分配似乎让它成功才是我想知道的。

3 个答案:

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