队列的链式存储
目录:
队列:
只允许在一端进行插入操作,另一端进行删除操作
队列的有关操作:
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 #include 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 ;}