Nima Emrani
Nima Emrani

Reputation: 55

Searching linked based list C++

So my project is to have a random number guessing game (1-100) and store the user's guessed values into a linked list. The hard part I have is checking the user's current input with the previous inputs that are already stored in the linked list. I cannot figure out why it keeps telling me that I have already guessed the previous number when I really haven't.

#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std; 

struct Guess
{
    int numberGuess;
    Guess* next;
};

int main ()
{
    srand(time(0));

    Guess* start = 0;   

    //Defining variables
    int randomNumber;
    randomNumber = (rand() % 100) + 1;
    int userGuess;
    int i = 0;

    Guess* userValue = new Guess;   

    cout << "I'm thinking of a number between 1 and 100. Guess what it is: " << endl;
    cin >> userGuess;
    cin.ignore(1000,10);

    userValue->numberGuess = userGuess;
    userValue->next = start;
    start = userValue;

    while(true)
    {
        if (userGuess > randomNumber)
        {
            cout << "That's too high, guess again: ";
            cin >> userGuess;
            cin.ignore(1000,10);

            //Pass user's guess to linked based list
            Guess* userValue = new Guess;
            userValue->numberGuess = userGuess;
            userValue->next = start;
            start = userValue;
        }

        else if(userGuess < randomNumber)
        {
            cout << "That's too low, guess again: ";
            cin >> userGuess;
            cin.ignore(1000,10);

            //Pass user's guess to linked based list
            Guess* userValue = new Guess;
            userValue->numberGuess = userGuess;
            userValue->next = start;
            start = userValue;
        }

        if (userGuess == randomNumber)
        {
            cout << "Correct!" << endl;
            break;
        }

        //Check to see if it has been guessed
        bool checkDuplicate = false;
        Guess* p;
        for (p = start; p; p = p->next)
        {
            if (p->numberGuess == userGuess)
            {               
                checkDuplicate = true;
                break;
            }
        }

        if (checkDuplicate == true) 
        {
            cout << "You already guessed that value! -- Guess again: ";
            cin >> userGuess;
            cin.ignore(1000,10);
        }
    }   
}

Any Ideas?

Upvotes: 0

Views: 393

Answers (1)

Nikolay K
Nikolay K

Reputation: 3850

When user input their guess, you add it to the list, and then try to find it. Because you already add it last guess can be found in the list every time. So you need to move add node code to the end of the loop, for example here

    if (checkDuplicate == true) {
        cout << "You already guessed that value! -- Guess again: ";
        cin >> userGuess;
        cin.ignore(1000,10);
    } else {
        Guess* userValue = new Guess;
        userValue->numberGuess = userGuess;
        userValue->next = start;
        start = userValue;
    }

Also create functions for list operations like add_node, or exist, code will be simple and clear. Take a look at the example

#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std; 

struct Guess {
    int numberGuess;
    Guess* next;
};

bool exist(Guess* start, int number) {
    for (Guess* p = start; p != NULL; p = p->next) {
        if (p->numberGuess == number) {
            return true;
        }
    }
    return false;
}

void print(Guess* start) {
    for (Guess* p = start; p != NULL; p = p->next) {
        cout << p->numberGuess << " ";
    }
    cout << endl;
}

void add(Guess** start, int number) {
    Guess* userValue = new Guess;
    userValue->numberGuess = number;
    userValue->next = *start;
    *start = userValue;
}

int main () {
    srand(time(0));

    Guess* start = 0;   

    //Defining variables
    int randomNumber;
    randomNumber = (rand() % 100) + 1;
    int userGuess;

    cout << "I'm thinking of a number between 1 and 100. Guess what it is: " << endl;
    while(true)
    {
        cin >> userGuess;
        cin.ignore(1000, '\n');
        if (userGuess > randomNumber) {
            cout << "That's too high, guess again: ";
        }
        else if(userGuess < randomNumber) {
            cout << "That's too low, guess again: ";
        }
        if (userGuess == randomNumber) {
            cout << "Correct!" << endl;
            cout << "Your previous guesses was: ";
            print(start);
            break;
        }
        //Check to see if it has been guessed
        bool checkDuplicate = exist(start, userGuess);
        if (checkDuplicate == true)  {
            cout << "You already guessed that value! -- Guess again: ";
        } else {
            add(&start, userGuess);
        }
    }   
}

Now it is obvious what happens in main, it is easy to read, there is no code duplication, like it was before. Also don't use symbol codes in your program, use symbols (in your case '\n').

Upvotes: 1

Related Questions