1.创建一个队列时,空队列中队首和队尾相同,但不是NULL,队首后面挂的元素才是NULL

2.打印队列时,对于链队列,不能把指针加一来找到下一个数据,因为链表地址不连续,需要复制一条链表,不断往后遍历来挨个打印链表的数据

3.求队伍的长度也是,不能首尾指针相减,因为地址不连续,所以同样需要复制一条链表,通过遍历来求长度

代码如下:

#include<stdlib.h>
#include<stdio.h>
/*************************************
* 出队列操作
* 队首(头指针)---元素1----元素2---元素3---.....
* 将队首指向元素2,释放掉元素1
* 注意1:队列原本为空队列,直接返回
* 注意2:释放掉第一个元素后,队列变为空队列,别忘了让队尾 = 队首
* ***************************************************************/
//typedef char ElemType;
typedef struct QNode
{
char date;
struct QNode *next;
}QNode , *QueuePtr;
typedef struct
{
QueuePtr front , rear;
}LinkQueue;
/////////////////////////////////////////////////////////////////////
//创建一个队列
void initQueue(LinkQueue *q)
{
q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
if (!q->front)
{
exit(0);
}
q->front->next = NULL;//这时头结点后面连接的是NULL,但本身不是NULL
}
/////////////////////////////////////////////////////////////////////
//入队列操作
void EnQueue(LinkQueue *q , char e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if (!q->front)
{
exit(0);
}
p->date = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}
////////////////////////////////////////////////////////////////////
//出队列操作
void DeQueue(LinkQueue *q , char *e)
{
if (q->front == q->rear)//判断是否为空队列
{
return;
}
QueuePtr p;
p = q->front->next;
*e = p->date;
q->front->next = p->next;
if (q->rear == p)
{
q->front = q->rear;
}
free(p);
}
/////////////////////////////////////////////////////////////////////
//计算队列长度
int LenLinkQueue(LinkQueue *q)
{
int len,i;
QueuePtr p = q->front->next;
for (i = 0; p!=NULL;i++)
{
p = p->next;
}
return i;
} int main()
{
LinkQueue q;
char e;
//创建队列
initQueue(&q);
printf("队列创建中,请稍后...\n队列创建成功!\n");
//入队列操作
printf("请输入要插入队列的字符:");
while ((e = getchar())!= '\n')
{
if (e!='\n')
{
EnQueue(&q , e);
}
}
//打印队列
printf("插入成功,正在打印队列字符...\n");
printf("当前队列为:");
int len = LenLinkQueue(&q);//队伍长度
QueuePtr p = q.front->next;//链表不同于顺序表,地址不连续,所以不能通过指针的增减来打印,需要复制一个链表遍历
for (size_t i = 0;i<len ; i++)
{
printf("%c" , p->date);
p = p->next;
}
putchar('\n');
//出队伍
printf("请输入需要几个元素从队首出队列:");
int n;
scanf("%d",&n);
while (n)
{
DeQueue(&q , &e);
printf("%c已从队首出队列\n" ,e);
n--;
}
//打印队伍
printf("插入成功,正在打印队列字符...\n");
printf("当前队列为:");
p = q.front->next;
for (size_t i = 0;i<len ; i++)
{
printf("%c" , p->date);
p = p->next;
}
putchar('\n');
return 0;
}

  

运行结果:

数据结构C语言实现----出队伍操作的更多相关文章

  1. 数据结构C语言实现----出栈操作

    代码如下: #include<stdio.h> #include<stdlib.h> typedef struct { char *base; char *top; int s ...

  2. 数据结构--Java语言描述

    本篇文章是为了记录自己在学习数据结构时的笔记,会对常见的数据结构做基本的介绍以及使用Java语言进行实现.包括 动态数组 栈 队列 链表 二分搜索树 优先队列和堆 线段树 Trie树 并查集 AVL树 ...

  3. 数据结构(c语言第2版)-----了解链表,栈,队列,串

    关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...

  4. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  5. 深入浅出数据结构C语言版(15)——优先队列(堆)

    在普通队列中,元素出队的顺序是由元素入队时间决定的,也就是谁先入队,谁先出队.但是有时候我们希望有这样的一个队列:谁先入队不重要,重要的是谁的"优先级高",优先级越高越先出队.这样 ...

  6. 新手学python(2):C语言调用完成数据库操作

    继续介绍本人的python学习过程.本节介绍如何利用python调用c代码.内容还是基于音乐信息提取的过程,架构如图一.Python调用c实现的功能是利用python访问c语言完成mysql数据库操作 ...

  7. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  8. 数据结构(C语言)—排序

    数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ ...

  9. C语言对文件的操作函数用法详解2

    fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const  ...

随机推荐

  1. Flask框架基础功能

    引言 本文简单汇总Flask框架几大基础功能,包括: 路由系统 模板 数据库 几种常用Flask库 一个简单的Flask事例 Flask是一个基于Python,依赖Jinja2模板和WSGI服务的框架 ...

  2. 2.WebPack初始化

    一.Package.json 在项目中输入: npm init 之后会提示你一步一步输入信息,我输入的信息如下: 生成的Package.json文件如下 我们也可以在初始时省略这些步骤,让脚本使用默认 ...

  3. AndroidStudio 编译失败;Caused by: org.gradle.api.resources.ResourceException: Could not get resource..

    错误信息: Caused by: org.gradle.api.resources.ResourceException: Could not get resource 'https://jcenter ...

  4. OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. cookie,session,jwt,token,oauth2联系和区别

    为啥有这么多的东西? 由于互联网在刚开始设计的时候是展现静态网页为主,没有现在这么多的交互和互动,所以被设计为了无状态,随用随走的简单模式.随着互联网的发展,各种具有和用户交互功能的网站出现,要求用户 ...

  6. 入门大数据---安装ClouderaManager,CDH和Impala,Hue,oozie等服务

    1.要求和支持的版本 (PS:我使用的环境,都用加粗标识了.) 1.1 支持的操作系统版本 操作系统 版本 RHEL/CentOS/OL with RHCK kernel 7.6, 7.5, 7.4, ...

  7. Egret游戏大厅制作思路

    Egret游戏大厅制作思路 Egret中,写好的代码最终都被打包到main.js里面,只有库文件会单独生成出来,按需加载. 游戏中有需求,要将一些游戏(或者模块)进行外包,然后从主游戏大厅中进入,那么 ...

  8. MongoDB快速入门教程 (1)

    1.MongoDB初识 1.1.MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于 ...

  9. 【Spring】原来SpringBoot是这样玩的

    菜瓜:我自己去调Mvc的源码差点没给Spring的逻辑秀死...难受 水稻:那今天咱们看一个简单易用的SpringBoot吧 菜瓜:可以,这个我熟悉 水稻:熟悉? 菜瓜:当我没说,请开始你的表演 水稻 ...

  10. 创建windows窗口

    from tkinter import * win=Tk()                                       #创建窗口对象 win.title("我的第一个gu ...