Member 13041326 Ответов: 4

Как удалить узел из связанного списка?


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

У меня есть все функции, кроме удаления узла для работы.
Не могли бы вы помочь мне исправить функцию удаления узла?
Вот моя функция удаления узла:

void single_llist::deleteNode(double value)
{
    new (struct node);
    struct node *s;
    
    s = start;
    s->info=s->next->info;
        free(s);
        cout<<"Element Deleted"<<endl;
}


Мои определения узлов и классов:

/*
 * Node Declaration
 */
struct node
{
    double info;
    struct node *next;
}*start;

/*
 * Class Declaration
 */
class single_llist
{
public:
    node* create_node(double);
    void appendNode(double);
    void deleteNode(double);
    void findNode(double);
    int countList();
    void displayList();
    single_llist()
    {
        start = NULL;
    }
};


Что я уже пробовал:

Код, приведенный выше, включая определение узла и класса, а также
удалить функцию узла.

4 Ответов

Рейтинг:
2

Jochen Arndt

Если вы хотите удалить узел по его значению, вы должны сначала найти его (например, с помощью findNode() функция, но это должно что-то возвращать).

Затем вы должны настроить следующий указатель предыдущего узла (установите значение next для узла, который будет удален). Это требует поиска предыдущего узла путем итерации от начала до конца. next член указывает на узел, который должен быть удален:

Непроверенный пример:

void single_llist::deleteNode(double value)
{
    struct node *s = findNode(value);
    if (s)
    {
        // Find previous node
        struct node *prev = start;
        while (prev && prev->next != s)
            prev = prev->next;
        if (prev)
        {
            prev->next = s->next;    
            free(s);
            cout<<"Element Deleted"<<endl;
        }
    }
}


Рейтинг:
2

Member 13041326

Я попробовал свой отладчик xcode, чтобы найти причину этой проблемы.

(lldb) print prev->next
(node *) $0 = 0x0000000100500220
(lldb) print s->next
error: Couldn't apply expression side effects : Couldn't dematerialize a result variable: couldn't read its memory
(lldb) print s
(node *) $2 = 0x0000000000001efc
(lldb) print s->next
error: Couldn't apply expression side effects : Couldn't dematerialize a result variable: couldn't read its memory


Рейтинг:
1

Patrice T

Возьмите лист бумаги и смоделируйте свой связанный список.
добавление режима в список A даст вам список B. удаление того же узла из списка B вернет вас в список A.
-----
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

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

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


Рейтинг:
0

Member 13041326

Большое спасибо за предложение.
Я заставил findNode возвращать true или false в зависимости от того, присутствует ли узел или нет.


void single_llist:: deleteNode(двойное значение)
{
структурный узел *s;
флаг int;
flag=findNode(значение);
if (флаг)
{
// Найти предыдущий узел
struct node *prev = start;
а (пред и усилитель; & пред-и GT;следующий != с)
prev = prev - & gt;Далее;
if (prev)
{
пред-и GT;следующий = С-и GT;далее;
бесплатно (ы);
cout<< "элемент удален"< & lt;endl;
}
}
}

Я внес вышеуказанные изменения.
Но когда я вызываю эту функцию, узел не удаляется.
Я что-нибудь еще упустил?


Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.