链接列表头地址更改C.

时间:2012-12-14 08:56:38

标签: c pointers linked-list structure scanf

我创建了我的结构的链接列表,但由于某种原因每次我添加另一个链接它会更改头地址,但我希望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 个答案:

答案 0 :(得分:2)

这里的问题是您没有分配新节点,只有一个节点可以反复更改。您需要在循环内分配节点。

答案 1 :(得分:1)

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

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

之前
    cp->next = NULL;

线

答案 2 :(得分: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;
}

答案 3 :(得分:0)

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

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

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

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