由链表作为存储结构的队列模型:
入队:
出队:
代码实现如下:
list_queue.h
#ifndef LISTQUEUE_H_
#define LISTQUEUE_H_
typedef struct _queueNode {
int data;
struct _queueNode *next;
}queueNode_t;
typedef struct _listQueue {
int num;
queueNode_t *head;
queueNode_t *tail;
}listQueue_t;
#define listQueueIsEmpty(queue) (queue->num == 0)
listQueue_t *listQueue_create();
int listQueue_destory(listQueue_t *queue);
int listQueue_entry(listQueue_t *queue, int data);
int listQueue_pop(listQueue_t *queue, int *data);
void listQueue_dump(listQueue_t *queue);
#endif
list_queue.c
#include <stdio.h>
#include <stdlib.h>
#include "list_queue.h"
listQueue_t *listQueue_create()
{
listQueue_t *queue = (listQueue_t*)malloc(sizeof(listQueue_t));
if(queue == NULL) {
return NULL;
}
queue->num = 0;
queue->head = 0;
queue->tail = 0;
return queue;
}
int listQueue_destory(listQueue_t *queue)
{
int dat;
if(queue == NULL || listQueueIsEmpty(queue)) {
return -1;
}
while(!listQueueIsEmpty(queue)) {
listQueue_pop(queue, &dat);
}
free(queue);
return 0;
}
int listQueue_entry(listQueue_t *queue, int data)
{
if(queue == NULL) {
return -1;
}
queueNode_t *ptmp = (queueNode_t *)malloc(sizeof(queueNode_t));
if(ptmp == NULL) {
return -1;
}
ptmp->data = data;
ptmp->next = NULL;
if(queue ->head == NULL) {
queue->head = ptmp;
} else {
queue->tail->next = ptmp;
}
queue->tail = ptmp;
queue->num++;
return 0;
}
int listQueue_pop(listQueue_t *queue, int *data)
{
queueNode_t *pnode = NULL;
if(queue == NULL || listQueueIsEmpty(queue)) {
return -1;
}
*data = queue->head->data;
pnode = queue->head; // 将出列的元素赋值给临时变量
queue->head = queue->head->next;
queue ->num --;
if(queue->head == NULL) {
queue->tail = NULL;
}
free(pnode);
return 0;
}
void listQueue_dump(listQueue_t *queue)
{
if(queue == NULL || listQueueIsEmpty(queue)) {
return ;
}
int i = 0;
queueNode_t *pnode = NULL;
pnode = queue->head;
while(pnode != NULL) {
printf("queue[%d] = %d\n", i, pnode->data);
i++;
pnode = pnode->next;
}
return ;
}
int main()
{
//创建队列
listQueue_t *queue = listQueue_create();
if(queue == NULL) {
printf("queue create faild\n");
}
//push 5 num
printf("push 0 1 2 3 4 to queue:\n");
for(int i = 0; i < 5; i++) {
listQueue_entry(queue, i);
}
printf("queue dump:\n");
listQueue_dump(queue);
int dat = 0;
int ret = listQueue_pop(queue, &dat);
if(ret < 0 ) {
printf("pop faild\n");
}
printf("queue pop num : %d\n", dat);
printf("quque dump:\n");
listQueue_dump(queue);
listQueue_destory(queue);
return 0;
}