zoukankan      html  css  js  c++  java
  • 动态队列实现C语言

    /*****************************************************
    Author:Simon_Kly    Version:0.1    Date: 20170520
    Description: 动态栈
    Mail: degaullekong@gmail.com
    Funcion List: 
    *****************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    
    enum ret_result {EMPTY_OK = 100, EMPTY_NO, ENTER_OK, ENTER_NO, OUT_OK, OUT_NO};
    
    typedef struct node//链结构
    {
        int data;
        struct node *next;
    }Node, *Link;
    
    typedef struct que//队列结构
    {
        Link front;//出队口
    }Queue;
    
    /*判断malloc是否正确执行*/
    void is_malloc_ok(void *queue)
    {
        if (queue == NULL)
        {
            printf("malloc error!\n");
            exit(-1);
        }
    }
    
    /*创建队列*/
    void create_queue(Queue ** queue)
    {
        *queue = (Queue *)malloc(sizeof(Queue));
        is_malloc_ok(*queue);
        
        (*queue)->front = (Link)malloc(sizeof(Node));//为头结点分配空间
        is_malloc_ok((*queue)->front);
    
    }
    
    /*初始化队列*/
    void init_queue(Queue *queue)
    {
        queue->front->next = NULL;//头结点
    }
    
    /*创建入队元素*/
    void create_node(Link * new_node)
    {
        *new_node = (Link)malloc(sizeof(Node));
        is_malloc_ok(*new_node);
        (*new_node)->next = NULL;
    }
    
    /*入队*/
    void enter_queue(Queue *queue, Link new_node)
    {
        Link p = NULL;
        
        p = queue->front;
    
        while (p->next != NULL)
        {
            p = p->next;
        }
        new_node->next = NULL;
        p->next = new_node;
    }
    
    /*判断队空*/
    int is_queue_empty(Queue *queue)
    {
        if (queue->front->next == NULL)
        {
            return EMPTY_OK;
        }
        return EMPTY_NO;
    }
    /*出队*/
    int out_queue(Queue *queue)
    {
        Link p = NULL;
        int data;
    
        if (queue == NULL)
        {
            printf("queue is not exist!\n");
            return OUT_NO;
        }
    
        if (EMPTY_OK == is_queue_empty(queue))
        {
            return OUT_NO;
        }
        
        p = queue->front->next;
        queue->front->next = p->next;
        data = p->data;
    
        free(p);
    
        return data;
    }
    
    /*销毁队列*/
    void release_queue(Queue ** queue)
    {
        Link p = NULL;
        
        if (*queue == NULL)//如队列不存在
        {
            printf("queue is not exist!\n");
            return ;
        }
    
        p = (*queue)->front->next;
    
        while ((*queue)->front->next != NULL)
        {
            (*queue)->front->next = p->next;
            free(p);
            p = (*queue)->front->next;
        }
        free((*queue)->front);
        free((*queue));
        *queue = NULL;
    }
    
    int main()
    {
        int i = 0;
        int ret;
        Queue *queue = NULL;
        Link new_node = NULL;
    
        create_queue(&queue);
        
        init_queue(queue);
    
        for (i = 0; i < 10; i++)
        {
            create_node(&new_node);
            new_node->data = i + 1;
            enter_queue(queue, new_node);//相当于链表中尾插
        }
        printf("第一次入队完成\n");
    
        for (i = 0; i < 5; i++)
        {
            ret = out_queue(queue);
    
            if (ret == EMPTY_OK)
            {
                break;
            }
            printf("%d\n", ret);
        }
        printf("第一次出队完成,共5个元素\n");
    
        for (i = 0; i < 10; i++)
        {
            create_node(&new_node);
            new_node->data = i + 20;
            enter_queue(queue, new_node);
        }
        printf("第二次入队完成,共10个元素\n");
    
        for (i = 0; i < 8; i++)
        {
            ret = out_queue(queue);
    
            if (ret == EMPTY_OK)
            {
                break;
            }
            printf("%d\n", ret);
        }
        printf("第二次出队完成,共8个元素\n");
    
        release_queue(&queue);
        out_queue(queue);
    
        return 0;
    }
  • 相关阅读:
    【CF932F】Escape Through Leaf 启发式合并set维护凸包
    【CF932E】Team Work/【BZOJ5093】图的价值 数学+NTT
    【CF917D】Stranger Trees 树形DP+Prufer序列
    【CF914G】Sum the Fibonacci 快速??变换模板
    【CF772D】Varying Kibibits FWT
    【CF802C】Heidi and Library (hard) 费用流
    【CF802L】Send the Fool Further! (hard) 高斯消元
    【CF809D】Hitchhiking in the Baltic States Splay
    【CF815D】Karen and Cards 单调栈+扫描线
    【CF819D】Mister B and Astronomers EXGCD
  • 原文地址:https://www.cnblogs.com/SimonKly/p/6890531.html
Copyright © 2011-2022 走看看