在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和尾部反斜杠 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |