队列实现

it2024-03-29  57

链表

queue.h

#ifndef QUEUE #define QUEUE #include "stack.h" /* 队列类型 * front: 队头指针 * rear: 队尾指针 * insert: 入队 * delete: 出队 * first: 访问队头 * is_empty: 验空 * */ typedef struct q{ node_t *front; node_t *rear; void (*insert)(node_type, struct q *); void (*delete)(struct q *); node_type (*first)(struct q *); int (*is_empty)(struct q *); }queue; /* 构造队列对象 * q:需要被初始化的队列对象的指针 * */ void creat_queue(queue *); #endif // !QUEUE

queue.c

#include <malloc.h> #include <assert.h> #include "queue.h" static void insert(node_type val, queue *q); static void delete (queue *q); static node_type first(queue *q); static int is_empty(queue *q); static void insert(node_type val, queue *q) { node_t *newnode = (node_t *)malloc(sizeof(node_t)); assert(NULL != newnode); newnode->value = val; newnode->next = NULL; if (NULL == q->rear) q->front = newnode; else q->rear->next = newnode; q->rear = newnode; } static void delete (queue *q) { assert(!q->is_empty(q)); node_t *node = q->front; q->front = q->front->next; free(node); if (NULL == q->front) q->rear = NULL; } static node_type first(queue *q) { assert(!q->is_empty(q)); return q->front->value; } static int is_empty(queue *q) { return NULL == q->front; } void creat_queue(queue *q) { q->insert = insert; q->delete = delete; q->first = first; q->is_empty = is_empty; q->front = NULL; q->rear = NULL; }

使用:

#include <stdio.h> #include "text.h" #include "stack.h" #include "queue.h" int main() { queue q1,q2; creat_queue(&q1); creat_queue(&q2); q1.insert(1, &q1); q1.insert(2, &q1); q1.insert(4, &q1); q2.insert(3, &q2); q2.insert(6, &q2); q2.insert(9, &q2); while (!q1.is_empty(&q1)) { dout(q1.first(&q1)); q1.delete(&q1); } printf("\r\n"); while (!q2.is_empty(&q2)) { dout(q2.first(&q2)); q2.delete(&q2); } printf("\r\n"); return 0; }

运行结果:

学习C++中this指针的思路来写队列,这样实现出来的队列,不同队列对象的储存、操作互不干扰,可在程序中使用多个队列
最新回复(0)