数据结构:链式队列

       队列是限制在两端操作进行插入操作与删除操作的线性表,允许进行插入操作的一端称为"队尾",允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。队列的特点是先进先出。

队列两种规定:

1、front指向队头元素的前一个位置,rear指向队尾元素所在位置;以下代码采用第一种规定。

2、front指向队头元素所在位置,rear指向队尾元素的下一个位置;           

 queue.h

/*===============================================
*   文件名称:queue.h
*   创 建 者:cxy     
*   创建日期:2024年01月20日
*   描    述:
================================================*/
#ifndef _QUEUE_H
#define _QUEUE_H

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

typedef struct node{    //节点
    int data;
    struct node *next;
}Node,*Pnode;

//规定1
typedef struct queue{    //队列指针
    Pnode front;  //头节点指针,指向队头元素的前一个位置
    Pnode rear;   //队尾指针,指向队尾元素所在位置
}Queue,*Pqueue;

int init(Pqueue *P);
int empty(Pqueue p);
int insert_queue(Pqueue p,int data);
int delete_queue(Pqueue p,int *data);
int sum(Pqueue p);
int clear_queue(Pqueue p);

#endif

queue.c

/*===============================================
*   文件名称:queue.c
*   创 建 者:cxy     
*   创建日期:2024年01月20日
*   描    述:
================================================*/
#include "queue.h"

int init(Pqueue *P)
{
    *P = malloc(sizeof(Queue));  //队列指针
    if(NULL == *P)
    {
        perror("init err:*P");
        return -1;
    }
    (*P)->front = malloc(sizeof(Node));  //头节点
    if(NULL == (*P)->front)
    {
        perror("init err:(*P)->front");
        return -1;
    }
    (*P)->rear = (*P)->front;   //空队
    (*P)->front->next = NULL;

    return 0;
}

int empty(Pqueue p)
{
    if(NULL == p)
    {
        perror("empty err:p");
        return -1;
    }
    if(p->front->next == NULL)
        return 1;
    else 
        return 0;
}

int insert_queue(Pqueue p,int data)
{
    if(NULL == p)
    {
        perror("insert err:p");
        return -1;
    }
    Pnode new = malloc(sizeof(new));
    if(NULL == new)
    {
        perror("insert err:new");
        return -1;
    }
    new->data = data;
    new->next = NULL;   //入队:队尾
    p->rear->next = new;
    p->rear = new;      //更新队尾
   
    return 0;
}

int delete_queue(Pqueue p,int *data)
{
    if(NULL == p)
    {
        perror("delete err:p");
        return -1;
    }
    if(empty(p))
    {
        perror("delete err:empty");
        return -1;
    }

    Pnode q = p->front->next;
    *data = q->data;
    p->front->next = q->next;   //更新队头元素为q->next
    free(q);

    if(p->front->next == NULL)  //空队
        p->rear = p->front;
    
    return 0;
}

int sum(Pqueue p)
{
    if(NULL == p)
    {
        perror("sum err:p");
        return -1;
    }
    Pnode q = p->front->next;
    int sum = 1;
    while(q->next)
    {
        q = q->next;
        sum++;
    }

    return sum;
}

int clear_queue(Pqueue p)
{
    if(NULL == p)
    {
        perror("clear err:p");
        return -1;
    }
    Pnode q = NULL;
    while(p->front->next)
    {
        q = p->front->next;
        p->front->next = q->next;
        free(q);
    }

    return 0;
}

main.c

/*===============================================
*   文件名称:main.c
*   创 建 者:cxy     
*   创建日期:2024年01月20日
*   描    述:
================================================*/
#include "queue.h"

