我想知道为什么这里是用q.front->next = NULL而不是q.front.next = NULL
时间: 2024-04-21 22:23:39 浏览: 30
在这种情况下,我们使用的是指针而不是对象。因为`front`和`rear`是指向`link_node`结构体的指针,而不是实际的对象。
当我们使用指针来访问结构体的成员时,我们需要使用箭头运算符(`->`)。箭头运算符用于通过指针访问结构体或类的成员。
所以,正确的写法是`q.front->next = NULL`,而不是`q.front.next = NULL`。这是因为`front`是一个指针,我们需要通过箭头运算符来解引用该指针并访问其成员。
使用点运算符(`.`)用于直接访问对象的成员,而使用箭头运算符(`->`)用于通过指针间接访问对象的成员。
总结一下,在访问指针所指向的结构体或类的成员时,应使用箭头运算符。
相关问题
那这个结构体typedef struct link_node { elemtype data; link_node* next; }link_node;为什么他的要写成q.front->next = NULL呢
在这个结构体中,`link_node`表示链表的一个节点,包含了一个数据成员`data`和一个指向下一个节点的指针`next`。
在初始化队列时,我们希望队列为空,即没有任何元素。因此,我们需要将队列的`front`和`rear`指针都指向一个空节点。
在`init_queue`函数中,我们使用`malloc`函数为`front`和`rear`分配了内存,然后将它们都指向同一个节点。为了标识这个节点为空,我们将其`next`指针设置为`NULL`,表示它没有指向其他节点。
这样一来,当队列为空时,`front`和`rear`指针都指向这个空节点,并且通过`next`指针可以判断队列是否为空。如果`front->next`为`NULL`,表示队列为空;否则,表示队列中有元素。
总结一下,在初始化队列时,我们通过将队列的头指针和尾指针都指向同一个空节点,并设置其`next`指针为`NULL`来表示队列为空。
解释这段代码void EnQueue(LinkQueue &Q,QElemType e) //进队列操作 { QueuePtr p; if(!(p=(QueuePtr)malloc(sizeof(QNode)))) exit(0); p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; return; } int DeQueue(LinkQueue &Q,QElemType &e) //出队列操作 { QueuePtr p; if (Q.front==Q.rear) return 0; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); return 1; } void InitQueue(LinkQueue &Q) //构造一个空队列 { if (!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)))) exit(0); //申请空间失败 Q.front->next=NULL; return; } int QueueEmpty(LinkQueue Q) //判断链式队列是否为空 { return (Q.front->next==NULL); }
这段代码是一个链式队列的基本操作实现,包括进队列操作、出队列操作、构造空队列和判断队列是否为空。
- EnQueue函数实现了进队列操作,将元素e加入到队列Q的队尾。首先使用malloc函数申请一个新的结点p,将元素e赋值给p的data域,并将p的next指向NULL。然后将p添加到队列Q的队尾,并更新Q的rear指针指向p。
- DeQueue函数实现了出队列操作,将队列Q的队头元素出队,并将其存储到e中。首先判断队列是否为空,若为空则返回0。然后将队头结点p指向Q的front的下一个结点,将p的data域存储到e中,将Q的front指针指向p的下一个结点,如果p是队列Q的最后一个结点,则将Q的rear指向Q的front。最后释放p的空间,并返回1表示成功出队列。
- InitQueue函数用于构造一个空队列,首先使用malloc函数申请一个结点p作为队列的头结点,然后将Q的front和rear指针都指向p,并将p的next指向NULL。
- QueueEmpty函数用于判断链式队列是否为空,若队列的front的next指针为NULL,则队列为空,返回1,否则返回0。