根据初始化size参数,动态申请元素空间.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RET_TRUE 0
#define RET_FALSE -1
typedef struct Queue Queue;
struct Queue {
char **data;
int max_q_size;
int enq_pos; /* The index of element to be enqueued */
int deq_pos; /* The index of element to be dequeued */
int ele_nums; /* The count of element in queue */
int (*enqueue)(Queue *q, char *ele);
int (*dequeue)(Queue *q, char **ele);
int (*is_empty)(Queue *q);
int (*is_full)(Queue *q);
int (*get_queue_ele_num)(Queue *q);
void (*destroy)(Queue *q);
};
static int q_is_empty(Queue *q)
{
if(NULL == q)
return RET_FALSE;
if(q->ele_nums == 0)
return RET_TRUE;
return RET_FALSE;
}
static int q_is_full(Queue *q)
{
if(NULL == q)
return RET_FALSE;
if(q->ele_nums == q->max_q_size)
return RET_TRUE;
return RET_FALSE;
}
static int q_enqueue(Queue *q, char *ele)
{
int ele_len;
if(NULL == q || NULL == ele || q->is_full(q) == RET_TRUE)
return RET_FALSE;
ele_len = strlen(ele) + 1;
q->data[q->enq_pos] = malloc(ele_len);
if(q->data[q->enq_pos] == NULL) {
printf("enqueue: malloc fail for q->data[%d], size=%d\n", q->enq_pos, ele_len);
return RET_FALSE;
}
memset(q->data[q->enq_pos], 0, ele_len);
strcpy(q->data[q->enq_pos], ele);
printf("enqueue ok: q->data[%d]=%s\n", q->enq_pos, ele);
q->ele_nums++;
q->enq_pos++;
if(q->enq_pos == q->max_q_size)
q->enq_pos = 0;
return RET_TRUE;
}
/*
* q_dequeue will malloc for parameter *ele.
*/
static int q_dequeue(Queue *q, char **ele)
{
int ele_len;
char *q_ele;
if(NULL == q || q->is_empty(q) == RET_TRUE)
return RET_FALSE;
q_ele = q->data[q->deq_pos];
ele_len = strlen(q_ele) + 1;
*ele = malloc(ele_len);
if(*ele == NULL) {
printf("dequeue: malloc fail with %d bytes\n", ele_len);
return RET_FALSE;
}
memset(*ele, 0, ele_len);
strcpy(*ele, q_ele);
printf("dequeue ok: q->data[%d]=%s\n", q->deq_pos, *ele);
free(q->data[q->deq_pos]);
q->data[q->deq_pos] = NULL;
q->ele_nums--;
q->deq_pos++;
if(q->deq_pos == q->max_q_size)
q->deq_pos = 0;
return RET_TRUE;
}
static int get_queue_ele_num(Queue *q)
{
if(NULL == q)
return 0;
return q->ele_nums;
}
static void q_destroy(Queue *q)
{
int i;
if(NULL == q || NULL == q->data)
return;
for(i = 0; i < q->max_q_size; i++) {
if(q->data[i]) {
free(q->data[i]);
q->data[i] = NULL;
}
}
free(q->data);
q->data = NULL;
}
static int q_init(Queue *q, int size)
{
if(NULL == q || size <= 0)
return RET_FALSE;
q->data = malloc(size*sizeof(char *));
if(q->data == NULL) {
printf("q_init: malloc fail for q->data, size=%d\n", size);
return RET_FALSE;
}
q->max_q_size = size;
q->enq_pos = 0; /* The first enqueue element will be store at index 0 */
q->deq_pos = 0;
q->ele_nums = 0;
q->enqueue = q_enqueue;
q->dequeue = q_dequeue;
q->is_empty = q_is_empty;
q->is_full = q_is_full;
q->get_queue_ele_num = get_queue_ele_num;
q->destroy = q_destroy;
return RET_TRUE;
}
static void printf_msg(Queue *q)
{
printf("Queue is empty: %s\n", (q->is_empty(q) == RET_TRUE)?"TRUE":"FALSE");
printf("Queue is full: %s\n", (q->is_full(q) == RET_TRUE)?"TRUE":"FALSE");
printf("Element number in Queue: %d\n", q->get_queue_ele_num(q));
}
int main()
{
Queue q;
char *ele;
int i, count;
q_init(&q, 10);
printf_msg(&q);
/* Add 5 elements */
printf("We are going to add 5 elements into queue:\n");
q.enqueue(&q, "The first element");
q.enqueue(&q, "2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
q.enqueue(&q, "3:The third element");
q.enqueue(&q, "4:Bejing Beijing");
q.enqueue(&q, "5:The fivth element");
printf_msg(&q);
/* Remove 2 elements */
printf("We are going to remove 2 elements from queue:\n");
q.dequeue(&q, &ele);
printf("We got:%s\n", ele);
free(ele);
q.dequeue(&q, &ele);
printf("We got:%s\n", ele);
free(ele);
printf_msg(&q);
/* Add 9 elements */
printf("We are going to add 9 elements, but only 7 will be added successfully\n");
q.enqueue(&q, "6:66666666");
q.enqueue(&q, "7:7777777777777777");
q.enqueue(&q, "8:88888888888888888888");
q.enqueue(&q, "9:99");
q.enqueue(&q, "10:10101010110");
q.enqueue(&q, "11:111111111");
q.enqueue(&q, "12:121212121212121212");
q.enqueue(&q, "13:133333333333333"); /* fail to add */
q.enqueue(&q, "14:4444441444414441444"); /* fail to add */
printf_msg(&q);
/* Remove all elements */
printf("We are going to remove all elements\n");
count = q.get_queue_ele_num(&q);
for(i = 0; i < count; i++) {
q.dequeue(&q, &ele);
printf("We got:%s\n", ele);
free(ele);
}
printf_msg(&q);
return 0;
}
程序执行结果:
Queue is empty: TRUE
Queue is full: FALSE
Element number in Queue: 0
We are going to add 5 elements into queue:
enqueue ok: q->data[0]=The first element
enqueue ok: q->data[1]=2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
enqueue ok: q->data[2]=3:The third element
enqueue ok: q->data[3]=4:Bejing Beijing
enqueue ok: q->data[4]=5:The fivth element
Queue is empty: FALSE
Queue is full: FALSE
Element number in Queue: 5
We are going to remove 2 elements from queue:
dequeue ok: q->data[0]=The first element
We got:The first element
dequeue ok: q->data[1]=2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
We got:2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Queue is empty: FALSE
Queue is full: FALSE
Element number in Queue: 3
We are going to add 9 elements, but only 7 will be added successfully
enqueue ok: q->data[5]=6:66666666
enqueue ok: q->data[6]=7:7777777777777777
enqueue ok: q->data[7]=8:88888888888888888888
enqueue ok: q->data[8]=9:99
enqueue ok: q->data[9]=10:10101010110
enqueue ok: q->data[0]=11:111111111
enqueue ok: q->data[1]=12:121212121212121212
Queue is empty: FALSE
Queue is full: TRUE
Element number in Queue: 10
We are going to remove all elements
dequeue ok: q->data[2]=3:The third element
We got:3:The third element
dequeue ok: q->data[3]=4:Bejing Beijing
We got:4:Bejing Beijing
dequeue ok: q->data[4]=5:The fivth element
We got:5:The fivth element
dequeue ok: q->data[5]=6:66666666
We got:6:66666666
dequeue ok: q->data[6]=7:7777777777777777
We got:7:7777777777777777
dequeue ok: q->data[7]=8:88888888888888888888
We got:8:88888888888888888888
dequeue ok: q->data[8]=9:99
We got:9:99
dequeue ok: q->data[9]=10:10101010110
We got:10:10101010110
dequeue ok: q->data[0]=11:111111111
We got:11:111111111
dequeue ok: q->data[1]=12:121212121212121212
We got:12:121212121212121212
Queue is empty: TRUE
Queue is full: FALSE
Element number in Queue: 0