欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构---队列单链表实现

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