如何逐个字符地搜索链表以查找单词?

问题描述 投票:0回答:1

我创建了一个链表,从字符串中逐个字符输入单词。每个字符代表链表内的节点。例如,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;
}

如果用户输入:“Ian Ian是一个好学生。”并且用户试图找到:Ian程序应该返回:用户输入:“Ian Ian是一个好学生。”

“伊恩的出现次数是2”

c
1个回答
0
投票

您可能有工作代码来设置链接列表。计算单个字母出现频率的简单函数如下所示:

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测试该输入。这样,您的函数可以在其他上下文中使用,而不仅仅是您的专业案例。 (对于作为参数传入头节点,同样适用。)

© www.soinside.com 2019 - 2024. All rights reserved.