Как удалить элемент в линейном списке?

96
16 января 2022, 20:30

Создал линейный список и заполнил числами от 0 до 10. Как удалить элемент списка, значение которого равно 5? Пожалуйста, подскажите

Вот мой код

#include <iostream> 
using namespace std;
int n=0;
int i=0;
struct List{
    int id;
    List *Next;
};
List *sp = new List;
void fill_list(){
    List *tmp = new List;
    tmp = sp;
    while (i < 11){
        tmp->id = i;
        tmp->Next = new List;
        if (n==0)
            sp = tmp;
        if (tmp->Next!=NULL)
            tmp = tmp->Next;
        n++;
        i++;
    }
}
void show(){
    List *tmp = new List;
    tmp = sp;
    for (int i=0;i<n;i++){
        cout << tmp->id << " ";
        tmp = tmp->Next;
    }
    cout << endl;
}
void del(){
    List *tmp = new List;
    tmp = sp;
    int e = 5;
    int n0 = n;
    for (int i = 0; i<n0; i++){
        if (e == tmp -> Next -> id){
        }
    }
}
int main() {
    setlocale(LC_ALL, "Russian");
    fill_list();
    int l=0;
    while(1) {
        cout << "1 - вывод, 2 - удалить элемент, 3 - выход" << endl;
        cin >> l;
        if(l==1){
            show();
        }
        if(l==2){
            del();
        }
        if(l==3)
            return 0;
        }
}

fill_list - заполняет список; show - выводит на экран; del - должен удалить элемент

Answer 1

Сначала правильно перетасовать ссылки (то, что указывало на удаляемый элемент, должно указывать на следующий за ним (тот, куда указывал удаляемый)), а потом просто вызвать delete.

Answer 2
#include <iostream>
#include <Windows.h>
using namespace std;
struct List
{
    int id;
    List *Next;
};
List *sp = NULL;
void fill_list()
{
    List *tmp, *last = NULL;
    for (int i = 0; i < 11; i++)
    {
        tmp = new List;
        tmp->id = i;
        tmp->Next = NULL;
        if (sp == NULL)
            sp = tmp;
        else
            last->Next = tmp;
        last = tmp;
    }
}
void show()
{
    for (List *tmp = sp; tmp; tmp=tmp->Next)
        cout << tmp->id << " ";
    cout << endl;
}
void del(int e)
{
    List *prev = NULL, *tmp;
    for (tmp = sp; tmp; prev=tmp,tmp=tmp->Next)
    {
        if (e == tmp->id)
        {
            if (tmp == sp)
                sp = tmp->Next; //при удалении первого элемента
            else
                prev->Next = tmp->Next; //при удалении элемента посередине
            prev = tmp->Next;
            delete tmp;
            tmp = prev;
            if (NULL == tmp)
                break; //при удалении последнего элемента
        }
    }
}
void delQueue(void)
{
    List *next, *tmp;
    for (tmp = sp; tmp; tmp = tmp->Next)
    {
        next = tmp->Next;
        delete tmp;
        tmp = next;
    }
}
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    fill_list();
    int l=0;
    while (1)
    {
        cout << "1 - вывод, 2 - удалить элемент, 3 - выход" << endl;
        cin >> l;
        switch (l)
        {
            case 1:
                show();
                break;
            case 2:
                del(5);
                break;
            case 3:
                return 0;
        }
    }
    delQueue();
    return 0;
}
READ ALSO
c# - повторное использование подключенных методов

c# - повторное использование подключенных методов

Нужен способ вытаскивать инфу из msi пакетаНашел решение в инете, на его основе сделал класс

173
Task.FromException c#

Task.FromException c#

Создаю асинхронную задачу Task

142
Ошибка в unity CS1061

Ошибка в unity CS1061

Все работало буквально 10 минут назадСоздал новую сцену, все так же работало, но потом что-то пошло не так

179
Возвращение двух переменных из метода

Возвращение двух переменных из метода

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

76