2017-02-14 60 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