未能构建“类似队列”的结构 - 结构声明的问题?

时间:2010-11-01 20:27:12

标签: c struct

嘿伙计们。这是一个非常简单的问题,我敢肯定,但是我会像往常一样把自己纠缠在C引用/指针中。我正在尝试使用排序链接列表构建一个...排序队列。基本上,我有一个结构,其中包含内容和指向下一个元素的指针。我还有一个指向第一个和最后一个元素的指针。然后我有一个循环,将构建'排队队列'。我的问题是我的逻辑是失败的,我没有正确地初始化队列,或者我对C结构的了解是失败的(这很可能)并且我最终只是创建一个结构并不断引用它。

我的测试代码如下:

#include <stdio.h>

struct test {
    int contents;
    struct test *next;
};

main() {

    struct test *first = NULL;
    struct test *last = NULL;
    int i;

    for (i = 0; i < 2; i++) {
        struct test tmp;
        if (first == NULL) {
            first = &tmp;
            last = &tmp;
        } else {
            last->next = &tmp;
            last = &tmp;
        }
        tmp.x = i;
        tmp.next = NULL;
    }

    while (first != NULL) {
        printf("%d\n", first->x);
        first = first->next;
    }

    return 0;

}

运行这个,我得到的输出首先似乎指向一个值为'1'的测试结构,因为它是'x'变量 - 所以不是我想要的初始值。那么,我在逻辑上失败了,还是我没理解如何在循环中声明新的单独结构?或者两者都有?我很累......&gt; _&lt;。

感谢。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是您正在获取临时变量tmp的地址,并将其分配给比临时变量firstlast长得多的指针。在循环的每次迭代之后,临时消失并继续通过firstlast访问它导致未定义的行为。

您需要在堆上创建一个值,以便像这样构建列表(为简洁起见,省略了错误检查)

struct test* tmp = malloc(sizeof(struct test));

稍后您需要通过free所有已分配的节点。