使用两个指针搜索链接列表

时间:2018-02-15 00:25:21

标签: c search linked-list

我正在编写一个任务,用于尝试从文件或标准输入读取数据,对所有单词进行标记,并显示出现的单词列表和每个单词的计数。

所需输出的示例:

Good bye occurred 5 times
This occurred 3 times
Hello occurred 1 time

当前输出示例:

This
1
is
1
fun!

1
This
1
is
1
fun!

不要介意输出的格式。这是一个需要在以后解决的问题。

我有一个正在运行的程序,它使用如下声明的链接列表:

typedef struct node
{
    char word[50];
    int count;
    struct node * next;
}words;

链接列表初始化如下

words * head = NULL;
head = malloc(sizeof(words));

分配给列表的两个指针

words * current = head;
words * search = head;

我正在努力解决的是以下代码:

while (!feof(input_file))
{
    while(current->next != NULL)
    {
        current = current-> next;
    }

    //Test-loop for tokenisation
    while(fgets(buffer,512, input_file) != NULL)
    {
        //Declaration of char token
        char* token;

        //Declaration of flag
        int duplicate_word = 1;
        //Test for-loop
        for (token = strtok(buffer, " "); token != NULL; token = strtok(NULL, " "))
        {
            char duplication_check_token[60];
            strcpy(duplication_check_token, token);

            while(search != NULL)
            {
                char duplication_check_search[60];
                strcpy(duplication_check_search, current -> word);
                if (strcmp(duplication_check_search, duplication_check_token) == 0)
                {
                    search->count++;
                    duplicate_word = 0;
                    break;
                }
                search = search -> next;
            }

            if (duplicate_word != 0)
            {
                while(current->next != NULL)
                {
                    current = current-> next;

                }

                current = malloc(sizeof(words));
                strcpy(current -> word, token);
                current -> count = 1;
                current -> next = NULL;

                //Test print
                printf("%s\n", token);
                printf("%d\n", current -> count);
            }

        }



    }

调试时,它似乎永远不会检查while(search != NULL)循环中的整个链表。

我错误的逻辑部分是什么?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

你的循环中有一个中断条件,这可能是你没有查看所有列表的原因。所以这意味着你的列表中有一个副本。

在循环之前添加:

int a = 0;

然后在循环中添加注释行:

++a; // before the if.
if (strcmp(duplication_check_search, duplication_check_token) == 0)
{
    search->count++;
    duplicate_word = 0;
    printf("%d\n", a); // to check what was the index of the item causing the break
    getchar(); // pause until next keypress
    break;
}

答案 1 :(得分:0)

有两个原因。首先,search只有在声明时才会初始化到列表的头部,因此它永远不会看到可能添加到列表头部的单词。我想这个:

        while(search != NULL)
        {
            char duplication_check_search[60];
            strcpy(duplication_check_search, current -> word);
            if (strcmp(duplication_check_search, duplication_check_token) == 0)
            {
                search->count++;
                duplicate_word = 0;
                break;
            }
            search = search -> next;
        }

应该是这样的:

        for (search = head; search != NULL; search = search->next)
        {
            char duplication_check_search[60];
            strcpy(duplication_check_search, current -> word);
            if (strcmp(duplication_check_search, duplication_check_token) == 0)
            {
                search->count++;
                duplicate_word = 0;
                break;
            }
         }

其次,因为列表中只有一个head元素!您的代码会分配word结构并将其分配给current,但current永远不会插入您的列表中。我想这个:

            while(current->next != NULL)
            {
                current = current-> next;

            }

            current = malloc(sizeof(words));
            strcpy(current -> word, token);
            current -> count = 1;
            current -> next = NULL;

本来是这样的:

            current = malloc(sizeof(words));
            strcpy(current -> word, token);
            current -> count = 1;
            current -> next = head;
            head = current;

while (current...循环不是必需的,将新元素添加到列表首部会容易得多。

另外,我相信你会意识到,如果你文件中的一行有一个"字"超过五十个字符长,真的很糟糕的事情会发生,对吧?您可能希望使用strncpy()而不是strcpy()