2011-02-01 3 views
0

テキストファイルを読み込み、各行をvoid *型のリンクリストのノードに格納しようとしています。 ここにリストのヘッダファイルがあります。タイプのリンクリストvoid *

#ifndef LINKEDL 
#define LINKEDL 

struct node_s { 
    void *data; 
    struct node_s *next;  
}; 

struct node_s *node_create(void*); 
struct node_s *list_insert_after(struct node_s*, void*); 
struct node_s *list_insert_beginning(struct node_s*, void*); 
int list_remove(struct node_s*, struct node_s*); 
int list_foreach(struct node_s*, int(*)(void*)); 
int printstring(void *s); 


#endif 

すべてのリンクされたリスト機能は完全にテストされているので、どのように使用するかによって問題が発生すると思います。私が達成したいのは、各ノードに1行ずつあり、私が今持っているのは、すべてのノードの最終行です。私はそれがチャーポインターと関係があると思うが、驚くべき突破口なしにすでに2時間を費やしているので、多分誰かが助けることができるだろうか? また、私が使用するリストは、hereのように変更されたリストです。

if (file == NULL) 
{ 
    perror("Error opening file"); 
} 
else 
{ 
    char mystring[SIZE]; 
    char temp[SIZE]; 

    list = node_create((void*)mystring); 
    current = list; 
    while (fgets(mystring, SIZE, file) != NULL) 
     { 
      strcpy(temp, mystring); 
      printf("%d\t%s",counter++,temp); 
      current=list_insert_after(current, (void*)temp);      
      } 
      fclose(file); 

     } 

更新日: ありがとうございました。

+1

current=list_insert_after(current, (void*)temp); 

strcpy(temp, mystring); 

をそしてラインを変更この同じ文字列を指しています。新しいノードがポイントするための新しい文字列をmallocする必要があります。 –

答えて

1

行削除:あなたはだけなので、すべてのノードがなり、1つの文字列変数(のMyString)を持っている

current=list_insert_after(current, strdup(mystring)); 
+0

'free'の使い方の例を見るのもいいでしょう。 –

+0

リストを歩いて破壊するコードはありませんでした。 –

3

各ノードは、単一のアレイtempを使用して作成しています。行を読むたびに、tempの内容を最後に読み込んだ行に置き換えます。そのため、すべてのノード(すべてのノードで同じメモリ位置を参照しています)に最終行があります。

あなたがすべきことは、mallocを使って各行に対して動的にメモリを割り当てることです。したがって、tempを渡す代わりに、新しく割り当てられたメモリへのポインタをlist_insert_afterに渡す必要があります。

1

これについて考えてみましょう。(ブロックのelseブロックの)スコープ外に出てきてスタックに一時的なchar配列があり、その配列へのポインタをリストに挿入しています。結局のところ、リストは破壊されたデータ/不正確なデータへのポインタを持つことになります。動作は未定義です。

各文字列に動的にメモリを割り当てる必要があります(また、それを忘れないでください)。 strdupはここで便利です。そのリストから文字列を削除/削除するときには、freeに電話することを忘れないでください。

関連する問題