【无标题】

queue的链表实现

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

#define ERROR -9999

typedef int ElementType;
//队列的大小使用int来进行保存

/*

这里我需要设计两种结点,一种是普通的链表结点,另外一种是规定了queue的结点
其实这里可以给接下来的二叉树和图带来相关的启发。
queue struct当中需要包含两种结点,
包括rear and front结点,用于保存位置。
是否还要保存尺寸
*/

typedef struct Node* PtrToNode;
struct Node{
    ElementType Data;
    PtrToNode Next;
};
typedef PtrToNode Position;

typedef struct QNode* PtrToQNode;
struct QNode{
    Position Rear,Front;
    int MaxSize;
};
typedef PtrToQNode Queue;

/*
Queue CreateQueue(int MaxSize)
bool IsFull(Queue Q);
bool AddQ(Queue Q,ElementType X);
bool IsEmpty(Queue Q);
ElementType DeleteQ(Queue Q);
解决方法有两种
第一种就是另外增加设置一个变量
第二种就是少用一个元素空间,
*/

Queue CreateQueue(int MaxSize){
    Queue Q = (Queue) malloc(sizeof(struct QNode));
    Q->MaxSize = MaxSize;
    Q->Front=Q->Rear=NULL;
    return Q;
}

bool IsEmpty(Queue Q){
    if(Q->Front ==NULL){// I think if the front node is equal with rear node 
                            //Queue is empty
        return true;
    }else{
        return false;
    }
}

bool IsFull(Queue Q){
    PtrToNode firstNode = Q->Front;
    int counts = 1; //为什么这里必须从1开始
    while(firstNode != Q->Rear){
        firstNode = firstNode->Next;
        counts++;
    }
    if(counts == Q->MaxSize){
        return true;
    }else{
        return false;
    }
}


ElementType DeleteQ(Queue Q){
    /* 
    1 judge the Q is empty
    2 
    */
   PtrToNode frontNode ;
   ElementType frontNodeData;

    if(IsEmpty(Q)){
        printf("该队列已经为空");
        return ERROR;
    }
    frontNode = Q->Front;
    if(Q->Front == Q->Rear){
        Q->Front=Q->Rear=NULL;
        
    }else{
        Q->Front = Q->Front->Next;
    }
    frontNodeData = frontNode->Data;
    free(frontNode);
    printf("%d 已经出队",frontNodeData);
    return frontNodeData;
}


bool AddQ(Queue Q,ElementType X)
{
    /*
    先判断这个queue是否已经满了
        1、满,return false;
        2、没有满, 那么加入相关的s
        3、如果queue is empty
    */
    
    PtrToNode newNode = (PtrToNode) malloc(sizeof(struct Node));
    newNode->Data = X;

    if(IsFull(Q)){
        printf("不能使用AddQ%d,因为队列已经满了\n",X);
        return false;
    } else if(IsEmpty(Q)){
        Q->Front = Q->Rear = newNode;
    }else{
        newNode->Data = X;
        newNode->Next = NULL;
        Q->Rear->Next = newNode;
        Q->Rear = newNode;
        /*
             Q->Rear = newNode; 这种写法有错误,因为newNode是个局部变量,退出局部函数必然消失
        */
    }

        printf("%d 已经进入队列\n",X);
        return true;
}



int main(){
    int numbers  = 15;
    Queue Q = CreateQueue(numbers);
    for(int i = 0; i<Q->MaxSize;i++){
        AddQ(Q,i);

    }
    int num ;
    for(int j = 0; j<Q->MaxSize;j++){
         num = DeleteQ(Q);
         if(num != ERROR){
            printf("%d\n",num);
         }
         
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值