双链表

时间:2012-12-23 16:47:35

标签: c++ linked-list

所以我试图创建一个双链表,我可以搜索该名称,也只搜索低于某个年龄的人,但我不知道该怎么做。到目前为止,我只有一个,但我遇到了麻烦。

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

1 个答案:

答案 0 :(得分: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,而是你知道该怎么做。很快你就被困了。 学会倾听那个小小的声音。