1

I have to design a program to allow the user to input information for 5 nodes in a doubly linked list and then sort the doubly linked list alphabetically. It skips over allowing the user to input the address, doesn't print any information besides the name ,and doesn't sort the list alphabetically. What am I doing wrong?

#include <iostream>
#include <string>

struct node
{
    std::string firstName;
    std::string lastName;
    std::string address;
    long phoneNum;
    node *next;
    node *prev;
};

bool isEmpty(node *head);
void insertAsFirstElement(node *&head, node *&last, std::string firstName, std::string lastName, std::string address, long phoneNum);
void insert(node *&head, node *&last, std::string firstName, std::string lastName, std::string address, long phoneNum);
void searchFor(node *&last, std::string lastName);
void showList(node *current);


bool isEmpty(node *head)
{
    if(head == NULL)
        return true;
    else
        return false;
}


void insertAsFirstElement(node *&head, node *&last, std::string firstName, std::string lastName, std::string address, long phoneNum)
{
    node *temp = new node;
    temp->firstName = firstName;
    temp->lastName = lastName;
    temp->address = address;
    temp->phoneNum;
    temp->next = NULL;
    temp->prev = NULL;
    head = temp;
    last = temp;
}

void insert(node *&head, node *&last, std::string firstName, std::string lastName, std::string address, long phoneNum)
{

    if(isEmpty(head))

        insertAsFirstElement(head, last, firstName, lastName, address, phoneNum);

    else
    {
        node *temp = new node;
        temp->firstName = firstName;
        temp->lastName = lastName;
        temp->address = address;
        temp->phoneNum;

        int result = lastName.compare(last->lastName);

        if (result < 0)
        {
            temp->next = head;
            head->prev = temp;
            temp->prev = NULL;
            head = temp;
        }

        else if ( result > 0)
        {
            temp->next = NULL;
            temp->prev = last;
            last->next = temp;
            last = temp;
        }

    }

}

void searchFor(node *&last, std::string findName)
{
    node *temp = last;
    while (temp != NULL)
    {
        if (temp->lastName == findName)
        {
            std::cout << temp->firstName << " " << temp->lastName << " " << temp->address << " " << temp->phoneNum << std::endl;;
        }

        temp = temp->prev;
    }
}


void showList(node *current)
{
    if(isEmpty(current))
        std::cout << "The list is empty\n";
    else
    {
        std::cout << "The list contains: \n";
        while(current != NULL)
        {
            std::cout << current->firstName << " " << current->lastName << " " << current->address << " " << current->phoneNum << std::endl;
            current = current->next;
        }
     } 
}

int main()
{
    node *head = NULL;
    node *last = NULL;
    std::string firstName;
    std::string lastName;
    std::string address;
    long phoneNum;

    int count;
    count = 5;
    while (count > 0)
    {
        std::cout << "Enter the first name of person #" << count << ":\n";
        std::cin >> firstName;
        std::cout << "Enter the last name of person #" << count << ":\n";
        std::cin >> lastName;
        std::cout << "Enter the address of person #" << count << ":\n";
        std::getline(std::cin,address);
        std::cout << "Enter the phone number of person #" << count << ":\n";
        std::cin >> phoneNum;
        insert(head, last, firstName, lastName, address, phoneNum);
        count = count - 1;
     } 

    showList(head);

    std::string findName;
    std::cout << "What is the last name of the person you would like to find?\n";
    std::cin >> findName;

    searchFor(last, findName);

    return 0; 

}
user4581301
  • 29,019
  • 5
  • 26
  • 45

1 Answers1

1

Your issue is that you are mixing cin >> and getline which is problematic in C++ due to trailing newlines and what not.

Good practice is to always use getline and then use a stringstream to split the line up into tokens. For example, I modified your solution to only use getline and string streams (NOTE: You need to #include <sstream> at the top of your file.

You can read more about the issues with mixing cin >> and getline and also other ways to solve them here.

int main()
{
    node *head = NULL;
    node *last = NULL;
    std::string firstName;
    std::string lastName;
    std::string address;
    std::string phoneNumStr;
    long phoneNum;

    int count;
    count = 5;
    while (count > 0)
    {
        std::cout << "Enter the first name of person #" << count << ":\n";
        std::getline(std::cin,firstName);   // no use of cin >>
        std::cout << "Enter the last name of person #" << count << ":\n";
        std::getline(std::cin,lastName);    // no use of cin >>
        std::cout << "Enter the address of person #" << count << ":\n";
        std::getline(std::cin,address);
        std::cout << "Enter the phone number of person #" << count << ":\n";
        std::getline(std::cin,phoneNumStr);
        std::stringstream s(phoneNumStr);    // no use of cin. Using stringstream to break up line and extract it into phoneNum
        s >> phoneNum;
        insert(head, last, firstName, lastName, address, phoneNum);
        count = count - 1;
     }

    showList(head);

    std::string findName;
    std::cout << "What is the last name of the person you would like to find?\n";
    std::cin >> findName;

    searchFor(last, findName);

    return 0;
}
Community
  • 1
  • 1
gowrath
  • 2,676
  • 2
  • 14
  • 29