如何显示使用c中的链表实现的队列元素?

时间:2019-12-28 09:37:01

标签: c queue

我使用链表实现了队列。显示功能仅打印最后一个元素。但我想显示所有元素。有人可以纠正吗?还有其他写显示功能的方式吗?节点声明错误吗?

我的代码如下:


#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;
    }
}

1 个答案:

答案 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