нужна помощь двусвязный список в С++

Я создаю двусвязный список в С++. код выглядит нормально, но когда я попытался добавить второй узел в список, программа вылетает. что-то не так с функцией insert(), но не знаю, как это решить.

#include <iostream>
using namespace std;

class Node{
    int info;
    Node* next, *back;
    friend class LinkedList;
};

class LinkedList{
private:
    Node* head;
public:
    LinkedList();
    void print();
    void find(int, Node**, bool *);
    void insert(int);
    void remove(int);
    void destroylist();
    void modify(int, int);
    bool checkifempty();

};

LinkedList::LinkedList(){
    head=NULL;
}

void LinkedList::print(){
    Node* tmp;
    tmp=head;
    while(tmp!=NULL){
        cout<<tmp->info<<endl;
        tmp=tmp->next;
    }
}


void LinkedList::find(int key, Node** loc, bool *found){
    *loc = head;
    bool more=true;
    while((*loc)!=NULL && (*loc)->info)){

        *loc=(*loc)->next;


    }
    if (*loc==NULL)
    {
        *found=false;
    }
    else if ((*loc)->info==key){

        *found = true;
    }

}



void LinkedList::insert(int key){

    Node *NewNode,*loc=NULL;
    bool found;

    find(key,&loc,&found);
    //Creating NewNode
    NewNode=new Node;
    NewNode->info=key;
    //if list is empty
    if (checkifempty())
    {
        NewNode->next=NULL;
        head=NewNode;
    }
    //otherwise
    else
    {
        NewNode->back=loc->back;
        NewNode->next=loc;
        loc->back->next=NewNode;
        loc->back=NewNode;
    }
    //Connecting pointers to complete insertion


}

void LinkedList::remove(int key){
    Node* loc; bool found;
    find(key,&loc,&found);
    loc->back->next=loc->next;
    loc->next->back=loc->back;
    delete loc;
}

void LinkedList::destroylist(){
    Node* tmp;
    while(head!=NULL){
        tmp=head;
        head=head->next;
        delete tmp;
    }
}

bool LinkedList::checkifempty(){
    return (head==NULL?true:false);
}


int main(){
    LinkedList mylist;
    mylist.insert(10);
    mylist.insert(15);
    mylist.insert(11);
    system("pause");
    return 0;
}

person Bilal Ashraf    schedule 11.11.2013    source источник
comment
Посмотрите на ответы здесь. stackoverflow.com/questions/ 18364601/ Надеюсь, это направит вас на правильный путь. Я также рекомендую использовать find() из библиотеки алгоритмов вместо того, что вы написали.   -  person TheDude    schedule 11.11.2013
comment
Я создаю двусвязный список в С++. Почему?   -  person John Dibling    schedule 11.11.2013
comment
Почему вы используете отдельную функцию поиска, чтобы получить последний узел? Вы уже используете head для отслеживания первого узла. Точно так же используйте хвост другого узла, чтобы отслеживать последний узел. Это оптимально. Что касается производительности, ваш find() сильно пострадает, когда количество добавленных узлов увеличится.   -  person rahul    schedule 11.11.2013
comment
Используйте std::list. не изобретайте велосипед   -  person segfault    schedule 11.11.2013
comment
Если вы послушаете здесь слишком много комментаторов, у вас может сложиться впечатление, что изучать что-либо бессмысленно, потому что кто-то уже знает, как что-то делать, а вы можете использовать готовое решение. Не слушай. Продолжай учиться.   -  person molbdnilo    schedule 11.11.2013
comment
@molbdnilo +1 за такое хорошее руководство. Хорошая работа. Поддерживайте мотивацию новичков.   -  person ProgrammingHobby    schedule 27.10.2020


Ответы (1)


В вашей функции вставки проверьте указатель, который вы извлекаете из find:

if (loc != NULL) {
  // insert pointer into non-empty list

Функция find и указатель, который вы из нее извлекаете, действительно являются источником проблемы, потому что вы не проверяете, вернул ли она действительный указатель.

person abiessu    schedule 11.11.2013
comment
Кроме того, функция remove не проверяет, был ли найден удаляемый элемент в списке... - person abiessu; 11.11.2013