1

単一のリンクリストを二重のリンクリストにコピーするのに問題があります。何が起こっているのかわかりませんが、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;

一方向のリンク リストが機能しており、

私の .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;
}
4

3 に答える 3

3

関数では、二重にリンクされたリストの最初doublifyに十分なスペースのみを割り当てます。を使用して片方向リストをたどるとき、ループの反復ごとに、片方向リストの各要素に 1 つずつ、新しいatにスペースを割り当てる必要があります。 dnodecurrdnode

newDlist->next2 回目の反復で、初期化されていないメモリ アドレスであるにアクセスしようとしているため、エラーが発生します。

/ポインターを正しくdnode設定するために、双方向リンク リストを作成する際に、前のリストへの tmp ポインターを保持する必要があることに注意してください。prevnext

于 2012-07-28T06:24:17.307 に答える
1

この問題は、while ループの 2 回目の繰り返しで発生します。newDlist を「次の」項目に割り当てると、「次の」フィールドには任意の値が含まれる場合があります。問題は、malloc は、値が存在する可能性のあるデータ領域へのポインターを単に提供することです (何らかの方法でデータ領域を消去したり、初期化したりすることはありません)。

各反復で新しいノードを割り当て、ポインターを適切に設定するだけです。これを行う方法の 1 つを次に示します。

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;
}
于 2012-07-28T06:40:06.280 に答える
0

マクシムは私を助けてくれた良い答えを持っていますが、あなたが持っているなら答えを簡単にするために...

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

私はクラスで同じ問題に遭遇したので、将来誰かの労力を節約できるかもしれません!

于 2014-03-16T16:05:41.220 に答える