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

在C中创建带有结构的队列,第1张

概述我有一个代码(在这篇文章的末尾)实现了一个循环队列系统.一切都很完美,但是在函数createQueue中可以看到,队列只针对整数实现.我想修改此代码以接受用户通知的结构. 我可以创建一个已知的结构并用整数替换所有站点,但这样我就会将代码耦合到一个已知的结构.馊主意… 怎么可以传递给createQueue函数一个内存分配的结构,而不需要先知道结构?还应该更改struct Queue,在int *元素 我有一个代码(在这篇文章的末尾)实现了一个循环队列系统.一切都很完美,但是在函数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 Empty\n");                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 Empty\n");                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 Full\n");        }        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 %d\n",front(Q));        Enqueue(Q,5);        Dequeue(Q);        Enqueue(Q,6);        printf("Front element is %d\n",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 Empty\n");\                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 Empty\n");\                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 Full\n");\        }\        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 %f\n",front_float(QF));        Enqueue_float(QF,5);        Dequeue_float(QF);        Enqueue_float(QF,6);        printf("Front element is %f\n",front_float(QF));}

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

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

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

总结

以上是内存溢出为你收集整理的在C中创建带有结构的队列全部内容,希望文章能够帮你解决在C中创建带有结构的队列所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1221525.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存