【数据结构】 链队列的基本操作 (C语言版)

目录

一、链队列

1、链栈的定义:

2、链栈的优缺点:

二、链队列的基本操作算法(C语言)    

1、宏定义

  2、创建结构体

3、链栈的初始化 

4、链队列的入队 

5、链队列的出队

6、取链队列的对头元素

7、链队列的销毁

8、链队列的清空

9、判断链队列是否为空

10、求队列长度

 11、遍历队列元素

三、链队列的基本操作完整代码(C语言)

  四、运行结果


一、链队列

1、链栈的定义:

链队列是一种线性数据结构,采用链表来实现队列的操作。链队列具有队头指针和队尾指针,用于指示队列元素所在的位置。链队列只允许在队尾插入元素,在队头删除元素,符合先进先出(First In First Out,FIFO)的原则。

2、链栈的优缺点:

链队列的优点:

  1. 动态分配空间:链队列使用链表实现,可动态分配和释放空间。因此,不需要预先分配大量存储空间,可以根据实际需求进行空间分配。
  2. 无需移动元素:相比普通队列,链队列在删除元素时无需移动大量元素,只需修改指针即可。这使得链队列在处理大规模数据时具有更高的效率。
  3. 适合处理用户排队等待的情况:链队列适用于处理用户排队等待的情况,例如银行排队、网络请求等。通过链队列,可以快速地插入新用户和删除已处理的用户。

链队列的缺点:

  1. 需要额外的存储空间:为了实现链表结构,链队列需要额外的存储空间来维护指针和节点。这会增加存储空间的消耗。
  2. 插入和删除操作可能引起内存分配和释放:在链队列中插入和删除元素时,可能需要动态分配和释放内存。这会增加操作的时间复杂度,并可能引起内存碎片化问题。
  3. 无法充分利用连续空间的优势:链表结构使得链队列无法像数组一样充分利用连续空间的优势,这会影响空间利用率和访问速度。

二、链队列的基本操作算法(C语言)    

1、宏定义
#define OK 1
#define ERROR 0
#define OVERFLOW -1#define MAXSIZE 100typedef int QElemtype;
typedef int Status;
  2、创建结构体
