zoukankan      html  css  js  c++  java
  • LinkQueue(链队)

      今天学习了队列,因为前面写了好几个链表实现的数据结构基本上都懂了,然后大致了解了一下队列的特点,便决定用自己的理解来实现一个,然后实现了。

      (2018-02-14 代码更新)

      Head file:

    #ifndef __LINKQUEUE_H_
    #define __LINKQUEUE_H_
    
    #define bool int
    #define true 1
    #define false 0
    
    typedef int KeyType;
    
    typedef struct node
    {
        struct node * next;
        KeyType key;
    }Node;
    
    typedef struct queue
    {
        Node * front;
        Node * rear;
        int nums;
    }Queue;
    
    Queue * CreateLinkQueue();
    bool QueueIsEmpty();
    int QueueItemCount();
    bool QueueAdd();
    bool QueueRemove();
    Node* GetQueueFrontNode();
    Node* GetQueueRearNode();
    KeyType GetQueueFront();
    KeyType GetQueueRear();
    void TraverseQueue();
    void Clear();
    void Destroy();
    
    #endif
    

      LinkQueue.c:

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include "lqueue.h"
    
    //建立链队
    Queue * CreateLinkQueue(void)
    {
        Queue * p;
    
        p = (Queue*)malloc(sizeof(Queue));
        p->front = p->rear = NULL;
        p->nums = 0;
    
        return p;
    }
    
    //判断队列是否为空
    bool QueueIsEmpty(Queue * p)
    {
        return p->nums == 0;
    }
    
    //返回当前队列个数
    int QueueItemCount(Queue * p)
    {
        return p->nums;
    }
    
    //入队
    bool QueueAdd(Queue * p, KeyType DATA)
    {
        Node * s;
    
        s = (Node*)malloc(sizeof(Node));
        s->key = DATA;
        s->next = NULL;
        if(QueueIsEmpty(p))
            p->front = s;
        else
            p->rear->next = s;
        p->rear = s;
        p->nums++;
        return true;
    }
    
    //出队
    bool QueueRemove(Queue * p)
    {
        Node * s;
    
        if(QueueIsEmpty(p))
            return false;
        s = p->front;
        p->front = p->front->next;
        free(s);
        p->nums--;
        return true;
    }
    
    //返回队首节点
    Node* GetQueueFrontNode(Queue * p)
    {
        if(QueueIsEmpty(p))
            return false;
        return p->front;
    }
    
    //返回队尾节点
    Node* GetQueueRearNode(Queue * p)
    {
        if(QueueIsEmpty(p))
            return false;
        return p->rear;
    }
    
    //返回队首
    KeyType GetQueueFront(Queue * p)
    {
        return GetQueueFrontNode(p)->key;
    }
    
    //返回队尾
    KeyType GetQueueRear(Queue * p)
    {
        return GetQueueRearNode(p)->key;
    }
    
    //遍历队列
    void TraverseQueue(Queue * p)
    {
        Node*s = GetQueueFrontNode(p);
        while(s != NULL)
        {
            printf("%d ", s->key);
            s = s->next;
        }
        printf("
    ");
    }
    
    //清空队列
    void Clear(Queue * p)
    {
        while(!QueueIsEmpty(p))
            QueueRemove(p);
    }
    
    //销毁队列
    void Destroy(Queue * p)
    {
        if(p != NULL)
        {
            Clear(p);
            free(p);
            p = NULL;
        }
    }
    

      

  • 相关阅读:
    js上传Excel文件
    在typescript中import第三方类库clipboard报错
    webpack学习(一)安装和命令行、一次js/css的打包体验及不同版本错误
    querySelector和getElementById之间的区别
    关于js延迟加载(异步操作)的方式
    addEventListener与attachEvent
    ES6 的Object.assign(target, source_1, ..., source_n)方法与对象的扩展运算符
    JS实现生成一个周对应日期数组
    微信小程序之媒体查询@media
    微信小程序之页面引用utils中的js文件
  • 原文地址:https://www.cnblogs.com/darkchii/p/7383837.html
Copyright © 2011-2022 走看看