anonymous
  • anonymous
how do you search for a lastname in a linked list? c++
Computer Science
  • Stacey Warren - Expert brainly.com
Hey! We 've verified this expert answer for you, click below to unlock the details :)
SOLVED
At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.
jamiebookeater
  • jamiebookeater
I got my questions answered at brainly.com in under 10 minutes. Go to brainly.com now for free help!
anonymous
  • anonymous
i have a linked list that stores firstname, lastname, and phone number. i need to find the lastname
anonymous
  • anonymous
Are you using the STL?
anonymous
  • anonymous
I am using visual studio c++

Looking for something else?

Not the answer you are looking for? Search for more explanations.

More answers

anonymous
  • anonymous
Did you implement the linked list yourself?
anonymous
  • anonymous
i did. ammm can you give me an example of a referenced variable?
anonymous
  • anonymous
Referenced variable is like a pointer that is pretending to be deferenced.
anonymous
  • anonymous
Okay I need to know what your code is like first of all.
anonymous
  • anonymous
bool PhoneBook::Lookup (const string& lname, const string& fname, string& pnum) const { PhoneBookItem* p = head; PhoneBookItem* q = head->next; if (head == NULL) return false; else if (lname == p->lastname) { if (fname == p->firstname) { return true; } else return false; } else { while (q != NULL && lname != q->lastname) { p = q; } if (q != NULL && lname == q->lastname) if (fname == q->firstname) return true; else return false; else return false; } }
anonymous
  • anonymous
It says that the pnum should be returned to the calling function via a third argument, a reference variable. I don't know how. can you help me with this?
anonymous
  • anonymous
What is pnum supposed to be?
SnuggieLad
  • SnuggieLad
wio..phone number
anonymous
  • anonymous
All you need to do is assign pnum to the pnum of the node with the correct name.
anonymous
  • anonymous
``` while (q != NULL && lname != q->lastname) { p = q; } ``` This code doesn't make sense. You should try something like: ``` while (q != NULL && lname != q->lastname) { p = q; q = q->next; } ``` You need to update q and p.
anonymous
  • anonymous
So assuming you find it, before you return true, you wanna assign pnum. ``` if (fname == p->firstname) { pnum = q->pnum; // put it here return true; } ``` ``` if (fname == q->firstname) { pnum = q->pnum; // here too return true; } else ```
anonymous
  • anonymous
I tried that, but it doesn't work. Here is the code in the main. void LookupEntry(const PhoneBook& pb) { string last, first, phone; cout << "Enter last name: "; cin >> last; cout << "Enter first name: "; cin >> first; bool success = pb.Lookup(last, first, phone); if (success) { cout << "\nThe phone number is " << phone << ". \n"; } else { cout << "\nError: no one by this name is in the phone book.\n"; } }
anonymous
  • anonymous
``` string last, first, phone; ``` The problem is that `phone` should be a reference. ``` string last, first; string& phone; ```
anonymous
  • anonymous
Does it even compile?
anonymous
  • anonymous
It does, but that code in the main cannot be changed since our professor said so.
anonymous
  • anonymous
Okay, what sort of output are you getting? What is happening?
anonymous
  • anonymous
It outputs : Error: no one by this name is in the phone book. ================================================= if (success) { cout << "\nThe phone number is " << phone << ". \n"; } else { cout << "\nError: no one by this name is in the phone book.\n"; }
anonymous
  • anonymous
Alright, are you searching for something that is in the list?
anonymous
  • anonymous
yes
anonymous
  • anonymous
``` else if (lname == p->lastname) { if (fname == p->firstname) { return true; } else return false; } ``` This code is wrong. If the last name is correct but the first name is not correct, it should continue searching, but your code instead gives up entirely.
anonymous
  • anonymous
``` else if (lname == p->lastname && fname == p->firstname) { return true; } ``` This is what you should be doing.
anonymous
  • anonymous
There are a lot of bugs in your code, it'd be easier to show the correct way...
anonymous
  • anonymous
For example, why have `p` and `q`? You only need one to keep track of where you are, right?
anonymous
  • anonymous
yeah but i need to test this ============================================= if (head == NULL) return false; else if (lname == p->lastname && fname == p->firstname) { p->phone = head->phone; return true; } else { while (q != NULL && lname != q->lastname) { p = q; p = p->next; } if (q != NULL && lname == q->lastname && fname == q->firstname) { q->phone = head->phone; return true; } else return false; } ===================================== else { while (q != NULL && lname != q->lastname) { p = q; p = p->next; } if (q != NULL && lname == q->lastname && fname == q->firstname) { q->phone = head->phone; return true; } else return false; }
anonymous
  • anonymous
why are you setting `p->phone` to `head->phone`?
anonymous
  • anonymous
those are the variable in my struct ====================================================== struct PhoneBookItem { string lastname; string firstname; string phone; PhoneBookItem* next; PhoneBookItem(const string& l, const string& f, const string& ph); };
anonymous
  • anonymous
