数据结构---队列单链表实现

/*
	队列的实现方式-----------------链式存储方式-----带有头结点的 单链表实现 
	链表实现队列的一个特点是 不会满 可以一直入栈  但是肯能队列为空 
*/
#include "stdio.h"
#include "stdlib.h"

#define ERROR  (1 << 16)  //错误码  有可能跟数据会有冲突 

typedef enum{false,true}bool;
typedef int ElementType;
typedef struct _Node{
	ElementType Data;	  //存储数据 
	struct _Node * nextNode;//指向下一个结点 
}Node;
typedef struct _Queue{
	struct _Node * nextNode;//指向下一个结点 
	struct _Node * lastNode;//指向尾部结点 
}Queue;//在队列的头部删除 尾部插入 

//创建链表只是一个头结点 
Queue * CreateQueue()
{
	Queue * queue = (Queue *)malloc(sizeof(struct _Queue));
	queue->nextNode = NULL;
	queue->lastNode = NULL;
	
	return queue;
}

//入队列
void Enqueue(Queue *queue,ElementType item)
{
	Node *node = (Node *)malloc(sizeof(Node));//创建一个结点
	node->Data = item;
	node->nextNode = NULL;
	
	if(queue->nextNode == NULL)//说明队列为空
	{
		queue->nextNode = node;
		queue->lastNode = node;
	} 
	//队列不为空的话 直接将结点插入到链表的后面 
	queue->lastNode->nextNode = node; 
	queue->lastNode  = node;
} 
//判断队列是不是为空
bool IsEmpty(Queue *queue)
{
	if(queue->nextNode == NULL)//为空 
		return true;
	return false;	
} 
//出队列  从链表的头部出 
ElementType Dequeue(Queue *queue)
{
	ElementType data;
	Node * tempNode;
	if( IsEmpty(queue) )
	{
		printf("队列为空\n");
		return ERROR;	
	}
	else
	{
		tempNode = queue->nextNode;
		data = tempNode->Data;
		queue->nextNode = tempNode->nextNode; 
		free(tempNode);//释放资源 
		return data; 
	}	
} 

int main(int argc,const char *argv[])
{
	Queue * queue = CreateQueue();
	int i;
	for(i = 0;i<7;i++)
	{
		Enqueue(queue,i+1);
	}
	printf("入栈完毕\n出栈开始\n");
	for(i = 0;i<8;i++)//这里故意出现8  是为了检测栈空 
		printf("queue[%d] = %d\n",i,Dequeue(queue));
	return 0;
}
posted @ 2017-08-05 20:05  灰色的石头  阅读(340)  评论(0编辑  收藏  举报