удаление элемента односвязного списка

248
28 апреля 2018, 18:16

Помогите понять в чем ошибка. Удаляет все правильно, но при выводе списка в консоли вылетает ошибка.

void del (list **begin, string s) {
list *p = *begin;
if (p == NULL) return;
list *print = *begin;
if (p->st.surname == s)
{
    *begin = p->next;
    delete p;   
    return;
}
if (!(p->next == 0)) {
list *p1 = p->next;
list *p2 = p1->next;
while ((p1 != NULL) || !(p == NULL) || (p2 !=0))
{
        if (p1->st.surname == s)
        {
            if (p1->next != 0) {
                cout << "KEEEEEEEEEEEEEEEEEEEEK";
                delete p1;
                p = p1;
                p1 = p2;
                p2 = p2->next;
                continue;
            }
            else
            {
                cout << "LOOOOOOOOOOOOOOOOOOOL";
                delete p1;              
                p = NULL;
                break;
            }
        }
        else {
            cout << "DAAAAAAAAAAAAAAAAAAD";
            p = p1;
            p1 = p2;
            p2 = p2->next;
        }
}
}
else    cout << "MOOOOOOOOOOOOM";

}

Answer 1

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

struct Student {    
    string surname;
    //...
};
struct list {
    Student st;
    list* next;
    list() : st(""), next(0){}
    //...
};

Дальше, кажется, вы пишете функцию, в которой вы удаляете из списка студента с такой то фамилией. Но ваша функция не выдает информацию ( удален ли обьект?). Давайте мы все таки вернем булевский тип, чтобы у нас была информация об успешном удалении (быть информированным всегда хорошо...)

bool del (list **begin, string s) {
    if (*begin == 0) return false;
    list* p = *begin;   
    if (p->st.surname == s)
    {
        *begin = p->next;
        delete p;   
        return true;
    }  
    list* p1 = p->next;
    while (p1 && p1->st.surname != s ) { 
        p = p1;         
        p1 = p1->next;  // p1  будет указывать на обьект с  фамилией s 
    }
    // если нет обьект с такой фамилией, то p1 == 0
    if(p1) {              // если найдено то p1 будет указывать на него
        if (p1->next)  {        //  если это не последный элемент
            p->next = p1->next; //так как p указывал на обьект перед p1
        }
        delete p1;
        return true;         
    }
    // если ничего не было возвращено, а значит не найден обьект с такой фамилией 
    return false;  
}

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

READ ALSO
закрытие программы при помощи ctrl-c

закрытие программы при помощи ctrl-c

Доброй ночи, форумчанеТакой вопрос: Как в переодичной функции обратного типа(CALLBACK WindProc()) закрывать окно при помощи CTRL+C? Знаю что можно через...

230
Подключить Opengl 4.3 к qt

Подключить Opengl 4.3 к qt

Как прикрутить Opengl 43 к проекту qt

236
Генерация случайного символа и замена в char array

Генерация случайного символа и замена в char array

Допустим у нас есть некий массив:

261
Баг препроцессора или VisualStudio

Баг препроцессора или VisualStudio

В библиотеке описано несколько классовТак же заданы символы препроцессра, и определен экспортируемый макрос

250