我使用链表实现了队列。显示功能仅打印最后一个元素。但我想显示所有元素。有人可以纠正吗?还有其他写显示功能的方式吗?节点声明错误吗?
我的代码如下:
#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;
}
}
答案 0 :(得分:1)
评论已经发现了问题所在,但只是为了给出答案:
在insert
函数中,以下行是问题所在:
np=q->rear;
应该是:
q->rear=np;
可按预期工作:
Queue is empty
Inserted 1
Inserted 2
Inserted 3
Inserted 4
Removed 1
2 3 4