添加到 from 目录的链表数组

Array of linked lists added to from directory

我一直在尝试创建一个链表数组。该数组大小为 26,每个部分对应于字母表中的一个字母。用户输入PC的一个目录,该目录下的任何文件夹或文件的名称将根据它们的开头字母添加到数组中的链表中。

我是如何尝试的->

#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>

我的节点及其声明:

struct node{
       char data[50];
       struct node *next;
};

struct node* nodeArray[26];

我的字母表:

const char* basis[26] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};

一个字符串比较函数,用于检查我的单词在数组中的哪个链表(与字母表比较)

int StartsWith(const char *a, const char *b)
{
   if(strncasecmp(a, b, strlen(b)) == 0) return 1;
   return 0;
}

我在哪里添加节点以及问题出在哪里(printf("1") 是为了防止我的计算机基本上崩溃):

void addNode(struct node **q,const char *d){
        if(((*q)->data)==NULL){
            *q = malloc(sizeof(struct node));
            strncpy((*q)->data,d,50);
            (*q)->next = NULL;
        } else {
            (*q)->next = malloc(sizeof(struct node));
            *q = (*q)->next;
            printf("1");
            addNode(q,d);
            }
}

调用addNode的函数,directory为已校验存在的计算机目录:

void returner(char* directory){
    int i;
    DIR *dp;
    struct dirent *ep;
    char* tempD;
    dp = opendir (directory);
    struct node **z;

    while ((ep = readdir(dp))){
              tempD = (char*)malloc(50);
        if ( !strcmp(ep->d_name, ".") || !strcmp(ep->d_name, "..") ){

        } else {
            strncpy(tempD, ep->d_name, 50);
            for(i=0; i<26 ; i++){
                if(StartsWith(tempD, basis[i])){
                    z = &nodeArray[i];
                    addNode(z,tempD);
                    print();
                }
            }
        }
        free(tempD);
    }
closedir (dp);
}

打印功能:

void print(){
    int i;
    struct node *temp;

    for(i=0 ; i < 26; i++){
    temp = malloc(sizeof(struct node));
    temp = nodeArray[i];
    while(temp != NULL){
        printf("%s\n",temp->data);
        temp = temp->next;
    }
  }
}

将第一个节点添加到数组上的某个位置时,程序看起来很好,例如 "aaa.txt" "bbb.txt" "ccc.txt" "ddd.txt",但是每秒尝试一次像 "ccd.txt" 一样在 "ccc.txt" 存在之后添加,当它永远持续下去或直到电脑崩溃

您没有检查 addNode 中的正确值来查找列表插入点。

Pointer-to-pointer通过链表进行枚举经常被用来从头指针走到链表中最后一个next指针,每次持有地址 的 said-pointer。当你到达一个 NULL (在空列表的情况下将是 head )时,你停止,你可以通过取消引用使用你的 pointer-to-pointer 来分配你的新节点地址.

如果要在尾部插入,方法是这样的:

#define DATA_MAX_LEN    50

void addNode(struct node **q,const char *d)
{
    // assumes a null-terminated linked list
    while (*q)
        q = &(*q)->next;

    *q = malloc( sizeof **q );

    // ensures truncation and termination
    strncpy((*q)->data,d,DATA_MAX_LEN-1);
    (*q)->data[ DATA_MAX_LEN-1] = 0;

    // make sure we terminate the list at our new node
    (*q)->next = NULL;
}

从更新后的 returner 函数中调用,如下所示:

void returner(char* directory)
{
    DIR *dp = opendir (directory);
    if (dp)
    {
        struct dirent *ep;
        while ((ep = readdir(dp)))
        {
            // skip parent and self symbolic links
            if (ep->d_name[0] == '.' && (ep->d_name[1] == 0 || (ep->d_name[1] == '.' && ep->d_name[2] == 0)))
                continue;

            for(int i=0; i<26 ; i++)
            {
                if(StartsWith(ep->d_name, basis[i]))
                    addNode(nodeArray+i, ep->d_name);
            }
        }
        closedir (dp);
    }
}