1

我正在 C 中创建一个通用队列,并且收到标题错误。我的 Queue.c 文件中的函数旨在接收初始化的指针。

这是我的结构代码:

struct QueueNode {

   struct QueueNode *prev;
   struct QueueNode *next;

};

typedef struct QueueNode QNode;

struct Queue {

    QNode front;
    QNode rear;
};

typedef struct Queue Q;

然后在我的队列初始化函数中,我得到了错误。这是我的功能:

void Q_Init(Q* const pointerQ){

    assert (pointerQ != NULL);   

    pointerQ.front->prev = NULL;
    pointerQ.front->next= pointerQ.rear;
    pointerQ.rear->prev = pointerQ.front;
    pointerQ.rear->prev = NULL;
}

我不完全确定为什么会收到错误消息。我认为由于 Queue 有 Node 成员而不是指针,我必须使用 pointerQ.front/rear 来访问它们,然后由于 Node 有指针成员,我然后使用 ->next/rear。

任何帮助,将不胜感激!

提前致谢!

4

3 回答 3

2

你的事情完全倒退了。左边是结构体还是指向结构体的指针决定是否使用'.'。或 '->' 不是右边的内容。

在您的情况下,pointerQ 是指向 struct 的指针,因此您使用 '->' 访问其字段:

pointerQ->front
pointerQ->rear

由于 front 和 back 是结构实例,而不是指针,因此您可以使用 '.' 访问它们的字段:

pointerQ->front.prev = NULL;
pointerQ->front.next = pointerQ->rear;
pointerQ->rear.prev = pointerQ->front;
pointerQ->rear.next = NULL;

一旦你修复了你可能会在第二次和第三次分配中遇到错误,因为左侧是 struct QueueNode * 而右侧是 Qnode(它是 struct QueueNode)。

要解决此问题,您需要:

pointerQ->front.next = &(pointerQ->rear);
pointerQ->rear.prev = &(pointerQ->front);

取前后地址。

于 2013-10-05T00:37:20.277 回答
0

pointerQ.front等等应该是pointerQ->front,因为pointerQ顾名思义,它是一个指针。

于 2013-10-05T00:32:35.817 回答
0

是否必须使用.运算符或->运算符取决于运算符左侧的位置,而不是右侧的位置。

pointerQ是一个指针。您不能将.运算符与指针一起使用,您必须使用->or*.组合。

同时,您frontrear成员的情况恰恰相反。这些成员不是指针。它们被声明为struct QueueNode类型的对象。您不能将它们与->运算符一起使用。您必须使用.操作员来访问他们的内脏。

例如,这是一个有效的成员访问语法pointerQ->front.prev。这也是有效的(*pointerQ).front.prev。您的代码中的内容无效。

于 2013-10-05T00:33:24.397 回答