//创建结构体
typedef struct QNode {QElemtype data;struct QNode *next;
} QNode, *QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;
} LinkQueue;
3、链栈的初始化 
//链队列的初始化
Status InitQueue(LinkQueue &Q) {Q.front = Q.rear = (QueuePtr) malloc(sizeof(QNode));if (!Q.front) {exit(OVERFLOW);}Q.front->next = NULL;return OK;
}
4、链队列的入队 
//链队列的入队 
Status EnQueue(LinkQueue &Q, QElemtype e) {QueuePtr p = (QueuePtr) malloc(sizeof(QNode));if (!p) {exit(OVERFLOW);}p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;return OK;
}
5、链队列的出队
//链队列的出队
Status DeQueue(LinkQueue &Q, QElemtype &e) {if (Q.front == Q.rear) {return ERROR;}QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p) {Q.rear = Q.front;}delete p;return OK;}
6、取链队列的对头元素
//取链列的对头元素 
Status GetQueueHead(LinkQueue &Q, QElemtype &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.front->next->data;return OK;}
7、链队列的销毁
//队列的销毁
Status DestoryQueue(LinkQueue &Q) {while (Q.front) {Q.rear = Q.front->next;delete (Q.front);Q.front = Q.rear;}
//    printf("销毁成功!");return OK;
}
8、链队列的清空
//清空
Status ClearQueue(LinkQueue &Q) {Q.rear = Q.front->next;while (Q.front->next) {Q.rear = Q.rear->next;delete (Q.front->next);Q.front->next = Q.rear;}Q.rear = Q.front;
//    printf("清空成功!");return OK;
}
9、判断链队列是否为空
//判断是否为空
Status QueueEmpty(LinkQueue &Q) {if (Q.front == Q.rear) {
//        printf("队列为空!\n");return true;} else {return false;}
//    printf("该队列不为空!");
}
10、求队列长度
//求队列长度
Status QueueLength(LinkQueue Q) {int i = 0;while (Q.front != Q.rear) {i++;Q.front = Q.front->next;}
//    printf("该队列长度为:%d", i);return i;
}
 11、遍历队列元素
//遍历队列
Status QueueTraverse(LinkQueue Q) {QNode *p;if (Q.front == Q.rear) {return ERROR;}p = Q.front->next;//存储头元素printf("从队头依次读出该队列中的元素值为: ");while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");return OK;
}

三、链队列的基本操作完整代码(C语言)

#include<stdio.h>
#include<stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1#define MAXSIZE 100typedef int QElemtype;
typedef int Status;//创建结构体
typedef struct QNode {QElemtype data;struct QNode *next;
} QNode, *QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;
} LinkQueue;//链队列的初始化
Status InitQueue(LinkQueue &Q) {Q.front = Q.rear = (QueuePtr) malloc(sizeof(QNode));if (!Q.front) {exit(OVERFLOW);}Q.front->next = NULL;return OK;
}//链队列的入队 
Status EnQueue(LinkQueue &Q, QElemtype e) {QueuePtr p = (QueuePtr) malloc(sizeof(QNode));if (!p) {exit(OVERFLOW);}p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;return OK;
}//链队列的出队
Status DeQueue(LinkQueue &Q, QElemtype &e) {if (Q.front == Q.rear) {return ERROR;}QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p) {Q.rear = Q.front;}delete p;return OK;}//取链列的对头元素 
Status GetQueueHead(LinkQueue &Q, QElemtype &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.front->next->data;return OK;}//队列的销毁
Status DestoryQueue(LinkQueue &Q) {while (Q.front) {Q.rear = Q.front->next;delete (Q.front);Q.front = Q.rear;}
//    printf("销毁成功!");return OK;
}//清空
Status ClearQueue(LinkQueue &Q) {Q.rear = Q.front->next;while (Q.front->next) {Q.rear = Q.rear->next;delete (Q.front->next);Q.front->next = Q.rear;}Q.rear = Q.front;
//    printf("清空成功!");return OK;
}//判断是否为空
Status QueueEmpty(LinkQueue &Q) {if (Q.front == Q.rear) {
//        printf("队列为空!\n");return true;} else {return false;}
//    printf("该队列不为空!");
}//求队列长度
Status QueueLength(LinkQueue Q) {int i = 0;while (Q.front != Q.rear) {i++;Q.front = Q.front->next;}
//    printf("该队列长度为:%d", i);return i;
}//遍历队列
Status QueueTraverse(LinkQueue Q) {QNode *p;if (Q.front == Q.rear) {return ERROR;}p = Q.front->next;//存储头元素printf("从队头依次读出该队列中的元素值为: ");while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");return OK;
}//功能菜单列表
void show_help() {printf("******* 功能菜单列表 *******\n");printf("1----入队------------------\n");printf("2----求链队列长度----------\n");printf("3----出队------------------\n");printf("4----取队头元素-------------\n");printf("5----清空循环队列-----------\n");printf("6----销毁循环队列-----------\n");printf("7----判断循环队列是否为空-----\n");printf("8----批量插入元素------------\n");printf("9----显示队列元素------------\n");printf("10----退出------------------\n\n");
}//主函数
int main() {LinkQueue LQ;Status reIn = InitQueue(LQ);if (reIn == OK) {printf("链队列初始时成功  \n");} else {printf("链队列初始时失败 \n");}while (1) {//功能菜单列表show_help();int flag;printf("请输入所需的功能编号:\n");scanf("%d", &flag);switch (flag) {case 1: {//入队Status EnQueueindex;printf("请输入插入元素(请在英文状态下输入例如:1): \n");scanf("%d", &EnQueueindex);Status rEnQueue = EnQueue(LQ, EnQueueindex);if (rEnQueue == OK) {printf("向链队列入队%d成功!\n", EnQueueindex);} else {printf("向链队列入队失败!\n");}}break;case 2: {//求链队列的长度int length = QueueLength(LQ);printf("链队列的长度为:%d。 \n\n", length);}break;case 3: {//出队QElemtype DeElem;Status DeEn = DeQueue(LQ, DeElem);if (DeEn == OK) {printf("从链队列中出队成功,出队的元素为 %d! \n", DeElem);} else {printf("从链队列中出队失败!\n");}}break;case 4: {//求队头元素QElemtype getEl;Status reGet = GetQueueHead(LQ, getEl);if (reGet == OK) {printf("从链队列中取对头元素成功,队头元素为:%d! \n", getEl);} else {printf("从链队列中取对头元素成功 \n");}}break;case 5: { //清空Status rClearStack = ClearQueue(LQ);if (rClearStack == OK) {printf("链队列清空成功!\n");} else {printf("链队列清空失败!\n");}}break;case 6: {//销毁Status rDestroyStack = DestoryQueue(LQ);if (rDestroyStack == OK) {printf("链队列销毁成功!\n");} else {printf("链队列销毁失败!\n");}}break;case 7: {///判空Status ClearStatus = QueueEmpty(LQ);if (ClearStatus == true) {printf("链队列为空!\n\n");} else {printf("链队列不为空!\n\n");}}break;case 8: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);QElemtype array[on];for (int i = 1; i <= on; i++) {printf("向链队列第%d个位置插入元素为:", i);scanf("%d", &array[i]);}for (int i = 1; i <= on; i++) {Status InsertStatus = EnQueue(LQ, array[i]);if (InsertStatus == OK) {printf("向链队列第%d个位置插入元素%d成功!\n", i, array[i]);} else {printf("向链队列第%d个位置插入元素%d失败!\n", i, array[i]);}}}break;case 9: {//输出链表元素QueueTraverse(LQ);
//                printf("\n");}break;case 10: {//退出程序return 0;}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}return 1;
}

  四、运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扩散模型公式推导

这篇文章将尝试推导扩散模型 DDPM 中涉及公式&#xff0c;主要参考两个 B 站视频&#xff1a; 大白话AI狗中赤兔 本文所用 PPT 元素均来自 UP 主&#xff0c;狗中赤兔和大白兔AI&#xff0c;特此感谢。 在证明开始&#xff0c;我们需要先对扩散模型有一个整体的认知。扩散模型…

数据库查询练习

数据准备 #建学生信息表student create table student ( sno varchar(20) not null primary key, sname varchar(20) not null, ssex varchar(20) not null, sbirthday datetime, class varchar(20) ); #建立教师表 create table teacher ( tno varchar(20) not null primary…

解读Android进程优先级ADJ算法

本文基于原生Android 9.0源码来解读进程优先级原理,基于篇幅考虑会精炼部分代码 一、概述 1.1 进程 Android框架对进程创建与管理进行了封装,对于APP开发者只需知道Android四大组件的使用。当Activity, Service, ContentProvider, BroadcastReceiver任一组件启动时,当其所…

CSS:backdrop-filter实现毛玻璃的效果

实现效果 实现代码 /* 关键属性 */ background-color: rgba(255, 255, 255, 0.4); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);完整代码 <style>/* 遮罩层 */.mo-mask {position: fixed;top: 0;bottom: 0;left: 0;right: 0;width: 100%;height…

【数据结构】链表的分类和双向链表

本篇是基于上篇单链表所作&#xff0c;推荐与上篇配合阅读&#xff0c;效果更加 http://t.csdnimg.cn/UhXEj 1.链表的分类 链表的结构非常多样&#xff0c;以下情况组合起来就有8种&#xff08;2 x 2 x 2&#xff09;链表结构&#xff1a; 我们一般叫这个头为哨兵位 我们上回…

树,二叉树及其相关知识

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#…

Tarjan 算法(超详细!!)

推荐在 cnblogs 上阅读 Tarjan 算法 前言 说来惭愧&#xff0c;这个模板仅是绿的算法至今我才学会。 我还记得去年 CSP2023 坐大巴路上拿着书背 Tarjan 的模板。虽然那年没有考连通分量类似的题目。 现在做题遇到了 Tarjan&#xff0c;那么&#xff0c;重学&#xff0c;开…

长城资产信息技术岗24届校招面试面经

本文介绍2024届秋招中&#xff0c;中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等。 10月投递了中国长城资产管理股份有限公司的信息技术岗岗位&#xff0c;所在部门为长城新盛信托有限责任公司。目前完成了一面&#xff0c;在这里记录一下一面经…

vue中图片不显示问题 - vue中静态资源加载

文章目录 vue中图片不显示问题静态资源URL 转换规则webpack 静态资源处理 图片不显示问题问题描述解决办法1&#xff1a;使用require引入require is not defined 解决办法2&#xff1a;使用import引入解决办法3&#xff1a;将图片放进公共文件夹static或public vue中图片不显示…

数据的存储结构

1.类别 顺序存储、链式存储、散列存储、索引存储 2.顺序存储与链式存储的区别 顺序存储链式存储优点 可以实现随机存取每个元素占用最少的空间 充分利用所有存储单元&#xff0c;不会出现碎片现象。缺点 只能使用整块的存储单元&#xff0c;会产出较多的碎片。 需要额外的存…

steam搬砖项目到底能不能做?新手小白入场前必看!

相信大家对于steam平台都不陌生。它是全球最大的中心化游戏平台。许多游戏将被添加到这个平台上。玩家通过这个平台购买游戏并体验游戏。大家经常看我的文章&#xff0c;应该对steam搬砖有或多或少的了解。 steam搬砖项目其实就是通过steam购买CSGO国外服务器游戏装备、皮肤、…