Как искать связанный список символ за символом, чтобы найти слово? - PullRequest
0 голосов
/ 30 марта 2019

Я создал связанный список, который вводит слово за символом из строки.Каждый символ представляет узел внутри связанного списка.Например, Ian приятно выглядит так: I-> A-> N-> -> i-> s-> -> n-> i-> c-> e-> заканчивается новой строкой.

Я пытаюсь найти «IAN», когда я ищу и определяю, сколько раз Ian появлялся в узлах связанного списка.

Когда я использую свой текущий код, я буду искать нужное слово.Он войдет и начнет поиск по связанному списку и не найдет никаких вхождений.

Я пытался искать связанный список в виде строк, но это мало что дает, поскольку в этом контексте список ссылок состоит из символов.

Я также пытался искать слова символ за символом, но они ничего не возвращали.

Я сейчас пытаюсь найти слово внутри функции, и теперь он возвращает бесконечный циклпоиск.Даже при том, что я попытался закончить это в новой строке, и это не считая числа вхождений.

node* Find(char findCharacter){
    node *nodePtr = headNode;
    int occurrences = 0;
    int index;
    const int arraySize = 51;
    char findWord[arraySize];

    printf("Enter the word that you would like to find: ");
    gets_s(findWord);
    printf("\n");

    while((nodePtr != NULL) && (nodePtr->character != findCharacter)){

        for(index = 0; nodePtr->character != '\n'; index++){
            if(findWord == &findWord[index]){
                nodePtr = nodePtr->nextNode;
            }
            else{

            }
        }

        occurrences = occurrences + 1;

    }

    printf("number of occurrences: %d\n", occurrences);
    return nodePtr;
}

int main() {
    const int arraySize = 201;
    char entryString[arraySize];
    int index;


    /*
     * Let the user enter a string to start the program
     * */
    printf("Enter a user string: ");
    gets_s(entryString);
    printf("\n");
    int length = strlen(entryString);

    for(index = 0; index < length; index++){
        Find(entryString[index]);
    }

    return 0;
}

Если пользователь вводит: «Ян Ян - отличный ученик».и пользователь пытается найти: Ян Программа должна вернуть: Пользователь ввел: «Ян Ян - отличный ученик».

«Число вхождений для Иана равно 2»

1 Ответ

0 голосов
/ 30 марта 2019

Возможно, у вас есть рабочий код для настройки вашего связанного списка.Простая функция подсчета того, как часто встречается одна буква, будет выглядеть так:

int count_chars(node *nodePtr, char findme)
{
    int occurrences = 0;

    while (nodePtr) {
        if (nodePtr->character == findme) {
            occurrences++;
        }
    }

    return occurrences;
}

(Примечание. Я решил передать головной узел функции вместо использования глобального указателя головы.позволяет вам иметь более одного связанного списка в вашей программе. Это означает, что вы можете даже реализовать свое поисковое слово "Ian" в качестве связанного списка.)

Вместо того, чтобы искать строку в любом месте списка, давайте сначала напишемнекоторый код, который проверяет, начинается ли связанный список с определенного слова.Пройдите по списку и по строке одновременно и проверьте на несоответствия.Поскольку мы требуем, чтобы все строки, но не весь список соответствовали, мы контролируем цикл с помощью строки:

int startswith(node *nodePtr, const char *findme)
{
    while (*findme) {
        if (nodePtr == NULL || *findme != nodePtr->character) {
            return 0;                     // mismatch!
        }

        nodePtr = nodePtr->nextNode;      // next node in list
        findme++;                         // next char in string
    }

    return 1;                             // all chars match
}

Но вы хотите найти строку где угодно, а не только в начале.Каждый узел в списке можно считать головным узлом подсписка, который начинается на этом узле.Таким образом, если ваш список содержит «cat», узлы в списке содержат подсписки «cat», «at» и «t» соответственно.С помощью функции выше вы можете проверить свое слово на каждом узле.Код выглядит очень похоже на первый фрагмент кода выше, где мы только что подсчитали символы.

int count_strings(node *nodePtr, const char *findme)
{
    int occurrences = 0;

    while (nodePtr) {
        if (startswith(nodePtr, findme)) {
            occurrences++;
        }
    }

    return occurrences;
}

Одно замечание о разработке кода: не пытайтесь все делать в своей функции.Если искомая строка получена из пользовательского ввода, не включайте ее в функцию.Вместо этого сделайте это отдельно: прочитайте ввод, затем проверьте этот ввод с помощью count_strings.Таким образом, ваша функция может использоваться в других контекстах, а не только в вашем специализированном случае.(То же самое можно сказать более или менее для передачи в головной узел в качестве параметра.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...