Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程,双链接列表复制问题_C_Linked List - Fatal编程技术网

C编程,双链接列表复制问题

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-&

将单个链接列表复制到双链接列表时遇到问题。不确定发生了什么,但我有一个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->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)
库特