数据结构设计
//节点数据结构
typedef struct queue_node
{
queue_node* next;
void* data;
}queue_node;
//队列数据结构
typedef struct queue
{
queue_node* head;
queue_node* tail;
int length;
}queue;
接口设计
//创建队列
queue* queue_create();
//入队
queue* queue_push(queue* queue,void *data);
//出队
void* queue_pop(queue* queue);
//释放所有节点
void queue_empty(queue* queue);
//删除队列
void queue_release(queue* queue);
接口实现
#include<stdio.h>
#include<stdlib.h>
#include"queue.h"
//创建队列
queue* queue_create()
{
queue* queue = (struct queue*)malloc(sizeof(struct queue));
queue_node* node = (struct queue_node*)malloc(sizeof(struct queue_node));
if (queue == NULL || node == NULL)
return NULL;
node->data = NULL;
node->next = NULL;
queue->head = queue->tail = node;
queue->length = 0;
return queue;
}
//入队
queue* queue_push(queue* queue, void* data)
{
queue_node* node = (struct queue_node*)malloc(sizeof(struct queue_node));
if (node == NULL)
return NULL;
node->data = data;
queue->tail->next = node;
queue->tail = node;
queue->length++;
return queue;
}
//出队
void* queue_pop(queue* queue)
{
queue_node* cur = queue->head->next;
if (cur == NULL)
return NULL;
void* data = cur->data;
queue->head->next = cur->next;
if (queue->tail == cur)
queue->tail = queue->head;
free(cur);
queue->length--;
return data;
}
//释放所有节点
void queue_empty(queue* queue)
{
queue_node* cur;
queue_node* next;
cur = queue->head->next;
while (queue->length--)
{
next = cur->next;
free(cur);
cur = next;
}
queue->head->next = NULL;
queue->head->data = NULL;
queue->tail = queue->head;
queue->length = 0;
return;
}
//删除队列
void queue_release(queue* queue)
{
queue_empty(queue);
free(queue->head);
free(queue);
return;
}
测试代码
#include<stdio.h>
#include"tmp.h"
int main()
{
char a = 'a';
char b = 'b';
char c = 'c';
queue* queue = queue_create();
printf("%p\n", queue_pop(queue));
queue_push(queue, &a);
queue_push(queue, &b);
queue_push(queue, &c);
while (queue->length)
printf("%c\n", *(char*)queue_pop(queue));
printf("--------------------\n");
queue_push(queue, &c);
queue_push(queue, &c);
queue_push(queue, &a);
while (queue->length)
printf("%c\n", *(char*)queue_pop(queue));
queue_empty(queue);
printf("%p\n", queue_pop(queue));
queue_release(queue);
return 0;
}