/*
队列的实现方式-----------------链式存储方式-----带有头结点的 单链表实现
链表实现队列的一个特点是 不会满 可以一直入栈 但是肯能队列为空
*/
#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("队列为空
");
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("入栈完毕
出栈开始
");
for(i = 0;i<8;i++)//这里故意出现8 是为了检测栈空
printf("queue[%d] = %d
",i,Dequeue(queue));
return 0;
}