Связанный список в C

У меня проблема с двойными связанными списками: я не могу получить данные из узлов через другой узел. Таким образом: узел->предыдущий->предыдущий. Но 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;
        }

Используя Google, я обнаружил, что некоторые ребята вводят () примерно так: (узел->право)->право. Я пробовал, но результат тот же.

Использование GCC/Ubuntu 10.10

* Я хотел бы сказать правильное слово для '->', но я не знаю его по-английски. Мой плохой .. извините! То же самое о тегах этого вопроса!


person Shuryon    schedule 31.01.2011    source источник
comment
Если node является началом списка, уверены ли вы, что в поле right есть что-то (кроме нулевого указателя)?   -  person Felix Dombek    schedule 31.01.2011
comment
Хм.. Я не был уверен.. Точнее, я думал, что это правильно :P Но спасибо за вашу помощь! Я дурак, который не мог найти ответ между строк каждого вашего правильного ответа, ребята! Весь код был таким: shuryon.com.br/C-CPP/list.c Функциональный: shuryon.com.br/C -CPP/list-ok1.c Проблема решена!   -  person Shuryon    schedule 31.01.2011


Ответы (2)


Вы должны проверить NULL перед использованием такого указателя. В начале списка не будет prev.

person Eric Giguere    schedule 31.01.2011
comment
Да, я сделал (не в коде выше). Здесь: www.shuryon.com.br/C-CPP/list.c Можете ли вы проверить? - person Shuryon; 31.01.2011
comment
@Shuryon: ваш код по этому URL-адресу не проверяет его. В addNodeRight() вам нужно if (node->right) { node->right->left = newnode; }. - person caf; 31.01.2011
comment
Спасибо чувак! С этим и еще одним, если я могу увидеть его в действии! shuryon.com.br/C-CPP/list-ok1.c А вот еще вариант без этих "если": shuryon.com .br/C-CPP/list-ok2.c - person Shuryon; 31.01.2011

Похоже, вы получаете ошибку ошибки сегментации. Это означает, что вы пытаетесь получить доступ к недопустимой памяти. Я предполагаю, что вы не выделили 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;
}
person Tim Cooper    schedule 31.01.2011
comment
Я проверил (не так, как ты) Блин о_О Странно! Я не знаю, что такое, правда! Я опубликую весь код здесь: www.shuryon.com.br/C-CPP/list.c - person Shuryon; 31.01.2011