Как добавить узел в определенном месте? - PullRequest
2 голосов
/ 20 июля 2010

Я работал с двусвязным списком. Все работает хорошо, за исключением функции, которая должна добавить копию 'who' перед 'whereX' [см. Код ниже]. Почему функция не работает?

void addNodeAt(Node *whereX, Node *who)
{
    //copy
    Node *temp = (Node*)malloc(sizeof(Node));
    temp->count = who->count;
    strcpy(temp->word,who->word);
    temp->before = whereX->before;
    temp->after = whereX;

    //paste
    if(whereX->after == who)
        whereX->after = who->after;

    whereX->before = temp;
}

EDIT:

В ответ пользователю326404, который сказал:

'Примечание. Ваша функция имеет недостаток, который не позволяет ей вставлять who в качестве нового заголовка списка. Он будет вставлен, но вы никогда не вернете новый головной узел, поэтому список будет утерян. '

что делать, если у меня есть Node * head в качестве глобальной переменной. Как я могу переназначить голову, не возвращая ее?

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

Вы не сообщаете существующим ссылкам о недавно созданном временном узле.Добавьте следующий код в конец функции, чтобы предыдущая часть цепочки указывала на вновь созданный узел.

if (whereX->before != NULL)
    whereX->before->after = temp;

Примечание. Ваша функция имеет недостаток, который не позволяет ей вставить whoкак новый глава списка.Он будет вставлен, но вы никогда не вернете новый головной узел, поэтому список будет утерян.

1 голос
/ 20 июля 2010

Допустим, у вас есть этот список: [Node1] <-> [WhereX] <-> [Node2]

Из этих заданий:

Node *temp = (Node*)malloc(sizeof(Node));
temp->count = who->count;
strcpy(temp->word,who->word);
temp->before = whereX->before;
temp->after = whereX;

и из этого:

 whereX->before = temp;

у вас будет:

[Node1] <- [temp] <-> [WhereX] <-> [Node2]
   |                      ^
    ----------------------

, но указатель Node1 after все еще смотрит на WhereX, поэтому вам также следует добавить это назначение:

whereX->before->after = temp;
0 голосов
/ 20 июля 2010

То, что вы делаете, требует некоторых изменений.Вы правильно распределили память для дублирования.Но формулировка проблемы не очень понятна.

Предполагая, что вы хотите добавить узел перед whereX, вы должны сделать следующее:

  1. Point "after" указатель temp на whereX
  2. Точка "before" указателя temp на "before" указатель whereX
  3. Точка "before->after" указателя whereX на временную точку
  4. Точка "before"указатель whereX на temp

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:

Также выполните соответствующие проверки NULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...