【问题标题】:How to display the elements of a queue implemented using linked list in c?如何在c中显示使用链表实现的队列元素?
【发布时间】: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-&gt;rear 以在第一个之后插入。
  • 这行np=q-&gt;rear; 对我来说看起来很奇怪。你打算做q-&gt;rear=np; 吗?
  • 另一个问题:Remove 导致内存泄漏,因为 free(np) 仅在最后一个元素被删除时才被调用。

标签: c queue


【解决方案1】:

cmets 已经发现了问题,只是给出一个答案:

insert 函数中,以下行是问题所在:

np=q->rear;

应该是:

q->rear=np;

按预期工作:

Queue is empty
Inserted 1
Inserted 2
Inserted 3
Inserted 4
Removed 1
2 3 4

【讨论】:

  • @Nithur 我很高兴!如果它完全回答了您的问题,请接受答案
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2018-05-16
  • 2011-06-28
相关资源
最近更新 更多