1

好吧,这是一个非常简单的问题:为什么第一个代码块可以编译,而第二个代码块不能?它们看起来应该是等价的,因为我改变的只是变量声明/引用。

第一的:

int memberStudents(struct studentType x, Snodeptr students, Snodeptr *s) {
    Snodeptr p = *s;

    while (p->next != NULL) {
        if (strcmp(x.sid, p->student.sid) == 0)
            return 1;

        p = p->next;
    }

    return 0;
}

第二:

int memberStudents(struct studentType x, Snodeptr students, Snodeptr *s) {
    while (s->next != NULL) {
        if (strcmp(x.sid, s->student.sid) == 0)
            return 1;

            s = s->next;
    }

    return 0;
}

我想更改 Snodeptr 以使其指向正确的位置,但是当我尝试第二个代码块时,我收到一条错误消息,指出在不是结构或联合的东西中请求成员“下一个”。

4

4 回答 4

3

Snodeptr *s并且Snodeptr p是不同的类型,因此行为不同

尝试(*s)->next

于 2012-12-06T19:16:30.477 回答
2

在第一个块中,while循环在一个Snodeptr实例上运行。在第二个块中,您正在对Snodeptr*.

于 2012-12-06T19:16:20.757 回答
1

在第二个代码中,您使用s->next != NULL, s 是指针。

在第一个代码中,您使用p->next != NULL的是 p 不是指针

于 2012-12-06T19:16:57.433 回答
1

我希望这个(您的第二个片段的略微修改版本)应该编译:

int memberStudents(struct studentType x, Snodeptr students, Snodeptr *s) {
    while ((*s)->next != NULL) {
        if (strcmp(x.sid, (*s)->student.sid) == 0)
            return 1;

            (*s) = (*s)->next;
    }
    return 0;
}
于 2012-12-06T19:22:34.850 回答