数据结构学习3(一个简单的队列实现)
数据结构学习三(一个简单的队列实现)
队列(queue)是一种先进先出(first in first out,简称FIFO )线性表。它只允许在一端插入,在一端删除元素。队列像一个单行道的路,先进去的一定先出来。
队列(queue)是一种先进先出(first in first out,简称FIFO )线性表。它只允许在一端插入,在一端删除元素。队列像一个单行道的路,先进去的一定先出来。
比如在队列中依次放入 a1,a2,a3,a4(a1 先放入) 从队列中取出元素的顺序 a4,a3,a2,a1(最先取出)
代码如下:(本代码只经过本来的简单测试,可能存在问题。请相信自己的能力,敢于质疑。欢迎提供更好的、更快、更简洁的代码或者方法和指出错误。)
#include <stdio.h> #include <stdlib.h> #define PF "%d" #define TYPE int #define OVERFLOW -1 typedef struct node{ TYPE value; struct node * next; }node; typedef struct queue{ struct node *head; struct node *tail; }queue; //初始化队列q,将队列的首尾指向空指针。 void init_que (struct queue *q){ q->head = q->tail = NULL; } //释放队列q,将所有的节点释放。而不是只改变头尾指针。 void destroy_que (struct queue *q){ struct node *p = q->head; while (q->head){ q->head = q->head->next; p = q->head; free(p); } } //向队列q中添加一个新的元素,并且值为(value),添加到队列的尾部 int en_que (struct queue *q, TYPE value){ struct node *new_node = (node*) malloc ( sizeof(struct node) ); if(!new_node){ printf("Memory allocation failure\n");exit(OVERFLOW); } new_node->value = value; new_node->next = NULL; if(!q->head){ q->tail = new_node; q->head = q->tail; } else{ q->tail->next = new_node; q->tail = new_node; } return 0; } //从队列q中头部删除一个新的元素,并且让头部指向下一个元素。 int de_que (struct queue *q, TYPE *value){ struct node *tmp_node; tmp_node = q->head; if(!tmp_node){return -1;} *value = q->head->value; q->head = q->head->next; free(tmp_node); return 0; } //输出队列中的所有的内容的。 int traverse_que (struct queue q){ struct node *tmp = q.head; while (tmp){ printf(PF" | ", tmp->value); tmp = tmp->next; } printf("\n"); return 0; }