2010-07-20 4 views
2

Я работаю с двойным перечнем. Все работает нормально с освобождением функции, которая должна добавить копию «кто» перед «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:

В ответ на user326404, который сказал:

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

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

ответ

2

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

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

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

+0

Что делать, если я не хочу возвращать новую голову, и у меня есть головка Node * как глобальная переменная. как я могу исправить недостаток? –

+0

С глобальной переменной, удерживающей головку, вам нужно будет освободить() старую голову, а затем указать ее на новую. – Manfre

+0

M ... Это интересно. Глобальная переменная «head», которую я просто указываю на первый узел списка и последний узел списка, так что «whereX» и «who» никогда не будут головами. Это любопытно, как мост. –

1

Допустим, у вас есть этот список: [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] 
    |     ^
    ---------------------- 

но after указатель NODE1 по-прежнему смотрит на где х, так вы должны также добавить это задание:

whereX->before->after = temp; 
+0

Спасибо за ваш ответ! –

0

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

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

  1. Поинт "after" указатель температуры на где х
  2. Поинт «прежде чем» указатель температуры на «before» указатель где х
  3. Point «before->after» указатель на темп где х
  4. Point «before» указатель на темп где х

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

EDIT:

также сделать соответствующий NULL проверяет

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