0

我创建了我的结构的链表,但由于某种原因,每次我添加另一个链接时它都会改变头地址,但我希望 y 头地址是第一个条目。这是我的代码:

struct checkPoints *tgh = NULL;
struct checkPoints **linkedlist = &tgh;
struct checkPoints *cp = malloc(sizeof (struct checkPoints));
chPo = fopen(fileName, mode);
if (chPo == NULL) {
    printf("Can't find the files.");
    exit(1);
} else {
    for (i = 0; i < lines; i++) {

        fscanf(chPo, "%c %d %d %d:%d\n", &cp->dropOut, &cp->currentPoint, &cp->competitor, &cp->hour, &cp->minute);
        cp->next = NULL;
        if (*linkedlist == NULL) {
            printf("ONCE");
            *linkedlist = cp;
        } else {
            struct checkPoints *new = *linkedlist;
            while (new->next != NULL) {
                new = new->next;
            }
            new->next = cp;
        }
    }
}

每个 fscanf 发生它都会将头地址更改为下一个,有什么想法吗?

此行之后的头地址更改:fscanf(chPo, "%c %d %d %d:%d\n", &cp->dropOut, &cp->currentPoint, &cp->competitor, &cp->hour, &cp->minute);

结构是这样的:

struct checkPoints{
char dropOut;
int currentPoint;
int competitor;
int hour;
int minute;
struct checkPoints *next;
};
4

4 回答 4

2

这里的问题是你没有分配新的节点,你只有一个节点,你一遍又一遍地改变。您需要在循环内分配节点。

于 2012-12-14T09:02:39.053 回答
1

我没有看到任何 malloc/calloc 来创建新节点,这些节点将被添加到列表中。

您需要创建新节点,这些节点将被添加到列表中。正确的位置就在之前

    cp->next = NULL;

线

于 2012-12-14T09:03:12.417 回答
0

您需要为struct checkPoints您阅读的每一行分配一个新的。它会给你一个像这样的循环:

struct checkPoints *linkedlist = NULL;
/* … */
for (i = 0; i < lines; i++) {
    struct checkPoints *cp = malloc(sizeof(struct checkPoints));
    fscanf(chPo, "%c %d %d %d:%d\n", &cp->dropOut, &cp->currentPoint, &cp->competitor, &cp->hour, &cp->minute);
    cp->next = NULL;
    if (linkedlist == NULL) {
        linkedlist = cp;
    } else {
        struct checkPoints *new = linkedlist;
        while (new->next != NULL) {
            new = new->next;
        }
        new->next = cp;
    }
}

请注意,这种处理方式效率非常低,因为它需要为每一行再次扫描整个列表。您应该保留指向列表尾部的指针,以便可以在没有while循环的情况下追加。一个聪明的替代方法是将每一行放在列表的前面,一旦你阅读了整个文件,就反转整个列表。

struct checkPoints *cp;
for (i = 0; i < lines; i++) {
    cp = malloc(sizeof(struct checkPoints));
    fscanf(chPo, "%c %d %d %d:%d\n", &cp->dropOut, &cp->currentPoint, &cp->competitor, &cp->hour, &cp->minute);
    cp->next = linkedlist;
    linkedlist = cp;
}
cp = linkedlist;
linkedlist = NULL;
struct checkPoints *next = cp;
while (cp) {
    next = cp->next;
    cp->next = linkedlist;
    cp = next;
}
于 2012-12-14T09:05:32.763 回答
0

在您的情况下,您正在分配一个节点并将数据写入同一地址。

您需要为循环内的新节点分配内存。

必须在循环的开头添加以下行,

struct checkPoints *cp = malloc(sizeof (struct checkPoints));

于 2012-12-14T09:14:07.613 回答