码迷,mamicode.com
首页 > 其他好文 > 详细

链式队列的实现

时间:2016-03-28 13:41:28      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

队列的定义

     只允许在队尾追加新的元素,在队首移除元素。是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;   
    
}

 

链式队列的实现

标签:

原文地址:http://www.cnblogs.com/lulipro/p/5328560.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!