首页 > 其他分享 >队列链表实现

队列链表实现

时间:2022-11-13 22:00:36浏览次数:42  
标签:Queue return struct 队列 链表 实现 Front Rear Size

队列没有元素是 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;
}

 

标签:Queue,return,struct,队列,链表,实现,Front,Rear,Size
From: https://www.cnblogs.com/xinrenbool/p/16887118.html

相关文章

  • vue实现上下切换自动轮播 移入移出暂停轮播
    <template><divclass="about"><divstyle="display:flex;"><divclass="left"><divclass="box1"><divclass="box2":style="{bac......
  • 单调栈/单调队列
    单调栈/单调队列典型力扣题目239:滑动窗口最大值双端队列,队列存放元素按一定规则有序//双端队列Deque:LinkedList,ArrayDeque,LinkedDeque,LinkedBlockingDequeDequ......
  • WPF多页面切换的实现方法
    摘要C/S端软件,左侧导航菜单+右侧页面切换的布局很常见。这篇文章介绍下使用ContentControl控件和TabControl控件如何实现基础的页面切换。一、使用ContentControl实现页......
  • 2022-2023-1 20201324《信息安全系统设计与实现(上)》第13章
    1网络编程简介TCP/IP协议、UDP和TCP协议、服务器-客户机计算、HTTP和Web页面、动态Web页面的PHP和CGI编程2TCP/IP协议IPv432位地址IPv6128位地址TCP/IP协议顶层......
  • .Net实现SM2解密sm-crypto
    一、Vue代码constcipherMode=0//1-C1C3C2,0-C1C2C3,默认为1constpublicKey= 'xxx'letencryptData=sm2.doEncrypt("加密内容",publicKey,cipherMode);......
  • 实现多线程的方法三
    packagedaybyday;/*好处:call()可以有返回值call()可以抛出异常,被外面的操作捕获,获取异常的数值Callable是支持泛型的*/importjava.util.concurrent......
  • 循环队列顺序表实现
    #include<stdlib.h>#include<stdio.h>#include<stdbool.h>#include<math.h>/**循环队列的顺序存储实现队列头在队列第一个元素前不指向元素队列尾是指向队......
  • #yyds干货盘点# LeetCode 腾讯精选练习 50 题:相交链表
    题目:给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据......
  • 力扣206 反转链表
    题目:给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1] 双指针法:两个指针,cur指向当前节点,用来遍历,pre......
  • 项目接口实现
    项目接口实现后台主页模块接口由原型图可分析,后台首页需要轮播图接口,推荐课程接口软件开发模式瀑布模式如:bbs项目先设计数据库,等数据库全部设计完毕后,开始写项......