数据结构学习3(一个简单的队列实现)

数据结构学习三(一个简单的队列实现)

  队列(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;
}