2

我有这个嵌套的while循环,从文件中读取行并创建一个邻接列表。问题似乎不在于内部循环,因为它通过了那个循环,但它在将文件中的最后一个点保存到邻接列表之前就停止了运行。我已经用几个不同的文件(不同大小)进行了测试,它总是在最后一点之前。我一生都无法弄清楚为什么会这样做,但也许其他人可以帮助我?

文件中的行很好地存储到 current->next 数组中,它只是我遇到问题的 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 回答