• 队列的操作


    #include <stdio.h>
    #include <stdlib.h>
    
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    
    typedef int QElemType;
    typedef int Status;
    
    /*
     * 存储结构
     */
    typedef struct QNode
    {
        QElemType data;
        struct QNode *next;
    }QNode, *QueuePtr;
    
    typedef struct
    {
        QueuePtr front;    //队头指针
        QueuePtr rear;    //队尾指针
    }LinkQueue;
    
    /*
     * 初始化队列
     */
    Status InitQueue(LinkQueue *Q)
    {
        Q->front = Q->rear = (QueuePtr) malloc(sizeof(QNode));
        if (!Q->front)
        {
            exit(OVERFLOW);
        }
        Q->front->next = NULL;
        return OK;
    }
    
    /*
     * 销毁队列
     */
    Status DestroyQueue(LinkQueue *Q)
    {
        while (Q->front)
        {
            Q->rear = Q->front->next;
            free(Q->front);
            Q->front = Q->rear;
        }
        return OK;
    }
    
    /*
     * 清空队列
     */
    Status ClearQueue(LinkQueue *Q)
    {
        DestroyQueue(Q);
        InitQueue(Q);
        return OK;
    }
    
    /*
     * 判断队列是否为空
     */
    Status IsEmpty(LinkQueue Q)
    {
        if (Q.front->next == NULL)
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    
    /*
     * 获取队列的长度
     */
    int GetLength(LinkQueue Q)
    {
        int i = 0;
        QueuePtr p = Q.front;
        while (Q.rear != p)
        {
            i++;
            p = p->next;
        }
        return i;
    }
    
    /*
     * 获取队头元素
     */
    Status GetHead(LinkQueue Q, QElemType *e)
    {
        QueuePtr p;
        if (Q.front == Q.rear)
        {
            return ERROR;
        }
        p = Q.front->next;
        *e = p->data;
        return OK;
    }
    
    /*
     * 入队
     */
    Status EnQueue(LinkQueue *Q, QElemType e)
    {
        QueuePtr p = (QueuePtr) malloc(sizeof(QNode));
        if (!p)
        {
            exit(OVERFLOW);
        }
        p->data = e;
        p->next = NULL;
        Q->rear->next = p;
        Q->rear = p;
        return OK;
    }
    
    /*
     * 出队
     */
    Status DeQueue(LinkQueue *Q, QElemType *e)
    {
        QueuePtr p;
        if (Q->front == Q->rear)
        {
            return ERROR;
        }
        p = Q->front->next;
        *e = p->data;
        Q->front->next = p->next;
        if (Q->rear == p)
        {
            Q->rear = Q->front;
        }
        free(p);
        return OK;
    }
    
    /*
     * 访问元素
     */
    void visit(QElemType e)
    {
        printf("%d ", e);
    }
    
    /*
     * 遍历队列
     */
    Status TraverseQueue(LinkQueue Q, void (*visit)(QElemType))
    {
        QueuePtr p = Q.front->next;
        while (p)
        {
            visit(p->data);
            p = p->next;
        }
        return OK;
    }
    
    int main()
    {
        LinkQueue Q;
        if (InitQueue(&Q))
        {
            QElemType e;
            int i;
    
            printf("init_success
    ");
    
            if (IsEmpty(Q))
            {
                printf("queue is empty
    ");
            }
    
            for (i = 0; i < 10; i++)
            {
                EnQueue(&Q, i);
            }
    
            GetHead(Q, &e);
            printf("The first element is %d
    ", e);
    
            printf("length is %d
    ", GetLength(Q));
    
            DeQueue(&Q, &e);
            printf("delete element is %d
    ", e);
    
            TraverseQueue(Q, *visit);
    
            if (DestroyQueue(&Q))
            {
                printf("
    destroy_success
    ");
            }
        }
    }
  • 相关阅读:
    Linux 下Firefox无法打开在'.domain'之前带有中划线的域名
    [Shell] 简单的自动检查ssh代理是否正常的脚本
    linux日志自动分割shell
    2014年学习计划
    [genome shell]标题栏优化
    什么样才叫解决问题?
    [mysql]清除单表大量数据方法(需保留部分数据)
    用linux c求最大公约数
    解决64位debian下无法安装ia32库的问题
    postfix邮箱服务器修改附件大小限制遇到的问题与解决
  • 原文地址:https://www.cnblogs.com/kxzh/p/10919892.html
Copyright © 2020-2023  润新知