Yeah, but you're setting the current item `p` to have the same phone number as the first item `head`. There is no reason to do that.
anonymous
  • anonymous
Okay, you should start out with your current item point to the front: ``` PhoneBookItem* current = head; ```
anonymous
  • anonymous
yes i did that
anonymous
  • anonymous
If you go through the whole list without finding it, then you want to return false. ``` while (current != NULL) { // search code here current = current->next } return false; ```
anonymous
  • anonymous
Does that loop make sense so far? @Lynncake
anonymous
  • anonymous
yes it does, i'm writing the rest of it. but i am not sure if this is right
anonymous
  • anonymous
PhoneBookItem* p = head; if (head == NULL) return false; else { while (p != NULL) { if (lname == p->lastname && fname == p->firstname) { return true; } p = p->next; } return false; }
anonymous
  • anonymous
Now, for the search code... we just check if the names are correct ``` if (current->firstname == fname && current->lastname == lname) { pnum = current->phone; return true; } ```
anonymous
  • anonymous
We don't have anything if the names don't match. The loop will take care of that for us.
anonymous
  • anonymous
yes it worked! thank you
anonymous
  • anonymous
One second though.
anonymous
  • anonymous
``` if (head == NULL) return false; else { while (p != NULL) ``` The `if (head == NULL)` here is pointless. The `while (p != NULL)` already check if `head` is `NULL`.
anonymous
  • anonymous
@Lynncake Does that make sense?
anonymous
  • anonymous
yes, it does thanks a lot
anonymous
  • anonymous
alright, well good luck then.
anonymous
  • anonymous
for the delete, is this right? ====================================== PhoneBookItem* p = head; while (p != NULL) { if (lname == p->lastname && fname == p->firstname) { delete p; p->next=NULL; num--; return true; } p = p->next; } return false; ====================================== I followed your method/concept.
anonymous
  • anonymous
The problem with this is that you need to keep track of the item before you.
anonymous
  • anonymous
And you set the guy behind you's `next` property to your own `next` property.
anonymous
  • anonymous
so in here i should hava another pointer that points to the next element?
anonymous
  • anonymous
This case is a bit tricky because you have two case: 1) They are deleting the head... 2) They are deleting something in the middle of the list
anonymous
  • anonymous
For 1) you delete it, and set head to NULL For 2) you need to set the previous guy's next to the deleted guy's next
anonymous
  • anonymous
``` PhoneBookItem* last = head; PhoneBookItem* current = head->next; // Check head // Check guys in the middle of the list ```
anonymous
  • anonymous
For check head, we wanna do: ``` if (head != NULL && head->firstname == fname && head->lastname == lname) { delete head; head = NULL; } ```
anonymous
  • anonymous
For checking others, we want a loop: ``` while (current != NULL) { \\ check current last = current; current = current->next; } return false; ```
anonymous
  • anonymous
For current, we do something similar to head, but with a change: ``` if (current->firstname == fname && current->lastname == lname) { last->next = current->next; delete head; return true; } ```
anonymous
  • anonymous
Hmmm, there should be a `return true;` in the check head part too.
anonymous
  • anonymous
What we are doing is changing this: |dw:1364256150764:dw|
anonymous
  • anonymous
so the last is the head?
anonymous
  • anonymous
To this: |dw:1364256188626:dw|
anonymous
  • anonymous
`last` starts out as the head in the beginning. But last is set to `current` every time go move to the next element. `last` is just storing what comes before `current`
anonymous
  • anonymous
so i should create another pointer pointing to last?
anonymous
  • anonymous
Yep
anonymous
  • anonymous
I gotta brb for a bit, but look at the code I posted if you are confused
anonymous
  • anonymous
i will, and thank you so much
anonymous
  • anonymous
yes it did delte, but now my printing is messed up after deleting ============================================== ///////////////////////DELETE//////////////////////////////////////// PhoneBookItem* p = head; PhoneBookItem* q; int count=0; while (p != NULL) { if (count==0) { if (p->firstname == fname && p->lastname == lname) { delete head; head = NULL; num--; return true; } } else if (count>0) { if (p->firstname == fname && p->lastname == lname) { q->next = p->next; delete head; num--; return true; } } q = p; p = p->next; count++; } return false; ============================================= ///////////////////////////////PRINT///////////////////////////////// ostream& operator << (ostream& out, const PhoneBook& pbook) { PhoneBookItem* p = pbook.head; while (p != NULL) { out <lastname<<", "<firstname<<": "<phone<next; } return out; }
anonymous
  • anonymous
There is nothing wrong with printing. The linked list is getting ruined by your delete somehow.
anonymous
  • anonymous
``` if (p->firstname == fname && p->lastname == lname) { q->next = p->next; delete head; num--; return true; } ``` You should be deleting `p` here not `head`
anonymous
  • anonymous
Your count idea id pretty interesting, though not as efficient it gets the job done.
anonymous
  • anonymous
thank you so much. now i can study my other classes. ^_^ THANK YOU!!!!

Looking for something else?

Not the answer you are looking for? Search for more explanations.