Member 12887991 Ответов: 2

Что не так с моим кодом связанного списка?


Я занимаюсь созданием связанного списка. Я использую new и delete, так как в любом случае должен обновить этот код в будущем до C++. Но что-то не так с моими функциями добавления или удаления кода, которые я вставил ниже.

Буду признателен вам за помощь. Я попытался удалить узел либо с двусвязным списком, либо с одним связанным списком, но этого не произошло. Что я делаю не так?

Мой код добавления:

void add(int number)
{
    if(!head) {
    head=new tracker;
    head->i=number;
    head->next=0;
    head->prev=0;
    tail=head;
    } else {
    tail->next=new tracker;
    tail->prev=tail;
    tail=tail->next;
    tail->i=number;
    tail->next=0;
    }
}

Мой код удаления:
PS the while loop needs to go through the entire list as the production code will have a flag for every record that needs to be deleted. But no matter what i do, my print list function keep printing out 3 records, despite me using the remove function.

Thanks for your help.

What I have tried:

Would appreciate your help. I tried removing a node either with a doubly linked list or a single linked list, but it's not happening. What am i doing wrong?

Member 12887991

Я не уверен, что вы обновили, но я думаю, что форматирование теперь испорчено :-)

2 Ответов

Рейтинг:
1

OriginalGriff

Хм...

tail->next=new tracker;
tail->prev=tail;
Таким образом, каждый элемент имеет указатель предыдущего элемента, который указывает на себя...и предыдущий элемент никогда не указывает на следующий после него...
И тогда вы делаете это:
tail=tail->next;
Какой набор tail к неопределенному значению, которое затем вы пытаетесь использовать в последующих операциях...
Найдите свой отладчик и используйте его, чтобы следить за тем, что делает ваш код - вы бы очень быстро заметили такую проблему.

Это хорошая идея, чтобы создать новый узел и добавить его в список только тогда, когда он будет завершен - таким образом, он работает лучше, потому что вы можете получить доступ к двум узлам, которые вас интересуют отдельно, а также лучше работает в многопоточной среде.

Цитата:
Да, но я устанавливаю указатель prev только при создании новой записи tail, поэтому tail- & gt;prev устанавливается в tail , который я вскоре обновляю.


Остановитесь и подумайте об этом на мгновение.
Перед вашей вставкой это выглядит так:
Head--               Tail--
     |                    |
     v                    v
---> Node 1   ----------> Node 2
|      next --              next -- null
|      prev -- null         prev--
|                                |
----------------------------------

После вашего добавления вы хотите этого:
Head--               Tail-----------------------
     |                                         |
     v                                         v
---> Node 1   ----------> Node 2   ----------> Node 3
|      next --              next --              next -- null
|      prev -- null         prev --              prev -- back to Node2
|                                 |                        (I'm not drawing that!)
-----------------------------------

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


Member 12887991

Да, но я устанавливаю указатель prev только при создании новой записи tail, поэтому tail- & gt;prev устанавливается в tail , который я вскоре обновляю.

Ты говоришь, что я должен также сделать хвост-и GT;пред-и GT;следующий=хвост-и GT;дальше ?

Извини, я все еще новичок в этом деле. Не могли бы вы предложить мне альтернативный способ сделать это, я заинтересован в том, чтобы сделать то, что вы сказали, это было бы гораздо лучше для атомной операции.

Рейтинг:
0

Patrice T

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.