2015-02-23 2 views
0

, поэтому я хочу добавить между двумя узлами связанного списка новый узел, поле данных которого в основном содержит сумму предыдущего и следующего узлов. Я не могу понять, почему, как только я вхожу в цикл while, я не могу выбраться из него. Какие-либо предложения? Спасибо.вставить узел между двумя другими в связанном списке

Вот мой код:

void modify_list (node *head) { 
nodo *it = head; 
nodo *prev = NULL; 
int n_prev = 0; 
int n_next = 0; 
int sum = 0; 
it = it->next; 
prev = it; 
while (it->next != NULL) { 
    it->data = n_next; 
    prev->data = n_prev; 
    sum = n_next + n_prev; 
    node *new; 
    new = malloc(sizeof(node)); 
    if (new == NULL) { 
     printf("Error.\n"); 
     return; 
    } 
    memset(nuovo, 0, sizeof(node)); 
    new->data = sum; 
    prev->next = new; 
    new->next = it; 
    sum = 0; 
    prev = it; 
    it = it->next; 
} 

}

ответ

1

При запуске итерации, вы используете:

it = it->next; 
prev = it; 

it и prev указывают на тот же узел. Через некоторое время, вы используете:

prev->next = new; 

, который так же, как:

it->next = new; 

Это означает it->next указывает на новый узел. Это означает, что вы никогда не проходите мимо вновь созданных узлов.

Вы можете исправить это с помощью:

prev = it; 
it = it->next; 

перед началом цикла while.

Я хотел бы сделать что более надежным с помощью:

prev = it; 
if (it != NULL) 
{ 
    it = it->next; 
} 

В это время it может быть NULL. Изменение условной в while заявлении:

while (it != NULL) { 
+0

Я сделал то, что вы предложили, и ошибка цикла решена, но она по-прежнему падает. Если в моем списке 5 узлов, он 4 раза (что должно быть хорошо), но сразу после последнего цикла все зависает. – SCoder

+0

Знаете ли вы, на какой линии он падает? –

+0

Он выходит из строя сразу после выхода из цикла while. – SCoder

0

Могу ли я первым предложить ломать свой код на более мелкие части
ли функция, которая вставляет новый объект
Для односвязный список, это должно вставить после:

void InsertAfter(Node* n, DATA data) 
{ 
    Node* newnode = malloc(sizeof(Node)); 
    newnode->data = data; 
    newnode->next = n->next; 
    n->next = newnode; 
} 

Тогда у вас есть функция, чтобы найти точку вставки
Это может быть, например

Node* FindLastSmaller(Node* n, DATA data) 
{ 
    while(true) 
    { 
     if(! n->next) return n; 
     if(n->next->data > data) return n; 
     n = n->next; 
    } 
} 

Тогда они становятся легко комбинировать:

void InsertSorted(Node* n, DATA data) 
{ 
    Node* inspos = FindLastSmaller(n,data); 
    InsertAfter(inspos,data); 
} 

Вы можете избежать добавления специального случая для пустого списка, если head всегда
существует, и не содержит никаких данных. (его фиктивный узел)

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