【数据结构】【王道】【栈与队列】不带头结点链式队列的实现及基本操作(可直接运行)

栈——链栈(不带头结点)的定义以及基本操作 超详细! #include<stdio.h> #include<stdlib.h> #include<stdbool.h> //结构体定义 typedef struct linknode { int data; struct linknode* next; }linknode, *linkstack; //初始化链栈 void initialize_stack(linkstack* s) { (*s) = NULL; } //进栈(增) void pu 阅读详情

总目录

1.基本实现

1.1 结构体构造

typedef struct LinkNode {   // 链式队列结点
    int data;   // 数据域
    struct LinkNode *next;  // 指针域
} LinkNode;

typedef struct {    // 链式队列
    // 如果不设置尾指针,若要插入,遍历到队尾再插入,时间复杂度O(n)
    LinkNode *front, *rear; // 队列的队头和队尾指针
} LinkQueue;

1.2 初始化

// 初始化(不带头结点)
void InitQueue(LinkQueue &Q) {
    // 由于无头结点,初始将头指针、尾指针指向NULL即可
    Q.front = NULL;
    Q.rear = NULL;
}

1.3 判空

// 判断队列是否为空
bool Empty(LinkQueue Q) {
    // 头指针为NULL即为空,尾指针为NULL不一定为空
    if(Q.front == NULL) {
        return true;
    } else {
        return false;
    }
}

1.4 入队

// 入队
bool EnQueue(LinkQueue &Q, int x) {
    // 申请分配空间
    LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
    // 内存分配失败的情况
    if(s == NULL) {
        return false;
    }
    // 将数据赋值给数据域
    s->data = x;
    // 由于队列必定在队尾插入,所以指针域要设为NULL
    s->next = NULL;
    // 由于无头结点,所以需要对空队列情况做特殊处理
    // 即相当于在空队列中插入第一个元素,需要修改队头队尾指针指向
    if(Q.front == NULL) {
        // 修改队头队尾指针的值,使其指向第一个元素
        Q.front = s;
        Q.rear = s;
    } else {
        // 若非对空队列进行处理,正常队尾插入即可
        // 入队操作
        Q.rear->next = s;
        // 修改队尾指针
        Q.rear = s;
    }
    return true;
}

1.5 出队

// 出队操作
bool DeQueue(LinkQueue &Q, int &x) {
    // 空队的情况
    if(Q.front == NULL) {
        return false;
    }
    // 由于队列出队操作一定是在队头进行,所以以一临时指针指向队头结点(非头结点,是队列第一个结点)
    LinkNode *p = Q.front;
    // 将队头元素赋值给x
    x = p->data;
    // 令队头指针指向队头元素下一个元素
    Q.front = p->next;
    // 出队为最后一个结点的情况
    if(Q.rear == p) {
        // 修改尾指针、头指针,使其指向NULL
        // 同时,也表示此队列已是空队列
        Q.front = NULL;
        Q.rear = NULL;
    }
    // 释放空间
    free(p);
    return true;
}

1.6 获取队头元素的值

// 获取队头元素的值
bool GetHead(LinkQueue Q, int &x) {
    // 空队的情况
    if(Q.front == NULL) {
        return false;
    }
    // 将队头元素赋给引用变量x
    x = Q.front->data;
    return true;
}

1.7 输出队列中所有元素

// 输出队列中所有元素
// 由于队列只能在队头出队,所以只能将所有元素出队输出
void PrintQueue(LinkQueue Q) {
    if(Empty(Q)) {
        printf("the queue is empty!\n");
    }
    while(!Empty(Q)) {
        int x;
        DeQueue(Q, x);
        printf("dequeue:%d\n", x);
    }
}

2.完整代码

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

typedef struct LinkNode {   // 链式队列结点
    int data;   // 数据域
    struct LinkNode *next;  // 指针域
} LinkNode;

