c++ - 搜索链表 C++

标签 c++ linked-list

所以我的项目是有一个随机数猜谜游戏(1-100),并将用户的猜测值存储到一个链表中。我遇到的困难部分是使用已存储在链表中的先前输入来检查用户的当前输入。我不明白为什么它总是告诉我我已经猜到之前的数字,而我真的没有。

#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);
        }
    }   
}

有什么想法吗?

最佳答案

当用户输入他们的猜测时,您将其添加到列表中,然后尝试找到它。因为你已经添加了它,所以每次都可以在列表中找到最后的猜测。所以你需要将添加节点的代码移到循环的末尾,例如这里

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

同时为列表操作创建函数,如add_node,或exist,代码将简单明了。看例子

#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);
        }
    }   
}

现在很明显 main 中发生了什么,它很容易阅读,没有代码重复,就像以前一样。也不要在你的程序中使用符号代码,使用符号(在你的情况下 '\n')。

关于c++ - 搜索链表 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095105/

相关文章:

c - 如何按顺序将元素从一个链表移动到另一个链表

java - Java中过滤掉重复字符

header 中的 C++ 数组声明

c++ - make_shared 与自定义新运算符

c++ - 为什么这个快速排序实现给出了一个奇怪的输出

c++ - 隐式实例化变量模板的动态初始化顺序

java - 使用链接列表的学生数据库

在 C 中创建指向链表的二维指针数组

c++ - 使用嵌套结构时是否有任何性能损失?

c - 链表,分配字符数组 [C]