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

使用谷歌,我发现有些人把 () 像这样:(node->right)->right。我试过了,但结果是一样的。

使用 GCC/Ubuntu 10.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 回答