typedef struct {    // 链式队列
    // 如果不设置尾指针,若要插入,遍历到队尾再插入,时间复杂度O(n)
    LinkNode *front, *rear; // 队列的队头和队尾指针
} LinkQueue;

// 初始化(不带头结点)
void InitQueue(LinkQueue &Q) {
    // 由于无头结点,初始将头指针、尾指针指向NULL即可
    Q.front = NULL;
    Q.rear = NULL;
}

// 判断队列是否为空
bool Empty(LinkQueue Q) {
    // 头指针为NULL即为空,尾指针为NULL不一定为空
    if(Q.front == NULL) {
        return true;
    } else {
        return false;
    }
}

// 入队
bool EnQueue(LinkQueue &Q, int x) {
    // 申请分配空间
    LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
    // 内存分配失败的情况
    if(s == NULL) {
        return false;
    }
    // 将数据赋值给数据域
    s->data = x;
    // 由于队列必定在队尾插入,所以指针域要设为NULL
    s->next = NULL;
    // 由于无头结点,所以需要对空队列情况做特殊处理
    // 即相当于在空队列中插入第一个元素,需要修改队头队尾指针指向
    if(Q.front == NULL) {
        // 修改队头队尾指针的值,使其指向第一个元素
        Q.front = s;
        Q.rear = s;
    } else {
        // 若非对空队列进行处理,正常队尾插入即可
        // 入队操作
        Q.rear->next = s;
        // 修改队尾指针
        Q.rear = s;
    }
    return true;
}

// 出队操作
bool DeQueue(LinkQueue &Q, int &x) {
    // 空队的情况
    if(Q.front == NULL) {
        return false;
    }
    // 由于队列出队操作一定是在队头进行,所以以一临时指针指向队头结点(非头结点,是队列第一个结点)
    LinkNode *p = Q.front;
    // 将队头元素赋值给x
    x = p->data;
    // 令队头指针指向队头元素下一个元素
    Q.front = p->next;
    // 出队为最后一个结点的情况
    if(Q.rear == p) {
        // 修改尾指针、头指针,使其指向NULL
        // 同时,也表示此队列已是空队列
        Q.front = NULL;
        Q.rear = NULL;
    }
    // 释放空间
    free(p);
    return true;
}

// 获取队头元素的值
bool GetHead(LinkQueue Q, int &x) {
    // 空队的情况
    if(Q.front == NULL) {
        return false;
    }
    // 将队头元素赋给引用变量x
    x = Q.front->data;
    return true;
}

// 输出队列中所有元素
// 由于队列只能在队头出队,所以只能将所有元素出队输出
void PrintQueue(LinkQueue Q) {
    if(Empty(Q)) {
        printf("the queue is empty!\n");
    }
    while(!Empty(Q)) {
        int x;
        DeQueue(Q, x);
        printf("dequeue:%d\n", x);
    }
}

int main() {
    LinkQueue Q;
    InitQueue(Q);
    PrintQueue(Q);
    int x;
    EnQueue(Q, 3);
    GetHead(Q, x);
    printf("enqueue:%d\n", x);
    x = 5;
    EnQueue(Q, x);
    printf("enqueue:%d\n", x);
    x = 7;
    EnQueue(Q, x);
    printf("enqueue:%d\n", x);
    PrintQueue(Q);
}

3.运行结果

在这里插入图片描述

数据结构之栈、队列、数组--王道 1.栈 栈 (stack) 是限定仅在表尾进行插入或删除操作的线性表。 因此, 对栈来说, 表尾端有其特殊含义, 称为栈顶 (top),相应地, 表头端称为栈底 (bottom)。不含元素的空表称为空栈。 栈又称为后进先出 (Last In First Out, LIFO) 的线性表. 2.队列 队列(queue)是一种先进先出(First In First Out, FIFO)的线性表。 它只允许在表 的一端进行插入,而在另一端删除元素。 在队列中,允许插入的一端称为队尾(rear), 允许删 阅读详情

相关推荐

ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps8) failed -> CUDA_ERROR_DEINITIALIZED: driver shutting down

