Преобразование односвязного списка в двусвязный список с использованием наследования классов - PullRequest
0 голосов
/ 12 апреля 2019

Мне удалось создать единый связанный список, используя следующий класс с именем node:

class node
{
    protected: 
    int info;  //value
    int lenght;
    node *next;
    node *head;
};

(Публично у меня есть рабочие функции).А другой класс double_node:

class double_node : public node
{ 
   protected : node *prev;
};

Моя проблема здесь заключается в использовании функции add в классе double_node, где у меня есть две проблемы (изменил ее по крайней мере 10 раз, но я выложу ту со всеми ошибками, которую яполучил, потому что я не уверен, что другие версии исправили любую из них):

void add (int x){
double_node *p = new double_node(x); // constructor makes next = NULL & info = x
if (head == NULL)
    {
        p->prev = NULL;
        head = p;
    }
else
{
    double_node* q = head; //#1st issue, no idea how to initialize a pointer with head
    while (q->next!= NULL)
    {
        q = q->next; //#2nd issue
    }
    q->next= p;
    p->prev= q;
}

}

Обе ошибки: недопустимое преобразование из 'node *' в 'double_node *' [-fpermissive].Любые идеи, чтобы это исправить?Или, может быть, другой способ создать двусвязный список?Заранее спасибо!

Примечание: разместил его в обзоре кода, но мне сказали, что здесь он будет лучше.

1 Ответ

0 голосов
/ 12 апреля 2019

Должно быть достаточно объявления node* вместо double_node* in add.

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

Что-то вроде следующего должно быть достаточно:

   void add (int x){
    node *p = new double_node(x); 
    if (head == NULL)
    {
       head = p;
    }
    else
    {
        node* q = head; 
        while (q->next!= NULL)
        {
            q = q->next; //#2nd issue
        }
        q->next= p;
        static_cast<double_node*>(p)->prev= q;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...