将链接列表复制到另一个列表?
Copy Linked List to Another List?
我需要链表方面的帮助,制作一个将一个列表复制到另一个列表的函数
我用 Visual Studio 2012 编码。这是我的代码和我得到的错误:
错误:
Unhandled exception at 0x0111544F in linked list.exe: 0xC0000005:
Access violation writing location 0xCDCDCDCD.
有人可以告诉我错误是什么以及如何解决吗?
#include <iostream>
using namespace std;
struct node
{
int info;
node *next;
};
void PrintList (node *C)
{
node *P;
cout<<"Node content = (";
P = C;
while(P!=NULL)
{
cout<<P->info;
P = P->next;
if(P != NULL)
cout<<",";
}
cout<<")"<<endl;
}
void copylist (node *Y, node **Z)
{
node *P, *Q;
int temp;
if (Y==NULL)
{
cout<<"the list is empty"<<endl;
*Z=NULL;
}
else
{
P=Y;
Q=*Z;
while (P->next!=NULL)
{
temp=P->info;
Q->info=temp;
P=P->next;
Q=Q->next;
}
}
}
void insertnode (int *A, node **Q)
{
node *N, *P;
N=new node;
N->info=*A;
N->next=NULL;
if(*Q==NULL)
*Q=N;
else
{
P=*Q;
while (P->next!=NULL)
P=P->next;
P->next=N;
}
}
int main ()
{
node *z;
node *duplicate;
z=NULL;
duplicate=new node;
int e;
int i;
int *temp;
temp=new int;
cout<<"the number of element : ";
cin>>e;
cout<<" LIST Z CONTENT : " <<endl;
PrintList (z);
for (i=0;i<e;i++)
{
cin>>*temp;
insertnode(temp, &z);
}
copylist(z,&duplicate);
cout<<" DUPLICATE LIST CONTENT : "<<endl;
PrintList(duplicate);
}
请注意,在 main 函数中,您正尝试使用以下代码打印一个空列表:
cout<<" LIST Z CONTENT : " <<endl;
PrintList (z);
因此,您可能希望将打印函数修改为:
void PrintList(node *C)
{
if (C == NULL) return; // return if the list is empty or print out a message
node *P = C;
cout << "Node content = (";
while (P != NULL)
{
cout << P->info;
P = P->next;
if (P != NULL)
cout << ",";
}
cout << ")" << endl;
}
并且在您的复制功能中,您忘记了创建新节点并在复制过程中将 link 保留给它。这是有效的代码:
void copylist(node *Y, node **Z)
{
if (Y == NULL)
{
cout << "the list is empty" << endl;
*Z = NULL;
}
else
{
node*P = Y;
node *Q = NULL;
while (P != NULL)
{
node* newNode = new node; // first create a node (allocate memory)
newNode->info = P->info; // then fill the info
newNode->next = NULL;
if (Q == NULL)
{
Q = newNode;
*Z = Q;
}
else
{
Q->next = newNode;
Q = Q->next;
}
P = P->next;
}
}
}
最后,你的 main 函数没有 return 任何东西!!您可能需要添加
return 0;
最后。
尝试将您的主要功能替换为:
int main()
{
node *z = NULL;
node *duplicate = NULL;
int e;
cout << "The number of elements : ";
cin >> e;
cout << "enter elements with a space between them : ";
while (e--)
{
int temp;
cin >> temp;
insertnode(temp, &z);
}
cout << " LIST Z CONTENT : " << endl;
PrintList(z);
copylist(z, &duplicate);
cout << " DUPLICATE LIST CONTENT : " << endl;
PrintList(duplicate);
cin >> e;
return 0;
}
或者,要将一个列表复制到另一个列表,您可以循环调用insertnode
函数,将原始列表的所有数据循环添加到新列表中。这将使您的复制功能更短。
有关链表的更多信息:
http://en.wikipedia.org/wiki/Linked_list
编码愉快!
不分配内存就无法复制列表。
您有一个访问冲突,因为您在复制时没有在目标列表中创建 新 节点,而是依赖于 [=11= 中的任何内容(损坏的指针) ] 当你使用 node
时。
除此之外,你有一个小的内存泄漏。
注意带有注释的行:
void copylist (node *Y, node **Z)
{
node *P, *Q;
if (Y==NULL)
{
cout<<"the list is empty"<<endl;
//*Z=NULL; // memory leak! lost pointer of caller!
}
else
{
P=Y;
Q=*Z;
while (P->next!=NULL)
{
Q->info = P->info;
P=P->next;
Q->next = new node(); // missing allocation!
Q = Q->next;
}
Q->next = null; // close new list.
}
}
我需要链表方面的帮助,制作一个将一个列表复制到另一个列表的函数
我用 Visual Studio 2012 编码。这是我的代码和我得到的错误:
错误:
Unhandled exception at 0x0111544F in linked list.exe: 0xC0000005: Access violation writing location 0xCDCDCDCD.
有人可以告诉我错误是什么以及如何解决吗?
#include <iostream>
using namespace std;
struct node
{
int info;
node *next;
};
void PrintList (node *C)
{
node *P;
cout<<"Node content = (";
P = C;
while(P!=NULL)
{
cout<<P->info;
P = P->next;
if(P != NULL)
cout<<",";
}
cout<<")"<<endl;
}
void copylist (node *Y, node **Z)
{
node *P, *Q;
int temp;
if (Y==NULL)
{
cout<<"the list is empty"<<endl;
*Z=NULL;
}
else
{
P=Y;
Q=*Z;
while (P->next!=NULL)
{
temp=P->info;
Q->info=temp;
P=P->next;
Q=Q->next;
}
}
}
void insertnode (int *A, node **Q)
{
node *N, *P;
N=new node;
N->info=*A;
N->next=NULL;
if(*Q==NULL)
*Q=N;
else
{
P=*Q;
while (P->next!=NULL)
P=P->next;
P->next=N;
}
}
int main ()
{
node *z;
node *duplicate;
z=NULL;
duplicate=new node;
int e;
int i;
int *temp;
temp=new int;
cout<<"the number of element : ";
cin>>e;
cout<<" LIST Z CONTENT : " <<endl;
PrintList (z);
for (i=0;i<e;i++)
{
cin>>*temp;
insertnode(temp, &z);
}
copylist(z,&duplicate);
cout<<" DUPLICATE LIST CONTENT : "<<endl;
PrintList(duplicate);
}
请注意,在 main 函数中,您正尝试使用以下代码打印一个空列表:
cout<<" LIST Z CONTENT : " <<endl;
PrintList (z);
因此,您可能希望将打印函数修改为:
void PrintList(node *C)
{
if (C == NULL) return; // return if the list is empty or print out a message
node *P = C;
cout << "Node content = (";
while (P != NULL)
{
cout << P->info;
P = P->next;
if (P != NULL)
cout << ",";
}
cout << ")" << endl;
}
并且在您的复制功能中,您忘记了创建新节点并在复制过程中将 link 保留给它。这是有效的代码:
void copylist(node *Y, node **Z)
{
if (Y == NULL)
{
cout << "the list is empty" << endl;
*Z = NULL;
}
else
{
node*P = Y;
node *Q = NULL;
while (P != NULL)
{
node* newNode = new node; // first create a node (allocate memory)
newNode->info = P->info; // then fill the info
newNode->next = NULL;
if (Q == NULL)
{
Q = newNode;
*Z = Q;
}
else
{
Q->next = newNode;
Q = Q->next;
}
P = P->next;
}
}
}
最后,你的 main 函数没有 return 任何东西!!您可能需要添加
return 0;
最后。
尝试将您的主要功能替换为:
int main()
{
node *z = NULL;
node *duplicate = NULL;
int e;
cout << "The number of elements : ";
cin >> e;
cout << "enter elements with a space between them : ";
while (e--)
{
int temp;
cin >> temp;
insertnode(temp, &z);
}
cout << " LIST Z CONTENT : " << endl;
PrintList(z);
copylist(z, &duplicate);
cout << " DUPLICATE LIST CONTENT : " << endl;
PrintList(duplicate);
cin >> e;
return 0;
}
或者,要将一个列表复制到另一个列表,您可以循环调用insertnode
函数,将原始列表的所有数据循环添加到新列表中。这将使您的复制功能更短。
有关链表的更多信息:
http://en.wikipedia.org/wiki/Linked_list
编码愉快!
不分配内存就无法复制列表。
您有一个访问冲突,因为您在复制时没有在目标列表中创建 新 节点,而是依赖于 [=11= 中的任何内容(损坏的指针) ] 当你使用 node
时。
除此之外,你有一个小的内存泄漏。
注意带有注释的行:
void copylist (node *Y, node **Z)
{
node *P, *Q;
if (Y==NULL)
{
cout<<"the list is empty"<<endl;
//*Z=NULL; // memory leak! lost pointer of caller!
}
else
{
P=Y;
Q=*Z;
while (P->next!=NULL)
{
Q->info = P->info;
P=P->next;
Q->next = new node(); // missing allocation!
Q = Q->next;
}
Q->next = null; // close new list.
}
}