据我了解,您需要一个队列,您可以在其中存储表示整数对的项目(又名 x,y)和表示单个整数的项目。
您定义的队列无法做到这一点:
struct queue {
int items[SIZE]; <--- each item can only hold a single integer! Not a pair of integers
int front;
int rear;
};
所以你需要另一个数据结构。
此外,您的 enqueue 函数使用两种不同类型的参数调用
int c[2] = {2,3};
enqueue(q, c); <--- here the argument is a int-pointer (because c decays into int-pointer)
enqueue(q, 6); <--- here the argument is a integer
这在 C 中是不允许的。所以你需要两个不同的函数。一个用于对,一个用于整数。
有许多不同的方法可以实现您的要求。下面是一个使用struct dataitem 存储实际数据的示例。 size 字段用于检查存储的数据是一对还是一个整数。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 8
struct dataitem
{
int size; // Will be 2 for pairs and 1 for single integers
int data[2];
};
struct queue {
struct dataitem items[SIZE];
int front;
int rear;
};
struct queue* createQueue() {
struct queue* q = malloc(sizeof *q);
q->front = 0;
q->rear = 0;
return q;
}
int full(struct queue* q)
{
return (((q->rear + 1) % SIZE) == q->front);
}
int empty(struct queue* q)
{
return (q->rear == q->front);
}
// Add single integer
void enqueue_int(struct queue* q, int value){
if (full(q))
{
printf("\nQueue is Full!!");
return;
}
q->items[q->rear].size = 1;
q->items[q->rear].data[0] = value;
q->rear = (q->rear + 1) % SIZE;
}
// Add pair of integers
void enqueue_pair(struct queue* q, int* values){
if (full(q))
{
printf("\nQueue is Full!!");
return;
}
q->items[q->rear].size = 2;
q->items[q->rear].data[0] = values[0];
q->items[q->rear].data[1] = values[1];
q->rear = (q->rear + 1) % SIZE;
}
void printQueue(struct queue* q)
{
int tmp = q->front;
printf("Queue Contains: ");
int flag = 0;
while(tmp != q->rear)
{
if (flag) printf(", ");
flag = 1;
if (q->items[tmp].size > 1)
{
printf("(%d,%d)", q->items[tmp].data[0], q->items[tmp].data[1]);
}
else
{
printf("%d", q->items[tmp].data[0]);
}
tmp = (tmp + 1) % SIZE;
}
printf("\n");
}
struct dataitem dequeue(struct queue* q)
{
struct dataitem res;
if (empty(q))
{
res.size = 0;
}
else
{
res = q->items[q->front];
q->front = (q->front + 1) % SIZE;
}
return res;
}
int main()
{
int c[2] = {2,3};
struct queue* q = createQueue();
enqueue_pair(q, c);
enqueue_int(q, 6);
printQueue(q);
struct dataitem data;
for (int i=0; i<3; ++i)
{
data = dequeue(q);
if (data.size == 0)
{
printf("queue was empty\n");
}
else if (data.size == 1)
{
printf("queue had integer %d\n", data.data[0]);
}
else
{
printf("queue had pair (%d,%d)\n", data.data[0], data.data[1]);
}
}
return 0;
}