2

このネストされた while ループを使用して、ファイルから行を読み取り、隣接リストを作成しています。問題は内部ループにあるようには見えませんが、それはそれを通過するためですが、ファイルから最後のポイントを隣接リストに保存する直前に実行を停止します。いくつかの異なるファイル (異なるサイズ) でテストしましたが、常に最後のポイントの直前です。私は一生、それがなぜそれをするのか理解できませんが、他の誰かが私を助けることができるでしょうか?

ファイルからの行は、現在の->次の配列に問題なく保存されます。これは、私が問題を抱えているnewPt隣接リストの最後のものです。実際、最後に while ループに入っていて、最後の数行を実行できないようです。

while(fscanf(fptr, "%d %d %d", &u, &v, &w) != EOF) { //read from file
    current->next=malloc(sizeof(struct line));
    current=current->next;
    current->u=u;
    current->v=v;
    current->w=w;
    current->useful=0;
    //add point to adjacency list
    currentPt=aList[u];
    while((currentPt->adj)!=NULL) {
        currentPt=currentPt->adj;
    }
    newPt=malloc(sizeof(struct adjacent));
    newPt->x=v;
    newPt->adj=NULL;
    currentPt->adj=newPt;
}

それが役立つ場合、これらは私が使用している構造です:

    struct line {
        int u;
        int v;
        int w;
        int useful;
        struct line *next;
    };
    struct adjacent {
        int x;
        int onqueue;
        struct adjacent *adj;
    };
    struct adjacent *aList[num+1];
    struct line *current;
    struct adjacent *currentPt;
4

3 に答える 3

1

fscanfの戻り値をさらに詳しく確認する必要があります。EOFファイルの終わりにある場合は戻ります。ただし、3回の変換が成功したことを示すには、3を返す必要があります。0たとえば、ファイルが空白行で終わっている場合に返されることがあります。

于 2012-11-05T05:52:29.460 に答える
0

デバッグのために、中間状態を出力する行を追加できます。

追加

printf("%d %d %d %p &p\n", u, v, w, current, currentPt);

外側の while ループの最後。

于 2012-11-05T21:03:49.450 に答える
-1

次のアプローチを試すことができますか..

while(!feof(fptr))
{
fscanf(fptr, "%d %d %d", &u, &v, &w);
//Rest of your code in while loop
}

これがうまくいくかどうか教えてください。

于 2012-11-05T06:27:12.097 に答える