C语言实现链队列代码

首先,我们需要了解链队列的定义和基本操作。

链队列是一种基于链表结构实现的队列,与普通队列相比,其主要不同点是使用链表来存储队列元素,所以不会存在队列溢出的情况。

链队列的基本操作包括:

  • 初始化:创建一个空队列。
  • 入队:在队列末尾插入一个元素。
  • 出队:删除队首元素,并返回其值。
  • 队列长度:返回队列中元素的个数。
  • 遍历:依次访问队列中的每个元素。

下面是C语言实现链队列的代码及注释:

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

// 定义链队列结构体
typedef struct Node {
    int data;           // 数据域
    struct Node *next;  // 指针域
} Node, *QueuePtr;

typedef struct {
    QueuePtr front;     // 队首指针
    QueuePtr rear;      // 队尾指针
} LinkQueue;

// 初始化链队列
void initQueue(LinkQueue *Q) {
    Q->front = Q->rear = (QueuePtr)malloc(sizeof(Node));
    Q->front->next = NULL;
}

// 入队操作
void enQueue(LinkQueue *Q, int data) {
    QueuePtr p = (QueuePtr)malloc(sizeof(Node));
    p->data = data;
    p->next = NULL;
    Q->rear->next = p;
    Q->rear = p;
}

// 出队操作
int deQueue(LinkQueue *Q) {
    if(Q->front == Q->rear) {
        printf("Queue is empty.\n");
        exit(0);        // 直接退出程序
    }
    QueuePtr p = Q->front->next;
    int data = p->data;
    Q->front->next = p->next;
    if(Q->rear == p) Q->rear = Q->front;  // 如果出队的是队尾元素,则需要更新rear指针
    free(p);
    return data;
}

// 输出链队列
void printQueue(LinkQueue *Q) {
    QueuePtr p = Q->front->next;
    while(p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

// 测试样例
int main() {
    LinkQueue Q;
    initQueue(&Q);          // 初始化队列,注意一定要传地址
    enQueue(&Q, 1);         // 入队
    enQueue(&Q, 2);
    enQueue(&Q, 3);
    printQueue(&Q);         // 输出队列元素
    printf("Dequeue: %d\n", deQueue(&Q));  // 出队
    printf("Dequeue: %d\n", deQueue(&Q));
    printQueue(&Q);
    return 0;
}

以上代码实现了链队列的初始化、入队、出队和遍历操作。我们可以通过调用main函数中的initQueueenQueuedeQueueprintQueue方法来测试链队列的基本操作。

下面给出两个示例说明:

示例1:在上述代码的基础上,在main函数中添加以下代码,可以输出链队列中元素的个数:

printf("Queue length: %d\n", Q.rear - Q.front);

示例2:修改上述代码中的enQueue方法,让其在添加元素时,插入到队首而不是队尾:

void enQueue(LinkQueue *Q, int data) {
    QueuePtr p = (QueuePtr)malloc(sizeof(Node));
    p->data = data;
    p->next = NULL;
    Q->front->next = p;
    Q->front = p;
}

这样修改后,在调用enQueue方法添加元素时,每次添加的元素都会插入到队首,而不是队尾。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现链队列代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 使用JSONObject生成和解析json的方法

    使用JSONObject生成和解析json的方法,是在Java开发中经常需要用到的一种技术。下面是一份关于该技术的攻略: 生成Json 在Java开发中,我们可以通过使用JSONObject类来生成JSON对象。 首先需要导入以下依赖: <dependency> <groupId>org.json</groupId> &l…

    C 2023年5月23日
    00
  • C#统计C、C++及C#程序代码行数的方法

    C#统计C、C++及C#程序代码行数的方法 概述 本文将介绍如何使用C#编写程序来统计C、C++以及C#程序的代码行数,具体步骤如下: 选择要统计代码行数的目录 遍历目录下所有的源代码文件 逐行读取文件内容,并统计代码行数 依赖项 在开始编写程序前,需要将以下依赖项添加到项目中: using System.IO; // IO操作类 using System.…

    C 2023年5月23日
    00
  • C/C++ 编译器优化介绍

    C/C++ 编译器优化介绍 C/C++ 编译器通过优化可以让代码运行更快、更高效,提升程序的性能和响应速度。本文将介绍常用的 C/C++ 编译器优化技术,以及对应的编译器选项和示例说明。 基本编译器优化 优化等级 编译器一般提供多个不同的优化等级,包括 “-O0” 到 “-O3″ 等级。其中,”-O0″ 表示不进行任何优化,而 “-O3” 表示最高级别的优化…

    C 2023年5月22日
    00
  • c语言中static修饰函数的方法及代码

    当在 C 语言中使用 static 关键字修饰函数时,这个函数被指定为“静态函数”。静态函数与普通函数有些不同。静态函数的作用域仅限于所在的源文件。这意味着它只能被同一源文件中的其他函数调用,在其他源文件中是不可见的。以下是关于如何使用 static 关键字修饰函数的方法及示例说明: 1. 静态函数的定义 静态函数只能在当前源文件中使用,它的作用域被限制在当…

    C 2023年5月24日
    00
  • C语言实例讲解四大循环语句的使用

    C语言实例讲解四大循环语句的使用攻略 在C语言中,使用循环语句可以使程序中的某段代码被重复执行多次,这在程序编写中非常常见和重要。C语言中常用的循环语句有四种,分别是while、do while、for和嵌套循环。下面对这四种循环语句进行详细讲解并给出使用实例。 while循环 while循环是最简单的一种循环语句,其语法格式如下: while (条件判断)…

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土

    一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、C语言简介 C语言是一种高级语言,运行效率仅次于汇编,支持跨平台 C语言是学习其他高级语言的基础,如C++、Java和Python 三、编程环境 1、在线编译 百度搜索C语言在线编译,会发现有很多在线编译工具 这里以菜鸟工…

    C语言 2023年4月18日
    00
  • Json数据转换list对象实现思路及代码

    “Json数据转换list对象实现思路及代码”主要是指通过将Json格式的数据转换成List对象,方便对数据进行处理,以下是详细讲解这个过程所需的步骤和代码示例: 1. 引入相关依赖 在转换JSON数据的时候我们需要使用到相关包,通常使用依赖管理工具,比如 Maven / Gradle 来引入相关包,其中常用的包包括: jackson-databind: 提…

    C 2023年5月23日
    00
  • C++设计模式之代理模式(Proxy)

    C++设计模式之代理模式(Proxy) 代理模式是一种结构型设计模式,它允许将对象的访问控制在另一个对象中,从而在访问对象时提供间接的方式。代理模式允许我们通过使用另一个对象来代表实际的对象来控制对实际对象的访问。 适用场景 在以下情况下使用代理模式: 当直接访问对象可能会危及对象的安全时。 当访问一个对象需要很长时间时,因为每次访问都需要进行复杂的计算,而…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部