-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
        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;
        }
    }
4

1 回答 1

0

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

您似乎假设一个名称有两个部分。美好的:

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

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

name = firstName + " " + secondName;

现在创建列表的新成员:

person.addFront(name, age);

这调用:

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

这里的根本问题是您知道您应该将姓名和年龄作为单独的变量来处理,但您不知道如何,所以与其找出您是如何编写一个 kludge 的,不如说您确实知道该怎么做。很快你就被困住了。学会听那个小声音。

于 2012-12-23T17:40:00.307 回答