int main(int argc, char *argv[])
{ 
    Pqueue p;
    init(&p);

    int data;
    printf("----------empty,1为空----------\n");
    data = empty(p);
    printf("%d\n",data);

    printf("----------insert_queue----------\n");
    for(int i = 0;i < 5;i++)
    {
        printf("请输入入队数据:");
        scanf("%d",&data);
        insert_queue(p,data);
    }

    printf("----------empty,1为空----------\n");
    data = empty(p);
    printf("%d\n",data);
    
    printf("----------sum----------\n");
    data = sum(p);
    printf("队列中共有:%d个数据\n",data);
    
    printf("----------delete_queue----------\n");
    for(int i = 0;i < 3;i++)
    {
        printf("出队数据为:");
        delete_queue(p,&data);
        printf("%d\n",data);
    }
    printf("----------empty,1为空----------\n");
    data = empty(p);
    printf("%d\n",data);

    
    printf("----------clear_queue----------\n");
    clear_queue(p);
    printf("----------empty,1为空----------\n");
    data = empty(p);
    printf("%d\n",data);

    return 0;
} 

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/338199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年网络安全比赛--内存取证(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.从内存文件中找到异常程序的进程,将进程的名称作为Flag值提交; 2.从内存文件中找到黑客将异常程序迁移后的进程编号,将迁移后的进程编号作为Flag值提交; 3.从内存文件中找到受害者…

计算机体系结构——多处理机系统

一、概述 重要概念 评估指标 通信延迟 通信延迟&#xff1d;发送开销&#xff0b;跨越时间&#xff0b;传输延迟&#xff0b;接收开销 跨越时间 数字信号从发送方的线路端传送到接收方的线路端所经过的时间。 传输时间 全部的消息量除以线路带宽。 多处理机的架构 根…

考研数学:幂函数凑微分的三道典型例题

题目 01 题目 02 题目 03 详细内容和更多题目解析在&#xff1a;荒原之梦考研数学

Python Timer定时器:控制函数在特定时间执行

Thread类有一个Timer子类&#xff0c;该子类可用于控制指定函数在特定时间内执行一次。例如如下程序&#xff1a; from threading import Timerdef hello():print("hello, world") # 指定10秒后执行hello函数 t Timer(10.0, hello) t.start() 上面程序使用 Timer …

Pandas.DataFrame.mean() 平均值 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.1.2 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 Pandas稳定版更新及变动内容整合专题&#xff1a; Pandas稳定版更新及变动迭持续更新。 Pandas API参…

初始RabbitMQ(入门篇)

消息队列(MQ) 本质上就是一个队列,一个先进先出的队列,队列中存放的内容是message(消息),是一种跨进程的通信机制,用于上下游传递消息, 为什么使用MQ: 削峰填谷: MQ可以很好的做一个缓冲机制,例如在一个系统中有A和B两个应用,A是接收用户的请求的,然后A调用B进行处理. 这时…

C++ STL之string的使用及模拟实现

文章目录 1. 前言2. 介绍3. string类的使用3.1 string类的构造函数3.2 string类对象的容量操作3.3 string类对象的访问及遍历操作3.4 string类对象的修改操作3.5 string类对象的字符串操作3.6 string类的非成员函数 4. string类的模拟实现 1. 前言 C语言中&#xff0c;字符串是…

如何在 Ubuntu / Raspbian 上安装 MariaDB

Raspberry Pi OS&#xff08;原为Raspbian&#xff09;是为树莓派基于Debian开发的操作系统。 从2015年起&#xff0c;树莓派基金会正式将其作为树莓派的官方操作系统。 Raspbian是由Mike Thompson和Peter Green创建的一个独立项目。第一个版本于2012年6月发布&#xff0c;至…

php基础学习之变量

php使用变量的必要性 PHP 是一种动态网站开发的脚本语言&#xff0c;动态语言特点是交互性&#xff0c;会有数据的传递&#xff0c;而 PHP作为“中间人”&#xff0c;需要进行数据的传递&#xff0c;传递的前提就是 PHP 能自己存储数据(临时存储) php变量的命名规则 必须以do…

Android Studio 之 菜单 Menu

选项菜单 OptionsMenu 用xml添加&#xff08;更建议使用&#xff09; 创建一个菜单布局 : 在 res文件下新建一个menu 目录&#xff0c;此时的菜单id为&#xff1a;R.menu.option <?xml version"1.0" encoding"utf-8"?> <menu xmlns:android&…

从一到无穷大 #21 从基于多数据模型分析负载的Benchmark讨论多模数据库的发展方向

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言M2Bench测试结果从Lindorm看待多模的发展方向总结 引言 《M2Bench: A Database …

Java 面向对象 03 就近原则和this关键字

对于起名字需要见名知意&#xff0c;所以这个String n 不太合适&#xff1a; 但是如果将n改为name&#xff0c;会与第五行代码的name重复&#xff1a; 运行代码发现&#xff0c;获取后的姓名为默认值&#xff0c;是null 引入就近原则&#xff1a; 此处打印的是age10&#xff0c…

CPU相关专业名词介绍

CPU相关专业名词 1、CPU 中央处理器CPU&#xff08;Central Processing Unit&#xff09;是计算机的运算和控制核心&#xff0c;可以理解为PC及服务器的大脑CPU与内部存储器和输入/输出设备合称为电子计算机三大核心部件CPU的本质是一块超大规模的集成电路&#xff0c;主要功…

2024.1.21周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、Introduction 四、模型 一、连续时间模型 二、离散时间模型 五、结论 二、实验代码 Navier–Stokes equation 总结 摘要 本周我阅读了一篇题目为Physics-informed neural networks: A deep learning fra…

IDEA2023.2 将普通项目转Maven项目

1、选中一个普通工程&#xff1a; 2、快捷键&#xff1a;ctrlshift a&#xff0c;搜索&#xff1a;Add Framework Support… 3、勾选maven&#xff0c;点击ok。

信息安全概述

信息安全&#xff1a;防止任何对数据进行未授权访问的措施&#xff0c;或者防止造成信息有意无意泄漏、破坏、丢失等问题的发生&#xff0c;让数据处于远离危险、免于威胁的状态或特性。 网络安全&#xff1a;计算机网络环境下的信息安全。 信息安全现状及挑战 数字化时代威…

分布式 session

分布式 session 种 session 的时候需要注意范围&#xff0c;也就是 cookie.domain。 比如两个域名&#xff1a;a.heo.com&#xff0c;b.heo.com。如果要共享 cookie&#xff0c;可以种一个更高层的公共域名&#xff0c;比如 heo.com。 当服务器 A &#xff08;localhost:808…

构建高可用消息队列系统 01

构建高可用消息队列系统 01 引言1. RabbitMQ简介介绍1.1 什么是RabbitMQ1.2 RabbitMQ的核心特性1.3 RabbitMQ与AMQP 2.安装RabbitMQ3.消息队列实践总结 引言 在当今互联网时代&#xff0c;消息队列系统扮演着至关重要的角色&#xff0c;它们被广泛应用于分布式系统、微服务架构…

黑马Java——ArrayList集合

目录 1.ArrayList 集合和数组的优势对比&#xff1a; 1.1 ArrayList类概述 1.2 ArrayList类常用方法 1.2.1 构造方法 1.2.2 成员方法 2.练习 2.1添加字符串和数组并遍历 2.1.1添加字符串 2.1.2添加数字 2.2添加学生对象并遍历 2.2.1直接给字符串赋值 2.2.2对象的数…

【Unity学习笔记】Unity TestRunner使用

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/135733479 作者&#xff1a;CSDN|Ringleader| 参考&#xff1a; Input testingGetting started with Unity Test FrameworkHowToRunUnityUnitTest如果对Unity的newInputSystem感…