加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中创建带有结构的队列

发布时间:2020-12-16 10:36:57 所属栏目:百科 来源:网络整理
导读:我有一个代码(在这篇文章的末尾)实现了一个循环队列系统.一切都很完美,但是在函数createQueue中可以看到,队列只针对整数实现.我想修改此代码以接受用户通知的结构. 我可以创建一个已知的结构并用整数替换所有站点,但这样我就会将代码耦合到一个已知的结构.馊
我有一个代码(在这篇文章的末尾)实现了一个循环队列系统.一切都很完美,但是在函数createQueue中可以看到,队列只针对整数实现.我想修改此代码以接受用户通知的结构.

我可以创建一个已知的结构并用整数替换所有站点,但这样我就会将代码耦合到一个已知的结构.馊主意…

怎么可以传递给createQueue函数一个内存分配的结构,而不需要先知道结构?还应该更改struct Queue,在int *元素中,值应该从integer变为void?

#include <stdio.h>
#include <stdlib.h>

typedef struct Queue
{
        int capacity;
        int size;
        int front;
        int rear;
        int *elements;
}Queue;

Queue * createQueue(int maxElements)
{
        /* Create a Queue */
        Queue *Q;
        Q = (Queue *)malloc(sizeof(Queue));
        /* Initialise its properties */
        Q->elements = (int *)malloc(sizeof(int)*maxElements);
        Q->size = 0;
        Q->capacity = maxElements;
        Q->front = 0;
        Q->rear = -1;
        /* Return the pointer */
        return Q;
}
void Dequeue(Queue *Q)
{
        /* If Queue size is zero then it is empty. So we cannot pop */
        if(Q->size==0)
        {
                printf("Queue is Emptyn");
                return;
        }
        /* Removing an element is equivalent to incrementing index of front by one */
        else
        {
                Q->size--;
                Q->front++;
                /* As we fill elements in circular fashion */
                if(Q->front==Q->capacity)
                {
                        Q->front=0;
                }
        }
        return;
}
int front(Queue *Q)
{
        if(Q->size==0)
        {
                printf("Queue is Emptyn");
                exit(0);
        }
        /* Return the element which is at the front*/
        return Q->elements[Q->front];
}
void Enqueue(Queue *Q,int element)
{
        /* If the Queue is full,we cannot push an element into it as there is no space for it.*/
        if(Q->size == Q->capacity)
        {
                printf("Queue is Fulln");
        }
        else
        {
                Q->size++;
                Q->rear = Q->rear + 1;
                /* As we fill the queue in circular fashion */
                if(Q->rear == Q->capacity)
                {
                        Q->rear = 0;
                }
                /* Insert the element in its rear side */ 
                Q->elements[Q->rear] = element;
        }
        return;
}
int main()
{
        Queue *Q = createQueue(5);
        Enqueue(Q,1);
        Enqueue(Q,2);
        Enqueue(Q,3);
        Enqueue(Q,4);
        printf("Front element is %dn",front(Q));
        Enqueue(Q,5);
        Dequeue(Q);
        Enqueue(Q,6);
        printf("Front element is %dn",front(Q));
}

解决方法

即使你不是C的好朋友,你也可以创建一个伪模板:

#include <stdio.h>
#include <stdlib.h>

#define QUEUE_TEMPLATE(ELTTYPE) 
typedef struct 
{
        int capacity;
        int size;
        int front;
        int rear;
        ELTTYPE *elements;
}Queue_##ELTTYPE;

Queue_##ELTTYPE * createQueue_##ELTTYPE(int maxElements)
{
        /* Create a Queue */
        Queue_##ELTTYPE *Q;
        Q = (Queue_##ELTTYPE *)malloc(sizeof(Queue_##ELTTYPE));
        /* Initialise its properties */
        Q->elements = malloc(sizeof(ELTTYPE)*maxElements);
        Q->size = 0;
        Q->capacity = maxElements;
        Q->front = 0;
        Q->rear = -1;
        /* Return the pointer */
        return Q;
}
void Dequeue_##ELTTYPE(Queue_##ELTTYPE *Q)
{
        /* If Queue size is zero then it is empty. So we cannot pop */
        if(Q->size==0)
        {
                printf("Queue is Emptyn");
                return;
        }
        /* Removing an element is equivalent to incrementing index of front by one */
        else
        {
                Q->size--;
                Q->front++;
                /* As we fill elements in circular fashion */
                if(Q->front==Q->capacity)
                {
                        Q->front=0;
                }
        }
        return;
}
ELTTYPE front_##ELTTYPE(Queue_##ELTTYPE *Q)
{
        if(Q->size==0)
        {
                printf("Queue is Emptyn");
                exit(0);
        }
        /* Return the element which is at the front*/
        return Q->elements[Q->front];
}
void Enqueue_##ELTTYPE(Queue_##ELTTYPE *Q,ELTTYPE element)
{
        /* If the Queue is full,we cannot push an element into it as there is no space for it.*/
        if(Q->size == Q->capacity)
        {
                printf("Queue is Fulln");
        }
        else
        {
                Q->size++;
                Q->rear++;
                /* As we fill the queue in circular fashion */
                if(Q->rear == Q->capacity)
                {
                        Q->rear = 0;
                }
                /* Insert the element in its rear side */ 
                Q->elements[Q->rear] = element;
        }
        return;
}

QUEUE_TEMPLATE(int);
QUEUE_TEMPLATE(float);

int main()
{
        Queue_int *Q = createQueue_int(5);
        Queue_float *QF = createQueue_float(5);
        Enqueue_int(Q,1);
        Enqueue_int(Q,2);
        Enqueue_int(Q,3);
        Enqueue_int(Q,front_int(Q));
        Enqueue_int(Q,5);
        Dequeue_int(Q);
        Enqueue_int(Q,front_int(Q));

        Enqueue_float(QF,1);
        Enqueue_float(QF,2);
        Enqueue_float(QF,3);
        Enqueue_float(QF,4);
        printf("Front element is %fn",front_float(QF));
        Enqueue_float(QF,5);
        Dequeue_float(QF);
        Enqueue_float(QF,6);
        printf("Front element is %fn",front_float(QF));
}

我添加了2种不同类型的实例.输出是:

Front element is 1
Front element is 2
Front element is 1.000000
Front element is 2.000000

这种方法的缺点:宏代码上的编译错误可能很难追踪.您可以使用已知类型创建代码,调试/改进它,然后使用sed过滤器生成宏代码,用ELTTYPE替换类型并添加#define和尾部反斜杠

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读