链式队列的实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链式队列的实现相关的知识,希望对你有一定的参考价值。

队列的定义

     只允许在队尾追加新的元素,在队首移除元素。是FIFO模型。队列的操作比链表少了许多,所以我们可以基于链表来构建一个队列。

 

队列的图示

技术分享

 

 

 

代码

 

/***********
file:LinkQueue.h
date:2016/3/28

***********/ 

#ifndef _LINKQUEUE_H_
#define _LINKQUEUE_H_
#include<stdlib.h>


typedef int DataType;    //定义存储的目标数据类型 


typedef struct node{     //定义每一个节点类型 
    DataType data;
    struct node*next;
    
}Node;



typedef struct{     //定义队列 
    Node* front;
    Node* tail;
    
}LinkQueue;


void InitQueue(LinkQueue*queue);
void EnQueue(LinkQueue* queue,DataType newData);
int DeQueue(LinkQueue* queue,DataType*de);
int QueueLength(const LinkQueue* queue);
int QueueIsEmpty(const LinkQueue*queue);



#endif

 

/************
file:LinkQueue.cpp
date:2016/3/28

*************/


#include"LinkQueue.h"


//初始化队列,头指针和为指针都是空 
void InitQueue(LinkQueue*queue)  
{
    queue->front = NULL;
    queue->tail = NULL;
    
}

//入队,再链表尾部追加一个元素 。
//要特别注意第一个元素入队的情况 
void EnQueue(LinkQueue* queue,DataType newData)
{
    Node*p_new;
    
    
    p_new = (Node*)malloc(sizeof(Node));
    if(p_new==NULL) exit(-1);
    p_new ->data = newData;
    p_new->next = NULL;
    
    if(QueueIsEmpty(queue))  //第一个元素入队的情况 
    {
       queue->front = queue->tail = p_new;        
        
    }
    
    else{                       //第2,3,4....个元素入队情况 
        
        queue->tail->next = p_new; //链接
        queue->tail = p_new;       //重置尾节点 
    }
    
}


//出队,删除链表的第一个元素
//要特别注意最后一个元素被删除的情况 
int DeQueue(LinkQueue* queue,DataType*de)
{
    
      
    Node*t = queue->front;   //获取队头节点的地址为t 
    
    
    if(QueueIsEmpty(queue))  //队列空了,不能再出队 
      return 0;
    
    queue->front = t->next;  //队列的头节点地址后移 
    if(queue->front==NULL)  
        queue->tail = NULL;  //如果队头指针为空,说明此时队空了。 
    
    if(de!=NULL)      //存回被删除的元素 
       *de = t->data; 
    
    free(t);
    return 1;
    
}


//队列的长度 
int QueueLength(const LinkQueue* queue)
{
    int count=0;
    Node*p = queue->front;
    
    while(p!=NULL)
    {
        p  = p->next;
        count++;
        
    }
    return count;
}


//队列是否为空 
int QueueIsEmpty(const LinkQueue*queue)
{
    if(queue->front == NULL && queue->tail == NULL)
       return 1;
    return 0;   
    
}

 

以上是关于链式队列的实现的主要内容,如果未能解决你的问题,请参考以下文章

链式队列基本操作的实现问题

数据结构之链式队列(C实现)

30-链式队列的基本操作

数据结构3. 栈和队列

队列(FIFO)—循环队列队列的链式存储

数据结构-队列-顺序链式存储