本文共 3572 字,大约阅读时间需要 11 分钟。
纯C封装的,来看看吧
分为queue.h queue.c main.c
分别如下:
// 定义数据域的数据结构,这里为了简单期间数据域有2个简单的属性组成。struct business_data{ char name[50]; int age;};// 定义队列的节点数据节点struct queue_node{ // 为了节约运行时期的内存,我们这里用指针来指向业务数据的节点,具体使用请根据实际情况来 struct queue_node *next; // 指向下一个节点 struct business_data *data; // 指向数据域};// 定义队列的头和尾,头尾在一起的,当队列空的时候头和尾巴都是指向头结点的啦,插入的时候在后面插入,取的时候在前面取,我们通常说的// 队列先进后出我们可能都理解成为在头部进,尾巴出了,其实尾巴进,头部出也是完全符合队列的性质的哈.struct queue{ struct queue_node *head; // 头指针 struct queue_node *tail; // 尾巴指针};// 定义一些操作,四个操作就够了,初始化、回收、插入、取..// 因为这个是纯c的代码,c里面不存在真正引用传递,所以这里会出现很多二重指针来实现引用传递的功能。/* 初始化 */int init_queue(struct queue **q);/* 回收 */int release_queue(struct queue **q);/* 插入 */int queue_put(struct queue **q, struct business_data *data);/* 取数据 */int queue_get(struct queue **q, struct business_data **data);// 再来一个辅助的打印查看数据的函数吧void queue_print(struct queue **q);
#include <stdlib.h>#include <stdio.h>#include "queue.h"int init_queue(struct queue **q){ (*q) = (struct queue *)malloc(sizeof(struct queue)); if((*q) == NULL) { // 内存申请失败,只有退出的份了. return 1; } // 这样只是申请了头和尾指针所在的内存区域而已,目前的头节点还没有申请呢,需要让头指针和尾巴指针指向头结点的 // 下面开始申请头结点,然后让头尾指针指向头结点,完成初始化 (*q) -> head = (*q) -> tail = (struct queue_node *)malloc(sizeof(struct queue_node)); (*q) -> head -> next = NULL; (*q) -> head ->data = NULL; if((*q) == NULL) { // 同样内存失败,只有退出了,记得也把上面的指针设置为空再推出,不要的指针赋空是个好习惯 return 1; } printf("[DEBUG]队列初始化成功.../n"); return 0;}int release_queue(struct queue **q){ while((*q) -> head != NULL) { (*q) -> tail = (*q) -> head -> next; free((*q) -> head); (*q) -> head = (*q) ->tail; } free(*q); printf("[DEBUG]释放完毕.../n");}void print_queue(struct queue **q){ struct queue_node *node; node = (*q) -> head; while(node -> next != NULL) { printf("[name = %s,age = %d] -> ", node -> next ->data -> name, node ->next ->data -> age); node = node -> next; } printf("/n");}int queue_put(struct queue **q, struct business_data *data){ // 先申请个队列节点来指向这个数据 struct queue_node *node; node = (struct queue_node *)malloc(sizeof(struct queue_node)); if(node == NULL) { // 同上,继续退出呗 return 1; } node -> next = NULL; node -> data = data; // 添加到队列中去,记得是添加到最后的地方,也就是尾部 (*q) -> tail -> next = node; (*q) -> tail = node; printf("[DEBUG][name = %s, age = %d]加入节点.../n", data -> name, data -> age); return 0;}int queue_get(struct queue **q, struct business_data **data){ struct queue_node *node; if((*q) -> head == (*q) -> tail) { // 这里其实是没有数据了,但是应该有时候也是允许取道空值的,所以这里返回0吧 return 0; } node = (*q) -> head -> next; // 值取走了. (*data) = node -> data; (*q) -> head -> next = node -> next; // 如果当前只有一个数据域,那么此前如果node被释放掉,则尾部指针就指向了NULL,所以这步先来操作 if((*q) -> tail == node) { (*q) -> tail = (*q) -> head; } free(node); printf("[DEBUG][name = %s, age = %d]取出节点.../n", (*data) -> name, (*data) -> age); return 0;}
#include <stdlib.h>#include <stdio.h>#include "queue.h"int main(){ struct queue *q; struct business_data *data1, *data2, *data3; struct business_data *get1, *get2, *get3; data1 = data2 = data3 = NULL; get1 = get2 = get3 = NULL; q = NULL; data1 = (struct business_data *)malloc(sizeof(struct business_data)); data1 -> age = 20; strcpy(data1 ->name, "Lily"); data2 = (struct business_data *)malloc(sizeof(struct business_data)); data2 -> age = 21; strcpy(data2 ->name, "Lucy"); data3 = (struct business_data *)malloc(sizeof(struct business_data)); data3 -> age = 22; strcpy(data3 ->name, "Hanmeimei"); init_queue(&q); queue_put(&q, data1); queue_put(&q, data2); queue_put(&q, data3); print_queue(&q); queue_get(&q, &get1); queue_get(&q, &get2); queue_get(&q, &get3); release_queue(&q); system("pause"); return 0;}
main主要是测试用的,
看一下运行的截图吧
转载地址:http://vpini.baihongyu.com/