C编程,双链接列表复制问题
将单个链接列表复制到双链接列表时遇到问题。不确定发生了什么,但我有一个gdb调试错误:C编程,双链接列表复制问题,c,linked-list,C,Linked List,将单个链接列表复制到双链接列表时遇到问题。不确定发生了什么,但我有一个gdb调试错误: Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000 0x0000000100000d86 in doublify (list=0x1001008c0) at lists.c:62 62 newDlist-&
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
0x0000000100000d86 in doublify (list=0x1001008c0) at lists.c:62
62 newDlist->item = curr->item;
单向链接列表正在工作
My.h头文件:
typedef struct _node {
Item item;
link next;
} node;
typedef struct _dnode *dlink;
typedef struct _dnode {
Item item;
dlink prev;
dlink next;
} dnode;
我的代码:
link newLink (Item item){
link createLink = malloc(sizeof(node));
createLink->item = item;
return createLink;
}
link fromTo (int start, int end) {
link newList = NULL;
if(start <= end ){
newList = newLink(start);
newList->next = fromTo(start+1, end);
}
return newList;
}
//Heres where it isn't able to copy the linklist item over into the new dlist.
dlink doublify (link list) {
dlink newDlist = malloc (sizeof (dnode));
link curr = list;
while(curr != NULL){
newDlist->item = curr->item;
curr = curr->next;
newDlist = newDlist->next;
}
return newDlist;
}
link新建链接(项目){
link createLink=malloc(sizeof(node));
createLink->item=项目;
返回createLink;
}
链接fromTo(整数开始,整数结束){
链接newList=NULL;
如果(开始下一步=从开始到(开始+1,结束);
}
返回newList;
}
//此处无法将链接列表项复制到新的数据列表中。
dlink Doubly(链接列表){
dlink newDlist=malloc(sizeof(dnode));
链接电流=列表;
while(curr!=NULL){
新建列表->项目=当前->项目;
当前=当前->下一步;
新建列表=新建列表->下一步;
}
返回newDlist;
}
在doublify
函数中,您只为双链接列表中的第一个dnode
分配足够的空间。当您使用curr
在单链接列表中漫游时,您需要在每次循环迭代中为新的dnode
分配空间,单链接列表中的每个元素一个
您收到错误是因为在第二次迭代中,您试图访问newDlist->next
,这是一个未初始化的内存地址
请注意,在创建双链接列表时,您还需要保留一个指向上一个
dnode
的tmp指针,以便正确设置prev
/下一个指针。在doublify
函数中,您只为双链接列表中的第一个dnode
分配足够的空间k在使用curr
的单链表中,您需要在每次循环迭代中为新的dnode
分配空间,单链表中的每个元素分配一个空间
您收到错误是因为在第二次迭代中,您试图访问newDlist->next
,这是一个未初始化的内存地址
请注意,在创建双链接列表时,您还需要保留一个指向上一个dnode
的tmp指针,以便正确设置prev
/next
指针。问题发生在while循环的第二次迭代中。将newDlist分配给“next”项时,“next”字段可能包含任何问题是malloc只给你一个指针,指向一个可能有任何值的数据区域(它不会以某种方式清理它或初始化)
您只需要在每次迭代中分配一个新节点,并适当地设置指针
dlink prevNode = NULL;
// Insert the first item (if present) to simplify the loop
if ( curr != NULL )
{
dlink newDlist = malloc(sizeof(dnode));
newDlist->item = curr->item;
newDlist->next = NULL;
newDlist->prev = NULL;
prevNode = newDlist;
curr = curr->next;
}
while ( curr != NULL )
{
dlink newDlist = malloc(sizeof(dnode));
newDlist->item = curr->item;
prevNode->next = newDlist;
newDlist->prev = prevNode;
newDlist->next = NULL;
prevNode = newDlist;
curr = curr->next;
}
问题发生在while循环的第二次迭代中。当您将newDlist分配给“next”项时,“next”字段可能包含任何值。“next”字段可能包含任何值。问题在于,malloc只给您一个指向任何值可能所在的数据区域的指针(它不会以某种方式清理它或初始化)
您只需要在每次迭代中分配一个新节点,并适当地设置指针
dlink prevNode = NULL;
// Insert the first item (if present) to simplify the loop
if ( curr != NULL )
{
dlink newDlist = malloc(sizeof(dnode));
newDlist->item = curr->item;
newDlist->next = NULL;
newDlist->prev = NULL;
prevNode = newDlist;
curr = curr->next;
}
while ( curr != NULL )
{
dlink newDlist = malloc(sizeof(dnode));
newDlist->item = curr->item;
prevNode->next = newDlist;
newDlist->prev = prevNode;
newDlist->next = NULL;
prevNode = newDlist;
curr = curr->next;
}
马克西姆有一个很好的答案,这对我很有帮助,但是如果你有
void DisplayList(topNode* nodeType) {
node* ptrNode = nodeType;
while (ptrNode->next != NULL) {
// DO WORK
}
}
…那么你需要把它改成
void DisplayList(topNode* nodeType) {
node* ptrNode = new node; // THIS IS THE KEY...ALLOCATE THE MEMORY
if (ptrNode == NULL)
cout << "Could not allocate memory -- exiting application!" << endl;
else {
ptrNode = nodeType; // THEN COPY THE TOP NODE POINTER
while (ptrNode->next != NULL) {
// DO WORK
}
}
}
void显示列表(topNode*nodeType){
node*ptrNode=new node;//这是键…分配内存
if(ptrNode==NULL)
Maksim有一个很好的答案可以帮助我,但是如果你有
void DisplayList(topNode* nodeType) {
node* ptrNode = nodeType;
while (ptrNode->next != NULL) {
// DO WORK
}
}
…那么你需要把它改成
void DisplayList(topNode* nodeType) {
node* ptrNode = new node; // THIS IS THE KEY...ALLOCATE THE MEMORY
if (ptrNode == NULL)
cout << "Could not allocate memory -- exiting application!" << endl;
else {
ptrNode = nodeType; // THEN COPY THE TOP NODE POINTER
while (ptrNode->next != NULL) {
// DO WORK
}
}
}
void显示列表(topNode*nodeType){
node*ptrNode=new node;//这是键…分配内存
if(ptrNode==NULL)
库特