【问题标题】:Iterate Through a Linked List to Do Something遍历链表做某事
【发布时间】:2021-05-29 10:07:51
【问题描述】:

我有一个链接列表,其中包含一个文件的路径以及它所属的 groupID。我的程序在当前目录中查找常规文件,并且我试图遍历链表以便对链表做一些事情。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>

typedef struct FileGroups
{
    int groupID;
    char *path;
    struct FileGroups* next;
} FileGroups;

FileGroups *head;
int GroupID = 1;

void insert(char *path)
{
    FileGroups *temp;
    temp = (FileGroups*)malloc(sizeof(FileGroups));
    temp->groupID = GroupID++;

    temp->path = malloc(strlen(path)*sizeof(char));
    strcpy(temp->path, path);

    temp->next = head;
    head = temp;
    temp = temp->next;
}

void print()
{
    FileGroups *temp;
    temp = head;
    printf("\nLinked list: \n");
    while(temp!=NULL)
    {
        printf("%d %s\n", temp->groupID, temp->path);
        temp = temp->next;
    } 
}

void listFilesRecursively(const char *basePath)
{
    char path[1024];
    struct dirent *dp;
    DIR *dir = opendir(basePath);

    if (!dir)
    {
        return;
    }

    while ((dp = readdir(dir)) != NULL)
    {
        if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
        {
            struct stat sb;
            FileGroups *temp;
            temp = head;

            strcpy(path, basePath);
            strcat(path, "/");
            strcat(path, dp->d_name);

            if(stat(path, &sb) == 0 && S_ISREG(sb.st_mode))
            {
                insert(path);
                while(temp!=NULL)
                {
                    printf("Do something with %s\n", temp->path);
                    temp = temp->next;
                }
                printf("\n");
            }

            else
            {
                return;
            }
        }
    }
    closedir(dir);
}

int main()
{
    listFilesRecursively(".");

    print();

    return 0;
}

这是我运行程序时得到的输出:

我不确定我是否正确地遍历了链表,因为它似乎在迭代地打印出“做某事”,但每次通过循环时,似乎都会对printf("Do something\n"); 添加一个额外的调用无论以前的文件路径与它所在的当前文件路径一起,我希望它只对正在添加到列表中的当前文件路径做一些事情。在它的第一个循环中似乎也没有printf("Do something\n");,因为在我们甚至用目录中的第一个文件打印出“做某事”之前有一个换行符,最后一件事是它对目录中的最后一个文件没有做任何事情这是./testing.txt。提前感谢您的建议和建议!

【问题讨论】:

  • temp = head; 你每次都是从头开始。因此,Do something print 语句当然会在每次添加新元素时打印整个列表。如果你不想这样,那么就没有while(temp!=NULL) 循环。只需printf("Do something with %s\n", path);
  • 在C中,malloc的返回不需要强制转换,没有必要。见:Do I cast the result of malloc?
  • 你指的是哪一部分?

标签: c unix linked-list system singly-linked-list


【解决方案1】:

这是因为您在构建它时正在循环整个列表。循环浏览目录内容后打印列表,或者更好的是,只打印目录搜索循环中的单个项目。

while(temp!=NULL)
{
    printf("Do something with %s\n", temp->path);
    temp = temp->next;
}

应该是:

printf("Do something with %s\n", path);

【讨论】:

  • 应该是。我认为不完全是。 temp 不指向刚刚添加的节点。
  • 谢谢我没有在插入中发现temp = head 位!
猜你喜欢
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 2021-02-13
  • 2013-10-14
相关资源
最近更新 更多