【问题标题】:C Why does this loop through the first item? [closed]C 为什么这会遍历第一项? [关闭]
【发布时间】:2014-12-07 05:15:56
【问题描述】:

我正在加载一个文件:

05 11 2014 14 53 00
AB01 52.408 -4.217
XY23 51.750 -4.300
PQ29 52.100 -6.000
NY23 52.000 -5.900

第一行被放入一个 dateTime 结构中。然后我的代码应该遍历其余的行,将它们放入结构的链接列表中。但是,它会在无限循环中创建相同元素的链表。

typedef struct observer{
    char id[21];
    float lat;
    float longitude;
    struct observer *next;
} observer;

printf("Please enter the name of the observer file: ");
    scanf("%s", fileName);
    FILE* f1 = fopen(fileName, "r");
    if(f1 == NULL)
    {
        perror("Error opening file");
        return;
    }
    fscanf(f1, "%d %d %d %d %d %d", &dateTime.date, &dateTime.month, 
            &dateTime.year, &dateTime.hour, &dateTime.minute, &dateTime.second);
    while(fscanf(f1, "%s %f %f", temp_id, &temp_lat, &temp_long))
    {
        struct observer *new_obs = make_observer(temp_id, temp_lat, temp_long);
        insert_observer(new_obs, &observer_start);
        print_observer(&observer_start);
    }
    fclose(f1);

observer* make_observer(char *id, float lat, float longitude)
{
    observer *node = (observer*) malloc(sizeof(observer));
    strcpy(node->id, id);
    node->lat = lat;
    node->longitude = longitude;
    node->next = NULL;
    return node;
}

void insert_observer(observer *node, observer **list)
{
    observer *current;
    observer *previous = NULL;
    //int inserted = 0;

    if(*list == 0)
    {
        *list = node;
        return;
    }

    current = *list;
    while(current != NULL)
    {
        if(previous != NULL)
        {
            previous->next = node;
        }
        else
        {
            *list = node;
        }
        previous = current;
        current = current->next;
    }

}

【问题讨论】:

  • 呈现的代码甚至无法编译。
  • 我只展示了问题的相关代码,而不是我的整个文件
  • 所以,问题可能出在temp_id。哦,等等,您还没有包含该变量的定义。不过不用担心,你肯定它不相关。
  • 贴出temp_idfileName的定义。它肯定是该问题的候选贡献者。
  • 首先将while(fscanf(f1, "%s %f %f", temp_id, &temp_lat, &temp_long)) 更改为while(fscanf(f1, "%4s %f %f", temp_id, &temp_lat, &temp_long) == 3)

标签: c list file-io linked-list


【解决方案1】:

尝试将您的插入功能更改为:

void insert_observer(observer *node, observer **list)
{
    if (*list)
    {
        observer *current = *list;
        observer *previous;
        while (current)
        {
            previous = current;
            current = current->next;
        }
        previous->next = node;
    }
    else
        *list = node;
}

这只是找到列表的末尾并将节点附加到最后一个列表项。

您还需要更改主循环while 条件以检查是否已读取预期的字段数:

while (fscanf(f1, "%s %f %f", temp_id, &temp_lat, &temp_long) == 3)

【讨论】:

  • 谢谢 :) 我明白我做错了什么……我想在中间位置插入代码;我一直在为链接列表而苦苦挣扎……因为人们无缘无故地对我投反对票,所以有任何机会投赞成票吗?再次感谢:)
  • @MaxAtkins:您每次都在替换列表的头部。否决票可能是因为发布的代码无法编译(使得难以复制问题)并且缩进不佳(使其难以阅读和理解)。您至少可以将代码的主循环放入main() 并定义变量。
猜你喜欢
  • 2023-03-12
  • 2017-05-14
  • 1970-01-01
  • 2020-11-24
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多