2017-02-14 62 views
1

我一直在试图创建一个链接列表数组。该数组大小为26,每个部分对应于字母表中的一个字母。用户输入个人电脑的目录,然后将该目录中的任何文件夹或文件的名称添加到阵列中的链接列表中,根据它们以什么字母开头。从目录中添加链接列表数组

如何我一直试图做它 - >

#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功能,目录是存在一个已经被检查计算机目录:

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”)时,该程序似乎很好,但一旦尝试添加一秒在“ccc.txt”之后存在一个“ccd.txt”,当它一直保持或直到电脑崩溃时

回答

1

您不在addNode中查找列表插入点的正确值。

指针到指针枚举通过链表被频繁用于从头指针每次拿着地址上述指针的走到最后next指针列表。当你到达一个是NULL(在空列表的情况下将是head),你停下来,你可以通过解引用使用指针指针来指定你的新节点地址。

如果要插入尾部的方式做这将是这样的:

#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); 
    } 
} 
+0

我明白了,谢谢很多这完美的作品!这是第一次在C中做这样的事情,所以我认为我试图解决这个问题的时候太过分了,结果在这个过程中变得更加复杂。 –

+1

@SeanM你比大多数人更接近,通常他们第一次尝试用C语言进行指针指针工作。无论如何,很高兴它有所帮助。祝你好运。 – WhozCraig

+0

@SeanM也许应该提到这一点:你在'print'函数中有内存泄漏。那'malloc'线没有生意在那里。这不是Java或C#。 – WhozCraig