所以我试图创建一个双链表,我可以搜索该名称,也只搜索低于某个年龄的人,但我不知道该怎么做。到目前为止,我只有一个,但我遇到了麻烦。
#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;
}
}
答案 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,而是你知道该怎么做。很快你就被困了。 学会倾听那个小小的声音。