无法将正确的文件目录输出到带有 .cFileName 的链表

Cannot output correct file directories to a linked list with .cFileName

我正在尝试创建一个链表,其中的各个节点具有我文件夹中的文件名。对于每个附加文件夹,我想输出整个链接列表,其中包含以前已加载文件的名称。我在我的 C:\Intel 文件夹中有 2 个文件 - ExtremeGraphicsLogs。这是我的全部代码。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef struct item{
    char *data;
    struct item *next;
} tItem;

int insert(char *x, tItem **top){
    tItem *temp = (tItem *)malloc(sizeof(tItem));
    temp->data =    x;
    temp->next =    *top;
    *top       =    temp;
     tItem *iterator;
     iterator = *top;
    while(iterator!=NULL){//display whole linked list
        printf("\n\tNode data: %s, node next:0x%x\n", iterator->data, iterator->next);
        iterator = iterator->next;
    }
    return 0;
}

int main()
{
    tItem *head = NULL;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind, hFind_2;

    hFind = FindFirstFile("C:\Intel\*.*", &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE)
   {    printf ("FindFirstFile failed (%d)\n", GetLastError());
        return;}
   else
   {
      while (FindNextFile(hFind, &FindFileData))
      {
        printf ("\n\nNext file found is %s\n", FindFileData.cFileName);
        insert(FindFileData.cFileName, &head);
      }
      FindClose(hFind);
   }
    return 0;
}

输出为:

Next file found is ..

        Node data: .., node next:0x0

Next file found is ExtremeGraphics

        Node data: ExtremeGraphics, node next:0x330f80

        Node data: ExtremeGraphics, node next:0x0

Next file found is Logs

        Node data: Logs, node next:0x330fa0

        Node data: Logs, node next:0x330f80

        Node data: Logs, node next:0x0

我不知道为什么在 LogsExtremeGraphics,我不会在任何地方覆盖它。

感谢任何建议。

保存文件名时,您将指向链表中查找数据结构的 cFileName 成员的指针存储。所有列表元素都将指向那里。

cFileName 成员变量会被随后对 FindNextFile() 的调用用新找到的文件名覆盖。由于列表元素都指向那里,打印它们将重复打印姓氏。

要真正保存文件名,您必须在列表中存储 cFileName 的副本,例如使用 strdup().

创建的副本

你需要复制 x:

int insert(char *x, tItem **top){
    tItem *temp = (tItem *)malloc(sizeof(tItem));
    temp->data =    strdup(x);
    temp->next =    *top;
    *top       =    temp;
     tItem *iterator;
     iterator = *top;
    while(iterator!=NULL){//display whole linked list
        printf("\n\tNode data: %s, node next:0x%x\n", iterator->data, iterator->next);
        iterator = iterator->next;
    }
    return 0;
}