Ask your own question, for FREE!
Computer Science 19 Online
OpenStudy (anonymous):

how do you search for a lastname in a linked list? c++

OpenStudy (anonymous):

i have a linked list that stores firstname, lastname, and phone number. i need to find the lastname

OpenStudy (anonymous):

Are you using the STL?

OpenStudy (anonymous):

I am using visual studio c++

OpenStudy (anonymous):

Did you implement the linked list yourself?

OpenStudy (anonymous):

i did. ammm can you give me an example of a referenced variable?

OpenStudy (anonymous):

Referenced variable is like a pointer that is pretending to be deferenced.

OpenStudy (anonymous):

Okay I need to know what your code is like first of all.

OpenStudy (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; } }

OpenStudy (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?

OpenStudy (anonymous):

What is pnum supposed to be?

OpenStudy (snuggielad):

wio..phone number

OpenStudy (anonymous):

All you need to do is assign pnum to the pnum of the node with the correct name.

OpenStudy (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.

OpenStudy (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 ```

OpenStudy (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"; } }

OpenStudy (anonymous):

``` string last, first, phone; ``` The problem is that `phone` should be a reference. ``` string last, first; string& phone; ```

OpenStudy (anonymous):

Does it even compile?

OpenStudy (anonymous):

It does, but that code in the main cannot be changed since our professor said so.

OpenStudy (anonymous):

Okay, what sort of output are you getting? What is happening?

OpenStudy (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"; }

OpenStudy (anonymous):

Alright, are you searching for something that is in the list?

OpenStudy (anonymous):

yes

OpenStudy (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.

OpenStudy (anonymous):

``` else if (lname == p->lastname && fname == p->firstname) { return true; } ``` This is what you should be doing.

OpenStudy (anonymous):

There are a lot of bugs in your code, it'd be easier to show the correct way...

OpenStudy (anonymous):

For example, why have `p` and `q`? You only need one to keep track of where you are, right?

OpenStudy (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; }

OpenStudy (anonymous):

why are you setting `p->phone` to `head->phone`?

OpenStudy (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); };

OpenStudy (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.

OpenStudy (anonymous):

Okay, you should start out with your current item point to the front: ``` PhoneBookItem* current = head; ```

OpenStudy (anonymous):

yes i did that

OpenStudy (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; ```

OpenStudy (anonymous):

Does that loop make sense so far? @Lynncake

OpenStudy (anonymous):

yes it does, i'm writing the rest of it. but i am not sure if this is right

OpenStudy (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; }

OpenStudy (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; } ```

OpenStudy (anonymous):

We don't have anything if the names don't match. The loop will take care of that for us.

OpenStudy (anonymous):

yes it worked! thank you

OpenStudy (anonymous):

One second though.

OpenStudy (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`.

OpenStudy (anonymous):

@Lynncake Does that make sense?

OpenStudy (anonymous):

yes, it does thanks a lot

OpenStudy (anonymous):

alright, well good luck then.

OpenStudy (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.

OpenStudy (anonymous):

The problem with this is that you need to keep track of the item before you.

OpenStudy (anonymous):

And you set the guy behind you's `next` property to your own `next` property.

OpenStudy (anonymous):

so in here i should hava another pointer that points to the next element?

OpenStudy (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

OpenStudy (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

OpenStudy (anonymous):

``` PhoneBookItem* last = head; PhoneBookItem* current = head->next; // Check head // Check guys in the middle of the list ```

OpenStudy (anonymous):

For check head, we wanna do: ``` if (head != NULL && head->firstname == fname && head->lastname == lname) { delete head; head = NULL; } ```

OpenStudy (anonymous):

For checking others, we want a loop: ``` while (current != NULL) { \\ check current last = current; current = current->next; } return false; ```

OpenStudy (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; } ```

OpenStudy (anonymous):

Hmmm, there should be a `return true;` in the check head part too.

OpenStudy (anonymous):

What we are doing is changing this: |dw:1364256150764:dw|

OpenStudy (anonymous):

so the last is the head?

OpenStudy (anonymous):

To this: |dw:1364256188626:dw|

Can't find your answer? Make a FREE account and ask your own questions, OR help others and earn volunteer hours!

Join our real-time social learning platform and learn together with your friends!
Can't find your answer? Make a FREE account and ask your own questions, OR help others and earn volunteer hours!

Join our real-time social learning platform and learn together with your friends!