链表删除和复制
Linked list deletion and duplication
在代码中,我将 newnode
复制到 head
节点以及 temp
节点。但是当我删除一个数据实例时,它似乎也会影响其他位置。当我释放 newnode
时,它也会删除 head
和 temp
的内容。这是怎么回事?
虽然我最初复制了数据,但数据被释放了。这是由于取消引用?那么如果我想要一个副本列表,并且想在不影响原来的情况下操作这个怎么办呢?
我最初通过 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);
}
在代码中,我将 newnode
复制到 head
节点以及 temp
节点。但是当我删除一个数据实例时,它似乎也会影响其他位置。当我释放 newnode
时,它也会删除 head
和 temp
的内容。这是怎么回事?
虽然我最初复制了数据,但数据被释放了。这是由于取消引用?那么如果我想要一个副本列表,并且想在不影响原来的情况下操作这个怎么办呢?
我最初通过 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);
}