队列:
只允许在一端进行插入操作,另一端进行删除操作
队列的有关操作:
Queue_Node *InitQueu(); //初始化队列
void EnQueue(Queue_Node *queue,int val); //入队操作(尾部插入)
void DeQueue(Queue_Node *queue); //出队操作 (头部删除)
boolean isEmpty(Queue_Node *queue); //判断队列是否为空
void show(Queue_Node *queue); //显示队列元素
queue.h文件(定义结构体)
#include <stdio.h>
#include <windows.h>
typedef struct Queue
{
int val; //保存数据
struct Queue *Next; //指向下一节点
}Queue_Node;
初始化队列:
Queue_Node *InitQueu()
{
Queue_Node *node = (Queue_Node *) malloc(sizeof(Queue_Node));
if(node == NULL)
{
printf("内存申请失败\n");
exit(-1);
}
node->val = 0;
node->Next = NULL;
}
入队操作:
//将新入队元素放在队尾
void EnQueue(Queue_Node *queue,int val)
{
Queue_Node *tmp = queue; //保存头结点指针
Queue_Node *node = (Queue_Node *)malloc(sizeof(Queue_Node)); //开辟空间保存数据
if(node == NULL)
return ;
//找到尾结点
while(tmp->Next != NULL)
{
tmp = tmp->Next;
}
node->val = val; //将入队数据放入新结点
node->Next = NULL; //新结点的指向为空
tmp->Next = node; //将尾结点的指针域指向新结点
}
出队操作:
//从队头出队
void DeQueue(Queue_Node *queue)
{
if(isEmpty(queue))
{
printf("队列为空,无法出队\n");
return ;
}
Queue_Node *delete = queue->Next; //用辅助结点保存首结点位置
queue->Next = delete->Next; //头结点指针域指向首结点指向的下一位置
printf("出队结点数据为:\t%d\n",delete->val); //输出出队节点数据
free(delete); //释放出队结点空间
}
判断队列是否为空:
boolean isEmpty(Queue_Node *queue)
{
if(queue->Next == NULL)
return TRUE;
return FALSE;
}
输出队列数据元素:
void show(Queue_Node *queue)
{
if(isEmpty(queue))
{
printf("队列为空,无法输出\n");
}
Queue_Node *node = queue->Next;
while(node)
{
printf("队列数据为:\t%d\n",node->val);
node = node->Next;
}
}
测试:
void main()
{
//此节点相当于头结点方便数据操作
Queue_Node *queue;
queue = InitQueu();
EnQueue(queue,2);
EnQueue(queue,3);
EnQueue(queue,4);
EnQueue(queue,5);
printf("------入队后数据元素------\n");
show(queue);
printf("-------出队数据元素-------\n");
DeQueue(queue);
DeQueue(queue);
printf("------出队后数据元素------\n");
show(queue);
system("pause");
return ;
}