0

だから私はほとんどのコードを持っています。問題は、メインに見られるようにリストに新しいノードを追加しようとすると、うまくいかないようです。追加しますが、印刷しようとすると何も表示されません。

研究室のために私がしなければならないことは、奇妙な理由で必要になった場合に備えてありますが、必要ではありません。[注: コードの他の部分からコピーして貼り付けただけなので、多くの GUI コードが機能しません]。

指示: オブジェクト指向の C++ プログラムを作成して、二重リンクを作成します。各ノードは、個人の姓名とそれぞれの年齢を格納できる必要があります。リストを 5 つのノードで初期化します。プログラムには、年齢がユーザーによって入力された値よりも小さいすべてのノードをユーザーが出力できるようにするメンバー関数が含まれている必要があります (どちらの方向でも)。また、ユーザーが特定の人の名前を検索できるようにする必要があります。リストの平均年齢を出力できるはずです。最後に、名前を削除できるようにする必要があります。プログラムは、ユーザーがメニューから選択できるようにする必要があります。

#include <iostream>
#include <string>
using namespace std;

 typedef string Elem;               // list element type
  class DNode {                 // doubly linked list node
  private:
    Elem elem;                  // node element value
    DNode* prev;                // previous node in list
    DNode* next;                // next node in list
    friend class DLinkedList;           // allow DLinkedList access
  };

class DLinkedList {             // doubly linked list
  public:
    DLinkedList();              // constructor
    ~DLinkedList();             // destructor
    bool empty() const;             // is list empty?
    const Elem& front() const;          // get front element
    const Elem& back() const;           // get back element
    void addFront(const Elem& name);        // add to front of list
    void addBack(const Elem& name);     // add to back of list
    void removeFront();             // remove from front
    void removeBack();              // remove from back
    void displayViaAge();
    void displayViaName();
  private:                  // local type definitions
    DNode* header;              // list sentinels
    DNode* trailer;
  protected:                    // local utilities
    void add(DNode* v, const Elem& name);       // insert new node before v
    void remove(DNode* v);          // remove node v
  };

  DLinkedList::DLinkedList() {          // constructor
    header = new DNode;             // create sentinels
    trailer = new DNode;
    header->next = trailer;         // have them point to each other
    trailer->prev = header;
  }

    DLinkedList::~DLinkedList() {           // destructor
    while (!empty()) removeFront();     // remove all but sentinels
    delete header;              // remove the sentinels
    delete trailer;
  }
                                // insert new node before v
  void DLinkedList::add(DNode* v, const Elem& name) {
    DNode* u = new DNode;  u->elem = name;      // create a new node for e
    u->next = v;                // link u in between v
    u->prev = v->prev;              // ...and v->prev
    v->prev->next = v->prev = u;
  }

  void DLinkedList::addFront(const Elem& name)  // add to front of list
    { add(header->next, name); }

  void DLinkedList::addBack(const Elem& name)   // add to back of list
    { add(trailer, name); }

   void DLinkedList::remove(DNode* v) {     // remove node v
    DNode* u = v->prev;             // predecessor
    DNode* w = v->next;             // successor
    u->next = w;                // unlink v from list
    w->prev = u;
    delete v;
  }

  void DLinkedList::removeFront()       // remove from font
    { remove(header->next); }

  void DLinkedList::removeBack()        // remove from back
    { remove(trailer->prev); }


     bool DLinkedList::empty() const        // is list empty?
    { return (header->next == trailer); }

  const Elem& DLinkedList::front() const    // get front element
    { return header->next->elem; }

  const Elem& DLinkedList::back() const     // get back element
    { return trailer->prev->elem; }

  void DLinkedList::displayViaAge() {                     //Displays person via age

      DNode*temp = header;

       while(temp!=trailer)
       {

           //if(howold = age)
              cout << temp->elem <<endl;
              temp = temp -> next;
       }

       cout << temp->elem<<endl;
  }

int main(){
    char input = 'z';
    string entry;
    int age;
    DLinkedList person;

    person.addFront("Takkun Bradly");
    person.add("Devindra Ardnived");
    person.add("SeboY Wang");
    person.add("DoubleX Slash");
    person.add("Uncle Jelly");

    cout << "What would you like to do?" << endl;
    cout << "Enter 'A' to: Add a new person" << endl;
    cout << "Enter 'B' to: Remove a person" << endl;
    cout << "Enter 'C' to: Search for people via age" << endl;
    cout << "Enter 'D' to: Search for people via name" << endl;
    cout << "Enter 'E' to: Average all the total ages" << endl;
    cout << "Enter 'F' to: Quit" << endl;

while(input != 'f') {

    cin >> input;
    cout << endl;

        while ((input != 'a')&&(input != 'b')&&(input != 'c')&&(input != 'd')&&(input != 'e')&&(input != 'f')) {

            cout << "Please enter a valid selection" << endl;           
            cin >> input;
        }

        if ((input == 'a')){
            cout << "Please enter their name: ";
            cin.ignore();
            getline(cin, entry);

            cout << "Please enter their age: ";
            cin >> age;
            person.addFront(entry);

        }

        if ((input == 'b')){
            cout << "Who would you like to remove: ";
            cin.ignore();
            getline(cin, entry);
            person.removeFront();
        }

        if ((input == 'c')){
            cout << "What is the age of the person you are looking for?: ";
            person.displayViaAge();
        }

        if ((input == 'd')){
            cout << "What is the name of the person you are looking for?: ";
            cin.ignore();
            getline(cin, entry);
            person.addFront(entry);
        }

        if ((input == 'e')){
            return 0;
        }

        cout << endl;
    }
}
4

1 に答える 1

1

あなたのバグは add メソッドの次の行にあると思います:

 v->prev->next = v->prev = u;

この行のこの割り当ては、右から左に実行されます。だからv->prevに設定されu、次にv->prev->nextに設定され、v->prev現在は を指していuます。これu->nextで を指していますがu、これはあなたが望むものではありません。

代わりに次のようなものが必要だと思います:

// insert new node before node v
void DLinkedList::add(DNode* v, const Elem& name) {
    DNode* u = new DNode;   u->elem = name;      // create a new node and set name
    u->next = v;                 // make v the successor of u
    u->prev = v->prev;           // set u's predecessor to v's current predecessor
    u->prev->next = u;           // make u the successor of v's predecessor
    v->prev = u;                 // finally make u the predecessor of v
}
于 2012-12-23T07:30:56.753 に答える