链表删除和复制

Linked list deletion and duplication

在代码中,我将 newnode 复制到 head 节点以及 temp 节点。但是当我删除一个数据实例时,它似乎也会影响其他位置。当我释放 newnode 时,它也会删除 headtemp 的内容。这是怎么回事?

虽然我最初复制了数据,但数据被释放了。这是由于取消引用?那么如果我想要一个副本列表,并且想在不影响原来的情况下操作这个怎么办呢?

我最初通过 malloc() 分配我想要的内存,但在后来的复制操作中,我在代码中看到它们不是 malloc() 而是只是复制。它是如何工作的?我的两个问题有关系吗?

#include <iostream>
#include <cstdlib>
using namespace std;   

struct node{
    int data;
    struct node*next;
};

int main()
{
    struct node*newnode=(struct node*)malloc(sizeof(struct node));
    newnode->data=2;
    newnode->next=NULL;
    struct node*head=NULL;
    head=newnode;
    struct node*temp=newnode;

    while(head!=NULL)
    {
        cout<<head->data;
        head=head->next;
    }

    cout<<temp->data;
    free(newnode);
    free(head);
    cout<<temp->data;
    return 0;
}

使用struct node *newnode=(struct node*)malloc(sizeof(struct node));,你为一个节点分配了一块内存,然后你将这块内存的地址分配给所有其他节点指针。因此,当您释放这块内存时,该节点对任何节点指针都不再可用。

struct node *head=newnode;    // head now points to *newnode
struct node *temp=newnode;    // temp now also points to *newnode
...
free(newnode);    // newnode, head and temp point to released memory now
free(head);       // oops! head was released already by the previous statement

注意:这是C解释。在 C++ 中,class 的构造函数可以进行内存分配,重新定义的赋值运算符可以创建对象的新实例(但我不是 C++ 程序员)。

以下函数创建列表的副本:

struct node *copylist(struct node *oldlist)
{
    struct node *newhead, *list;
    if (!oldlist) return(0);
    list= newhead= malloc(sizeof(struct node));
    *newhead= *oldlist;
    while (oldlist->next) {
        list->next= malloc(sizeof(struct node));
        oldlist= oldlist->next;
        list= list->next;
        *list= *oldlist;
    }
    list->next= NULL;
    return(newhead);
}