• 6.队列的数组实现


    fatal.h

    #include <stdio.h>
    #include <stdlib.h>
    
    #define Error(Str)        FatalError(Str)
    #define FatalError(Str)   fprintf(stderr, "%s
    ", Str), exit(1)
    

    queuear.h

    typedef int ElementType;
    
    #ifndef _Queue_h
    #define _Queue_h
    
    struct QueueRecord;
    typedef struct QueueRecord *Queue;
    
    int IsEmpty(Queue Q);
    int IsFull(Queue Q);
    Queue CreateQueue(int MaxElements);
    void DisposeQueue(Queue Q);
    void MakeEmpty(Queue Q);
    void Enqueue(ElementType X, Queue Q);
    ElementType Front(Queue Q);
    void Dequeue(Queue Q);
    ElementType FrontAndDequeue(Queue Q);
    
    #endif  
    

    queuear.c

    #include "queuear.h"
    #include "fatal.h"
    #include <stdlib.h>
    
    #define MinQueueSize ( 5 )
    
    struct QueueRecord
    {
        int Capacity;
        int Front;
        int Rear;
        int Size;
        ElementType *Array;
    };
    
    int IsEmpty(Queue Q)
    {
        return Q->Size == 0;
    }
    
    int IsFull(Queue Q)
    {
        return Q->Size == Q->Capacity;
    }
    
    Queue CreateQueue(int MaxElements)
    {
        Queue Q;
    
        if (MaxElements < MinQueueSize)
            Error("Queue size is too small");
    
        Q = malloc(sizeof(struct QueueRecord));
        if (Q == NULL)
            FatalError("Out of space!!!");
    
        Q->Array = malloc(sizeof(ElementType) * MaxElements);
        if (Q->Array == NULL)
            FatalError("Out of space!!!");
        Q->Capacity = MaxElements;
        MakeEmpty(Q);
    
        return Q;
    }
    
    void MakeEmpty(Queue Q)
    {
        Q->Size = 0;
        Q->Front = 1;
        Q->Rear = 0;
    }
    
    void DisposeQueue(Queue Q)
    {
        if (Q != NULL)
        {
            free(Q->Array);
            free(Q);
        }
    }
    
    static int Succ(int Value, Queue Q)
    {
        if (++Value == Q->Capacity)
            Value = 0;
        return Value;
    }
    
    void Enqueue(ElementType X, Queue Q)
    {
        if (IsFull(Q))
            Error("Full queue");
        else
        {
            Q->Size++;
            Q->Rear = Succ(Q->Rear, Q);
            Q->Array[Q->Rear] = X;
        }
    }
    
    ElementType Front(Queue Q)
    {
        if (!IsEmpty(Q))
            return Q->Array[Q->Front];
        Error("Empty queue");
        return 0;  /* Return value used to avoid warning */
    }
    
    void Dequeue(Queue Q)
    {
        if (IsEmpty(Q))
            Error("Empty queue");
        else
        {
            Q->Size--;
            Q->Front = Succ(Q->Front, Q);
        }
    }
    
    ElementType FrontAndDequeue(Queue Q)
    {
        ElementType X = 0;
    
        if (IsEmpty(Q))
            Error("Empty queue");
        else
        {
            Q->Size--;
            X = Q->Array[Q->Front];
            Q->Front = Succ(Q->Front, Q);
        }
        return X;
    }
    

    testqueuear.c

    #include <stdio.h>
    #include "queuear.h"
    
    int main( )
    {
        Queue Q;
        int i;
    
        Q = CreateQueue( 12 );
    
        for( i = 0; i < 10; i++ )
            Enqueue( i, Q );
    
        while( !IsEmpty( Q ) )
        {
            printf( "%d
    ", Front( Q ) );
            Dequeue( Q );
        }
        for( i = 0; i < 10; i++ )
            Enqueue( i, Q );
    
        while( !IsEmpty( Q ) )
        {
            printf( "%d
    ", Front( Q ) );
            Dequeue( Q );
        }
    
        DisposeQueue( Q );
        return 0;
    }
    
  • 相关阅读:
    单例模式
    建造者模式
    工厂模式
    八大排序算法之插入排序
    八大排序算法之基数排序
    lua 4 使用table实现其他数据结构,并介绍遍历方法
    lua 3 循环
    lua 2 变量
    lua 1 基本语法和注意事项
    template指针小测试
  • 原文地址:https://www.cnblogs.com/typewriter/p/6213461.html
Copyright © 2020-2023  润新知