【发布时间】:2019-12-28 09:37:01
【问题描述】:
我使用链表实现了队列。显示功能仅打印最后一个元素。但我想显示所有元素。有人可以纠正吗?显示函数还有哪些写法?节点声明错了吗?
我的代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef int QueueElement;
typedef enum {TRUE,FALSE} Boolean;
typedef struct node{
QueueElement entry;
struct node *next;
} Node;
typedef struct{
int count;
Boolean full;
Node *front;
Node *rear;
} Queue;
void createQueue(Queue *q){
q->count=0;
q->front=q->rear=NULL;
q->full=FALSE;
}
Boolean IsFull(Queue *q){
return (q->full);
}
Boolean IsEmpty(Queue *q){
return (q->front==NULL && q->rear==NULL);
}
void insert(QueueElement x,Queue *q){
Node *np;
np=(Node*)malloc(sizeof(Node));
if(np==NULL){
printf("Not enough memory\n");
q->full=TRUE;
}
else{
np->entry=x;
np->next=NULL;
if(IsEmpty(q))
q->front=q->rear=np;
else{
q->rear->next=np;
np=q->rear;
}
++q->count;
printf("Inserted %d\n", x);
}
}
void Remove(Queue *q){
Node *np;
if(IsEmpty(q))
printf("Queue is empty\n");
else{
q->count--;
int x=q->front->entry;
np=q->front;
q->front=q->front->next;
if(q->front==NULL)
q->rear=NULL;
free(np);
printf("Removed %d\n",x);
}
}
void display(Queue q){
//if(IsEmpty(q))
// printf("Queue is empty\n");
Node *iter = q.front;
while(iter) {
printf("%d ", iter->entry);
iter = iter->next;
}
}
int main()
{
Queue q;
createQueue(&q);
Remove(&q);
insert(1,&q);
insert(2,&q);
insert(3,&q);
insert(4,&q);
Remove(&q);
display(q);
return 0;
}
我的显示功能如下:
void display(Queue q){
//if(IsEmpty(q))
// printf("Queue is empty\n");
Node *iter = q.front;
while(iter) {
printf("%d ", iter->entry);
iter = iter->next;
}
}
【问题讨论】:
-
您是否确保您的队列结构本身是正确的,并且前面和所有的指针都指向正确的位置?
-
如果您正确缩进代码,您将获得更多帮助。
-
您不会在
insert函数中更新q->rear以在第一个之后插入。 -
这行
np=q->rear;对我来说看起来很奇怪。你打算做q->rear=np;吗? -
另一个问题:
Remove导致内存泄漏,因为free(np)仅在最后一个元素被删除时才被调用。