C语言实现简单的--队列
1,队列实现源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>typedef struct node {int data;struct node *next;
}QNode;typedef struct qnode {int size;QNode *head;QNode *tail;
}Queue;Queue *init_queue()
{Queue *head = (Queue *)calloc(1, sizeof(Queue));if(head){head->size = 0;head->head = head->tail = NULL;return head;}return NULL;
}QNode *CreatNode(int dat)
{QNode *no = (QNode *)calloc(1, sizeof(QNode));if(no){no->data = dat;no->next = NULL;return no;}printf("%s: creat node is failed.\n", __FUNCTION__);return NULL;
}int QueEmpty(Queue *que)
{if(!que) {printf("%s: queue is NULL.\n", __FUNCTION__);return -1;}return que->size == 0;
}int QueSize(Queue *que)
{if(!que) {printf("%s: queue is NULL.\n", __FUNCTION__);return -1;}return que->size;
}int push_queue(Queue *que, QNode *element)
{if(!element || !que) {printf("%s : element/que is NULL.\n", __FUNCTION__);return -1;}if (!que->tail) {// queue is NULLque->head = que->tail = element;que->size++;} else {que->tail->next = element;que->tail = element;que->size++;}return 0;
}int pop_queue(Queue *que, int *data)
{//取出数据域if(!que) {printf("%s: queue is NULL.\n", __FUNCTION__);return -1;}if (!que->head) {printf("%s: queue->head is NULL.\n", __FUNCTION__);return -1;}else {QNode *tmp = que->head->next;*data = que->head->data;free(que->head);que->head = tmp;que->size--;if(QueEmpty(que))que->tail = NULL;}return 0;
}void QueDestroy(Queue *que)
{if (QueEmpty(que)) {return ;}QNode *tmp = que->head;QNode *tp = NULL;while(tmp){tp = tmp; tmp = tmp->next;if(tp) {free(tp);printf("1\n");}}que->size = 0;que->tail = NULL;que->head = NULL;
}int main()
{int i = 0;int data = 0;Queue *que = init_queue();QNode *no = NULL;for(i = 0; i< 5; i++){no = CreatNode(i);if(no){push_queue(que, no);}}no = NULL;i = 0;QueDestroy(que);printf("------------size: %d--------------\n", QueSize(que));while(!QueEmpty(que)){if(!pop_queue(que, &data)) {printf("index: %d, data: %d\n", i, data);}i++;}printf("------------size: %d--------------\n", QueSize(que));printf("head addr: %p\n", que->head);printf("tail addr: %p\n", que->tail);free(que);return 0;
}
2,总结
队列:
① 队列有head和tail,出队操作只能从头出,入队操作只能从tail入
② 一般的接口:
创建队列,初始化队列,创建队内节点,入队操作,出队操作,队满,队空
上面的代码并没有通过size限制队列的长度