Double Linked Lists



所以我试图做一个双链表,我可以搜索的名字,也搜索的人只低于一定的年龄,但我不知道如何做到这一点。到目前为止,我只得到了一个,但我遇到了麻烦。

 #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
        int age;
        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(string age);
        void displayViaName(const Elem& name);
        void removeName(const Elem& name);
      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 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
    }
     /*
      void DLinkedList::removeName(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
    }
    */
      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(string age) {                     //Displays person via age
      //int check = 0;
      DNode*temp = header;
       while(temp!=trailer)
       {
        //  age = str.find(temp->elem);
        //   if(check == 1){
              cout << temp->elem <<endl;
              temp = temp -> next;
          // }
       }
       cout << temp->elem<<endl;
  }
       void DLinkedList::displayViaName(const Elem& name) {                     //Displays person via age
                  int check = 0;
          DNode*temp = header;
           while(temp!=trailer)
           {
               if(temp->elem == name){
                  cout << "Yes that Person is in out system" << endl;
                  check = 1;
               }
               temp = temp -> next;
           }
           if(temp->elem == name){
                  cout << "Yes that Person is in out system" << endl;
                  check = 1;
           }
           if(check == 0){ cout << "Sorry that person is not in our system" << endl;}
           check = 0;
      }
      class Person {
      public: 
        void print();
        string getName();
        int getAge();
      private:
          string name;
          int age;
      };
    int main(){
        char input = 'z';
        string entry;
        int age;
        DLinkedList person;
        person.addFront("Takkun Bradly 19");
        person.addFront("Devindra Ardnived 18");
        person.addFront("SeboY Wang 20");
        person.addFront("DoubleX Slash 31");
        person.addFront("Uncle Jelly 17");
        person.addFront("test 12");
        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 and age: ";
                cin.ignore();
                getline(cin, entry);
                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?: ";
                cin.ignore();
                getline(cin, entry);
                person.displayViaAge(entry);
            }
            if ((input == 'd')){
                cout << "What is the name of the person you are looking for?: ";
                cin.ignore();
                getline(cin, entry);
                person.displayViaName(entry);
            }
            if ((input == 'e')){
                cout << "The total average of ages are: " << endl;
            }
            cout << endl;
        }
    }

你把几件你不知道怎么做的事情,拼凑成一个你不知道如何解决的问题。

你似乎认为一个名字有两个部分。好:

if ((input == 'a')){
  cout << "Please enter their name and age: ";
  cin.ignore();
  cin >> firstName >> secondName >> age;
  ...
}

如果您真的想将名称存储为单个字符串,

name = firstName + " " + secondName;

现在创建list的新成员:

person.addFront(name, age);
这个调用

:

void DLinkedList::add(DNode* v, const Elem& name, int age)

这里的潜在问题是,您知道应该将name和age作为单独的变量来处理,但是您不知道如何处理,因此,您没有找出如何编写一个拼凑程序,而是知道如何做一些事情。很快你就被困住了。

相关内容

  • 没有找到相关文章

最新更新