2017-02-14 5 views
1

リンクリストの配列を作成しようとしています。配列はアルファベットの文字に対応するサイズ26の各部分である。ユーザはPCのディレクトリを入力し、そのディレクトリ内の任意のフォルダまたはファイルの名前が、どの文字で始まるかに基づいてアレイ内のリンクリストに追加される。私はIT-をやろうとしてきたどのようにディレクトリから追加されたリンクリストの配列

>

#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」などの配列の最初のノードをスポット上に追加するとプログラムがうまくいくように見えますが、2度目のように追加しようとすると永遠に、またはPCがクラッシュするまで、「ccc.txt」が存在する場合に発生します。

答えて

1

addNodeでリストの挿入ポイントを見つけるための正しい値をチェックしていません。リンクリストを

へのポインタのポインタの列挙は、しばしばリストの最後のnextポインタ、毎回言っポインタのアドレスを保持するヘッドポインタから徒歩するために使用されます。 NULL(空のリストの場合はhead)に到達すると停止し、逆参照によってポインター・ツー・ポインターを使用して新しいノード・アドレスを割り当てることができます。

あなたは尾に挿入したい場合は、それを行うための方法は、このようなものになるだろう。このようなあなたの更新returner関数から呼び出されます

#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; 
} 

:私は見

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

関連する問題