
我可以创建一个已知的结构并用整数替换所有站点,但这样我就会将代码耦合到一个已知的结构.馊主意…
怎么可以传递给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中创建带有结构的队列所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)