2

二重リンクリストに問題があります。別のノードを介してノードからデータを取得できません。このように:node->prev->prev。ただし、node->prevは問題ありません。誰もが理由を知っていますか?

コード:

/*Add value - right side*/
void addListRight(doubleList *node, int value)
        {
        doubleList *newNode;
        newNode = createList();
        newNode->val = value;
        newNode->right = node->right;
        newNode->left = node;
        node->right->left = newNode; /*<-Error start here - 'segmentation error' or something like this*/
        node->right = newNode;
        }

グーグルを使って、私は何人かの人がこのように()を置くのを見つけました:(ノード->右)->右。試してみましたが、結果は同じです。

GCC /Ubuntu10.10の使用

*「->」の適切な単語を言いたいのですが、英語ではわかりません。私の悪い..ごめんなさい!この質問のタグについても同じです。

4

2 に答える 2

2

そのようなポインタを使用する前に、NULLをチェックする必要があります。リストの先頭にprevはありません。

于 2011-01-31T02:18:27.563 に答える
1

セグメンテーション違反エラーが発生しているようです。これは、無効なメモリにアクセスしようとしていることを意味します。私の推測では、あなたは割り当てていないnode->rightか、それはNULLです。すべてのポインタが有効であり、適切に割り当てられていることを確認してください。

参考までに、リンクリストの実装例を次に示します。

#include <stdio.h>
#include <stdlib.h>

typedef struct doubleList doubleList;
struct doubleList
{
   int value;
   doubleList *left, *right;
};

doubleList *addListRight(doubleList *node, int value)
{
    doubleList *newNode;
    newNode = malloc(sizeof(doubleList));
    if(newNode == NULL)
    {
        return NULL;
    }
    newNode->value = value;
    newNode->left = NULL;
    newNode->right = NULL;
    if(node != NULL)
    {
        newNode->left = node;
        node->right = newNode;
    }
    return newNode;
}

int main(int argc, char **argv)
{
    doubleList *list = addListRight(NULL, 5);
    addListRight(list, 2);

    // Outputs: 5, 2
    printf("%d, %d", list->value, list->right->value);

    return 0;
}
于 2011-01-31T02:27:32.320 に答える