ffplay -vcodec h264_cuvid sample_720p-2.h264 [quantum6@freeswitch freeswitch]$ ffplay -vcodec h264_cuvid sample_720p-2.h264 ffplay version 4.3.1 Copyright (c) 2003-2020 the FFmpeg developers built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44) .

柳鲲鹏 2406

数据结构:不带头结点的链式队列的实现

/*---------------------------------------------------------------- * 设立一个队首指针front ,一个队尾指针rear ,分别指向队首和队尾元素。 * ◆ 初始化:LQ-&gt;front = LQ-&gt;rear = NULL;将队列的尾指针和头指针置空, * 由于不带头结点,所有不需要为头结点开辟空间 * ◆ 判断队列是...

Keep Fighting All The Time 7450

新手必看!BUUCTF-PWN题实战:从零搭建Kali环境到成功RIP栈溢出

本文为CTF二进制安全新手提供了一份详实的BUUCTF-PWN入门指南。内容涵盖从零搭建Kali Linux环境、安装配置pwntools等核心工具,到深入浅出地讲解栈溢出原理与汇编基础,并手把手带领读者完成一道名为“rip”的经典栈溢出题目实战,成功利用漏洞获取系统权限。

t8u9v0w1x的博客 504

【数据结构与算法分析】使用C语言实现队列的两种(带头结点与不带头结点)链式存储,并且给出一种循环队列的设计思想

当我们编写程序时,经常需要处理各种数据结构。队列是一种常见的数据结构,它有着广泛的应用场景。队列的基本操作包括入队和出队,应用于模拟等待队列、消息队列、计算机缓存等场合。在实际编程中,我们可以用不同的数据结构来实现队列。本文主要介绍了三种不同的队列实现方式,包括带头结点单向队列、不带头结点单向队列和循环队列。这些队列实现方式分别使用了链表、数组等不同的数据结构,在实现细节、时间复杂度和空间利用率等方面具有不同的特点。

黑心萝卜三条杠的博客 1834

【OpenAirInterface知识-3】OAI端到端部署之5G基站部署

在上一篇文章中已经完成了5G核心网的部署,本篇文章将介绍OAI 5G基站的部署过程。

起名字难上难的博客 3422

初探Proxmox Datacenter Manager:统一管理多集群与单节点的利器

本文介绍了Proxmox Datacenter Manager (PDM) 这一统一管理工具,它能有效解决多套Proxmox VE环境(包括集群和单节点)管理碎片化的痛点。文章详细阐述了PDM的核心功能、安装部署步骤,并通过实战演示了如何添加单节点与整个集群,实现资源的集中监控与基础运维,为运维人员提供了高效的集中管理解决方案。

weixin_29217235的博客 161

栈和队列的操作二——栈的链式存储(不带头结点)

完整代码:来吧,开始还是和之前一样,先看一下链栈的图形长什么样吧。

m0_72619231的博客 772

瑞芯微RK3506开发板Ethercat主站性能优化实战:从内核配置到微秒级延迟控制

本文详细介绍了在瑞芯微RK3506开发板上实现EtherCAT主站微秒级延迟控制的实战优化方案。核心在于部署Preempt-RT实时内核,并进行深度系统调优,包括CPU隔离、中断亲和性设置、内存锁定及电源管理调整。通过绕过Linux网络栈的专用驱动加载与配置,最终实现了稳定的高性能实时控制,满足工业自动化需求。

tcp8optimizer的博客 315

【数据结构】【王道】【栈与队列】不带头结点链栈的实现及基本操作(可直接运行)

总目录 链栈实际上与单链表极为相似,区别主要在于判断条件以及链栈的操作只能在表头进行,即就是将单链表的操作固定在了表头。此处实现的是不带头结点的链栈,与带头结点的主要差别在于带头结点的链栈栈顶指针指向以及条件判断方面。实际上,相比于单链表带头结点对于不带头结点的优势,链栈由于都是在表头进行操作,所以带头结点链表的统一操作的优势便难以表现出来了。综上,带头结点的链栈实现其实与带头结点单链表相差不大,此处便不进行实现了。 2.2 初始化 2.3 判空 2.4 入栈 2.5 出栈 2.6 获取栈顶元素

treesorshining的博客 2239

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘

本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。

weixin_29246195的博客 189

[明道云] -基础教学1- 创建第一个工作表:从 0 到实用

明道云工作表相当于数据库表,是存储业务数据的核心组件。创建工作表主要有两种方式:1)从空白新建,通过添加字段(最多200个)、设置属性、配置表单样式;2)从Excel导入,需选择sheet、配置字段映射。创建后系统自动生成默认视图,支持多种视图形式(看板/日历等)。建议设置合适的标题字段和关联关系,初学者可在一小时内完成基础应用搭建。后续可扩展权限控制、工作流自动化等功能。

每日出拳老爷子的博客 556

2021 王道考研 数据结构+习题讲解

2021 王道考研 数据结构 P1【2021版】0.0 课程指南 P2【2021版】1.1.0 开篇_数据结构在学什么 P3【2021版】1.1.1 数据结构的基本概念 P4【2021版】1.2.1 算法的基本概念 P5【2021版】1.2.2 算法的时间复杂度 P6【2021版】1.2.3 算法的空间复杂度 P7【2021版】2.1_线性表的定义和基本操作 P8【2021版】2.2.1_顺序表的定义 P9【2021版】2.2.2_1_顺序表的插入删除 P10【2021版】2.2.2_2_顺序表的查找 P1

weixin_47312141的博客 4万+

精读204页华为的流程管理(文末附下载链接)

链接:https://pan.baidu.com/s/1eEwdBR5c0PIxkOrNhDZcGg?pwd=wha2 提取码:wha2 复制这段内容后打开百度网盘手机App,操作更方便哦。,以提升企业运营效率和竞争力,同时解决了诸多业务痛点,为华为的全球化发展提供了有力支撑。华为的流程管理对其发展起着关键作用,通过构建完善的流程体系,提升了企业运营效率与竞争力。华为的流程管理在企业发展中至关重要,其围绕。,并通过流程变革不断优化。在流程管理过程中,强调。构建了全面的流程体系。

cdfunlove的博客 282

《王道》数据结构代码实现与笔记

陆续更新至2022年12月底。 这篇Blog,简单的做个学王道数据结构的笔记,为了以后能快速回顾,笔记做得不好,见谅。 文章目录一、线性表1.顺序表的顺序表示1.1顺序表-静态数组1.2顺序表-动态数组2.顺序表的链式表示2.1单链表-带头结点2.2单链表-不带头结点 一、线性表 1.顺序表的顺序表示 1.1顺序表-静态数组 静态分配,大小不可改变 #include <stdio.h> #define MaxSize 10 // 定义最大长度 typedef struct { int

qq_34060370的博客 7975

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

24王道考研408数据结构代码整合(学习用)

define MaxSize 10 //定义最大长度//用静态的“数组”存放数据元素int length;//顺序表的当前长度}SeqList;//顺序表的类型定义(静态分配方式)//基本操作——初始化一个顺序表i

Ch_ensf的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记

数据结构与算法 笔记导航🚥🚥🚥 🥬 第一章 绪论 🥕 第二章 线性表 🥪 第三章 栈和队列 🍊 第四章 串-KMP(看毛片算法) 🍒 第五章 树和二叉树 🍀 第六章 图 🍚 第七章 查找(B树、散列表) 🧄 第八章 排序 (内部排序:八大排序动图演示与实现 + 外部排序) 🍔 数据结构与算法 复试精简笔记 🎨 408 全套初复试笔记汇总 传送门 🏃‍🏃‍🏃‍ 如果本篇文章对大家起到帮助的话,跪求各位帅哥美女们,求赞👍 、求收藏、求关注!

clzZ2的博客 5997

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

王道考研数据结构代码总结(前四章)

本文包含王道考研讲课中所涉及的数据结构中的所有代码,当PPT代码和书上代码有所区别时以咸鱼的PPT为主,个人认为PPT上的代码比王道书上的代码要便于理解,此外,本博客也许会补充一些额外的代码进来(不仅受限于王道考研),408中冷门考点频出,应该会囊括所有涉及到的代码,这也是我的DS的第二轮复习,希望与大家共勉之,由于博客体量的问题,原先打算此文也将收录诸如os中的吸烟者问题等的一系列伪代码,具体看到时候本文字数而定。如果一篇博客放不下的话会拆分成为两三篇文章发布。

佛系更新 5570

王道数据结构笔记03—栈与队列(C语言)

本笔记来源于b站王道考研白嫖课程,仅供个人以及大家学习使用

qq_28356977的博客 2158

【王道数据结构】第三章 栈和队列

【王道数据结构】第三章 栈和队列

weixin_48434658的博客 1420

【数据结构】【王道】【栈与队列】链式队列的实现及基本操作(带头结点)(可直接运行)

代码】【数据结构】【栈与队列】链队的实现及基本操作(带头结点)(可直接运行) #include #include typedef struct LinkNode { // 链式队列结点 int data; // 数据域 struct LinkNode *next; // 指针域 } LinkNode; typedef struct { // 链式队列 // 如果不设置尾指针,若要插入,遍历到队尾再插入,时间复杂度O(n) ............

treesorshining的博客 488

王道数据结构 | 第三章 栈、队列和数组

王道数据结构复习:第三章 栈队列数组

emmm_Yeah的博客 1044

王道数据结构第三章(栈和队列)笔记

采用顺序存储的栈成为顺序栈。

Java程序员十六的博客 1922

王道408考研数据结构-栈、队列和数组-第三章

3.1 栈3.1.1 栈的基本概念1.栈的定义栈(Stack)是只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作,如图3.1所示。栈顶(Top)。线性表允许进行插入删除的那一端。栈底(Bottom)。固定的,不允许进行插入和删除的另一端。空栈。不含任何元素的空表。3.1.2 栈的顺序存储结构栈是一种操作受限的线性表,类似于线性表,它也有对应的两种存储方式。1.顺序栈的实现。

qq_55882840的博客 1552

数据结构笔记(王道考研) 第三章:栈和队列

数据结构笔记(王道考研) 第三章:栈和队列

zimuzi2019的博客 3162

《王道》数据结构之栈和队列(三)

数据结构入门之栈和队列(三) 大纲一、栈的定义和基本操作1.1 定义1.1.1 概念1.1.2 特点1.2 基本操作1.2.1 创销、增删改查1.2.2 其他操作二、栈的存储结构和实现2.1 顺序表2.1.1 顺序表的定义及特点2.1.2 顺序表结构的实现(创销)2.1.3 顺序表基本运算的实现(增删改查)2.2 链式表2.2.1 链式表的定义及特点2.2.2 链式表结构的实现(创销)2.2.3 链式表基本运算的实现(增删改查)2.3 顺序表和链式表的比较总结 大纲 一、栈的定义和基本操作 即栈的逻辑

hzy139的博客 2946

王道数据结构:队列顺序存储和链式存储以及基本操作的实现(C语言版)

队列 队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除,操作特性为先进先出。 循环队列顺序存储的实现代码: #include<stdio.h> #include<stdlib.h> #define MaxSize 10 typedef struct { int data[MaxSize]; int front,rear; }SqQu...

知且行的博客 2605
上一篇: 【数据结构】【王道】【栈与队列】链式队列的实现及基本操作(带头结点)(可直接运行)
下一篇: 【数据结构】【栈】括号匹配算法(可直接运行)
Silver  Star
Silver Star 新星创作者: 大数据技术领域 新星创作者: 大数据技术领域
博客等级 码龄7年 1万+粉丝 72原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silver Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值