2011-12-25 12 views
0

私はすでにこれについて多くのことを探っていますが、私は一つのことを知りたいと思います。私は.csvファイルを読んで、structのリンクリストに渡してください。ファイルの行は同じサイズではありません。fgetsを使って.CSVファイルを読む

私はそれぞれの行を読み、[「」を通じて情報を取得し、structに渡すstrtokを使用するために使用fgets()を考えています。

I'M USING LINUX。

typedef struct nodo 
{ 
int row1; 
char row2; 
int row3; 
struct nodo *next; 
struct nodo *nant; 
}nodo; 

nodo* insert_last(nodo* base1, nodo* nv) 
{ 
    if(base1 == NULL) 
     base1 =nv; 

    base1->next = NULL; 
    while(base1->next != NULL) 
     base1 = base1->next; 
    base1->next = nv; 
    nv->nant = base1; 
    nv->next = NULL;  
} 

nodo* put2memory(nodo *base1) 
{ 
    nodo *nv; 
    FILE *fp1=fopen(xxx,"r"); 
    char *tok; 

    while(fgets((buffer, sizeof(buffer),fp1) != NULL)) 
    { 
     nv = (nodo*) malloc (sizeof(nodo)); 
     nv->next=NULL; 
     tok = strtok(buffer,","); 
     nv->row1=tok; 
     tok = strtok(NULL,","); 
     nv->row2=tok; 
     tok = strtok(NULL,","); 
     nv->row3=tok; 

     insert_last(base1,nv); 
    } 
    free(nv); 
} 

int main() 
{ 
    nodo *base1; 

    put2memory(base1); 
    return 0; 
} 

私はそんなことをしていると思っていますが、私は "私の友人"セグメンテーションフォルトを返しています!

構文ファイル:

123、ABC、23 23、D、444 。 。 。

+0

あなたはbase1とnvポインタを使用していますが、関数のパラメータをxとyとして宣言しています! – Neo

+0

このプログラムをコンパイルできますか? – Neo

+0

no..my bad .. nodo * insert_last(nodo * base1、nodo * nv) – joaopfsilva

答えて

2

insert_lastbase1がnullの場合は、私によく見えません。

nodo* insert_last(nodo* base1, nodo* nv) 
{ 
    if(base1 == NULL) 
     base1 =nv; 

少なくとも、return nvをここに入力します。それがなければ、あなたのコードはnv->nextからnvに設定されます。 (というか `NV後に設定されますbase1nvを挿入しようとします。)

広い点として、それは挿入する前に、リストの最後を見つけなければならないので、あなたのinsert_lastはO(n)があることに注意してください。つまり、N個の要素を挿入することはO(N )です。まともなリンクリストの実装は、メモリ内のテール要素を追跡し、一定の時間内に挿入します。

更新:コードの残りを読んでください。

nodo *base1; 

put2memory(base1); 

base1

が初期化されておらず、この時点でゴミ値である:これも無効です。それをポインタとして使用しようとしています。

  • insert_lastreturnステートメントを追加します。

    は、ここでそれを修正する方法のための1つの提案です。私はリストの頭を返すことをお勧めします。頭と尾の両方を保管し、O(N)の挿入物を避ける方が良いでしょう。

  • 変更insert_lastへお電話のようなものを行うに:

    LIST_HEAD = insert_lastを(BASE1、ネバダ州);

    LIST_HEAD = put2memory(NULL);:

  • mainでは、あなたのような何かを行うことができます

再び更新: O(1)の挿入を説明するために、ここにあなたのput2memoryの調整があります。最終的には、すべてのリストノードでfree()に電話する必要があります。

nodo* put2memory() 
{ 
    nodo *head = NULL, *prev = NULL, *nv; 
    FILE *fp1=fopen(xxx,"r"); 
    char *tok; 

    while(fgets((buffer, sizeof(buffer),fp1) != NULL)) 
    { 
     nv = (nodo*) malloc (sizeof(nodo)); 
     nv->next=NULL; 
     tok = strtok(buffer,","); 
     nv->row1=tok; 
     tok = strtok(NULL,","); 
     nv->row2=tok; 
     tok = strtok(NULL,","); 
     nv->row3=tok; 

     if (prev) 
      prev = prev->next = nv; 
     else 
      head = prev = nv; 
    } 

    return head; 
} 
関連する問題