2015-05-25 1 views
1

Я написал этот код, используя один список. Теперь я хочу изменить его на двойной список. Я пробовал несколько разных вещей, но все испортилось. В моем коде есть несколько бесполезных строк, но это в основном односвязный список. Каков правильный способ изменить его на двусвязный список?C++ Переключение из одного связанного списка в дважды связанный список

#pragma once 

#include "Exhibit.h" 

struct Node 
{ 
    Exhibit exhibit; 
    Node *next; 
}; 

class Museum 
{ 
private: 
    Node *p; 
    Node *d; 
    Exhibit *Ex; 
    int n; 
    int nmax; 
public: 
    Museum(); 
    ~Museum(); 

    void Start() { d = p; } 
    bool HasNext() { if (d == NULL) return false; return true; } 
    void Next() { d = d->next; } 
    Exhibit GetExhibit() const { return d->exhibit; } 
    int GetN() { return n; } 

    void Sort(); 
    void AddExhibit(Exhibit e); 
    void RemoveExpensive(int p); //Removes elements more expensive than int p 
}; 

Museum::Museum() 
{ 
    p = NULL; 
    d = NULL; 

} 

Museum::~Museum() 
{ 
    Node * element; 
    while (p) 
    { 
     element = p; 
     p = p->next; 
     delete element; 
    } 
    p = NULL; 
    d = NULL; 

} 

void Museum::AddExhibit(Exhibit e) 
{ 
    Node *element = new Node; 

    element->exhibit = e; 
    element->next = p; 
    p = element; 
} 

int CountExhibits(string CDfv) 
{ 
    string line; 
    int count = 0; 
    ifstream fd(CDfv.c_str()); 
    while (!fd.eof()) 
    { 
     getline(fd, line); 
     count++; 
    } 
    fd.close(); 
    return count; 
} 

void Museum::Sort() 
{ 
    // traverse the entire list 
    for (Node *list = p; list->next != NULL; list = list->next) 
    { 
     // compare to the list ahead 
     for (Node *pass = list->next; pass != NULL; pass = pass->next) 
     { 
      // compare and swap 
      if (list->exhibit.Date() > pass->exhibit.Date()) 
      { 
       // swap 
       Exhibit temp = list->exhibit; 
       list->exhibit = pass->exhibit; 
       pass->exhibit = temp; 
      } 
     } 
    } 
} 

void Museum::RemoveExpensive(int pr) 
{ 
    Node *pPre = NULL, *pDel = NULL; 


    pPre = p; 
    pDel = p->next; 

    /* traverse the list and check the value of each node */ 
    while (pDel != NULL) { 
     if (pDel->exhibit.Price() > pr) { 
      /* Update the list */ 
      pPre->next = pDel->next; 
      /* If it is the last node, update the tail */ 
      if (pDel == d) { 
       d = pPre; 
      } 
      delete pDel; /* Here only remove the first node with the given value */ 
      pDel = pPre; 
      /* break and return */ 
     } 
     pPre = pDel; 
     pDel = pDel->next; 
    } 


    /* Check whether it is the head node? 
    if it is, delete and update the head node */ 
    if (p->exhibit.Price() > pr) { 
     /* point to the node to be deleted */ 
     pDel = p; 
     /* update */ 
     p = pDel->next; 
     delete pDel; 

    } 
} 

Edit: Мой новый метод AddExhibit():

void Museum::AddExhibit(Exhibit e) 
{ 
    Node *element = new Node; 

    element->exhibit = e; 

    if (p == NULL) 
     p = d = element; 
    else 
    { 
     p->prev = element; 
     element->next = p; 
     p = element; 

    } 
    //element->next = p; 
    //p = element; 
} 

ответ

1

Я решил свою проблему с помощью этого метода AddExhibit():

void Museum::AddExhibit(Exhibit e) 
{ 
    Node *element = new Node; 

    element->exhibit = e; 

    element->next = p; 
    element->prev = NULL; 
    if (p == NULL) 
     d = element; 
    else 
     p->prev = element; 
    p = element; 
} 

Я не знаю, если это полностью правильно или нет, но он отлично работает для моего дела.