2011-01-31 9 views
2

У меня возникла проблема с двойными связанными списками: я не могу получить данные от узлов через другой узел. Таким образом: узел-> prev-> prev. Но node-> prev в порядке. Кто-нибудь знает почему?Связанный список в C

Код:

/*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, я обнаружил, что некоторые парни ставить(), как это: (node-> справа) -> право. Я попробовал, но результат тот же.

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

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

+1

Если 'node' начало списка, вы уверены, что есть что-то (кроме нулевого указателя) в поле' right'? –

+0

Ун .. Я не был уверен. Точнее, я думал, что это правильно: P Но спасибо за вашу помощь! Я тупица, которая не могла понять ответ между строками каждого правильного ответа от вас, ребята! Весь код был: http://www.shuryon.com.br/C-CPP/list.c Функциональный: http://www.shuryon.com.br/C-CPP/list-ok1 .c Проблема решена! – Shuryon

ответ

2

Перед использованием указателя, вы должны проверить NULL. Во главе списка не будет предваряющей.

+0

Да, я сделал (не в коде выше). Здесь: www.shuryon.com.br/C-CPP/list.c Можно проверить? – Shuryon

+0

@Shuryon: ваш код по этому URL-адресу * не * проверяет его. В 'addNodeRight()' вам нужно 'if (node-> right) {node-> right-> left = newnode; } '. – caf

+0

Спасибо человеку! С этим и еще одним, если я вижу это в действии! http://www.shuryon.com.br/C-CPP/list-ok1.c И здесь одна версия без этого «ifs»: http://www.shuryon.com.br/C-CPP/list -ok2.c – Shuryon

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

Я проверил (не так, как сделал) Человек o_O Странно! Я не знаю, что есть, действительно! Я выложу весь код здесь: www.shuryon.com.br/C-CPP/list.c – Shuryon

+0

Спасибо! Задача решена! – Shuryon

Смежные вопросы