队列没有元素是 Front Rear指向NULL 

只有一个元素时 都指向那一个元素 因为既是第一个元素也是最后一个元素 即队头队尾 

Front指向第一个元素 Rear指向最后一个元素

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <math.h>

/** 循环队列的链表实现
 */
#define ERROR -1
#define ElementType int

typedef struct Node *PtrToNode;
struct Node{ // 队列中的节点
    ElementType Data;
    PtrToNode Next;
};
typedef PtrToNode Position;

struct QNode{
    Position Front, Rear;
    int Size; // 队列大小
};
typedef struct QNode *Queue;

bool IsEmpty(Queue Q){
    return (Q->Front == NULL);
}

Queue CreateQueue(void){
    Queue Q = (Queue)malloc(sizeof(struct QNode));
    Q->Front = Q->Rear = NULL;
    Q->Size = 0;
    return Q;
}

void AddQ(Queue Q,ElementType X){
    PtrToNode p = (PtrToNode)malloc(sizeof(struct Node));
    p->Data = X;
    p->Next = NULL;
    if(IsEmpty(Q)){
        Q->Front = p;
        Q->Rear = p;
    }else{
        Q->Rear->Next = p;
        Q->Rear = p;
    }
    Q->Size++;
}

ElementType DeleteQ(Queue Q){
    if(IsEmpty(Q)){
        printf("The Queue is Empty\n");
        return ERROR;
    }
    Position p = Q->Front;
    ElementType elem = p->Data;
    if(Q->Size == 1){
        Q->Rear = Q->Front = NULL;
        free(p);
        Q->Size--;
        return elem;
    }else{
        Q->Front = p->Next;
        free(p);
        Q->Size--;
        return elem;
    }
    
}
int main(){
    Queue q = CreateQueue();
    AddQ(q, 0);
    AddQ(q, 1);
    int a;
    a = DeleteQ(q);
    printf("a = %d\n",a);
    AddQ(q, 2);
    a = DeleteQ(q);
    printf("a = %d\n",a);
    a = DeleteQ(q);
    printf("a = %d\n",a);
    a = DeleteQ(q);
    printf("a = %d\n",a);
    return 0;
}

 

posted on 2022-11-13 21:54  Rabbit_XIN  阅读(14)  评论(0编辑  收藏  举报