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. JavaScript基础函数体中的唯一var模式(002)

    全局变量是不好的.所以在声名变量的时候,应该采用函数体中的唯一var模式(Single var Pattern).这个模式有不少好处: 提供了一个唯一的地方来查看函数体中声名的变量 在使用一个变量之前 ...

  2. 洛谷 P1692 【部落卫队】

    啊这道题其实暴力就行了,算是一道搜索入门题吧. 搜索变量就应该是当前到哪一位了,然后进行枚举,当前的一位加或者不加,然后知道搜完为止. 判断当前一位可不可以加的时候本来想用vector的,但是没调出来 ...

  3. 恕我直言你可能真的不会java第12篇-如何使用Stream API对Map类型元素排序

    在这篇文章中,您将学习如何使用Java对Map进行排序.前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题.所以我决定写这样一篇文章.在Java中,有 ...

  4. 使用telnet测试指定端口的连通性

    大家好,我是良许. 大家知道,telnet 是一个阉割版的 ssh ,它数据不加密,数据容易被盗窃,也容易受中间人攻击,所以默认情况下 telnet 端口是必须要被关闭的. telnet为用户提供了在 ...

  5. 自适应高度输入框(contenteditable/textarea)

      一.用div模拟textarea div模拟输入域可以根据输入内容自动伸缩,而input和textarea输入内容较多时,高度固定,内容会显示不全. 1.坑1(IOS端无法输入) 在取消全局默认样 ...

  6. JSOI2016 病毒感染(动态规划)

    题目传送门:洛谷P5774 思路来源:郭大佬(我就是凑不要脸的白嫖党 : P) 题目分析: 我们一点点来分析这道题: 起点固定为1号,所有村庄是按线性排列的,而不是图,所以我们应该用线性DP(废话 ) ...

  7. django中的懒加载机制

    懒加载在前端中的意义: 懒加载的主要目的就是作为服务器前端的优化,减少请求次数或者延迟请求数. 实现原理: 先加载一部分数据,当触发某个条件时利用异步加载剩余的数据,新得到的数据不会影响原有数据的显示 ...

  8. 浏览器访问 www.baidu.com 的过程

    浏览器访问 www.baidu.com 的过程 1 先要解析出www.baidu.com DNS域名解析为服务器 IP 2 得到 IP地址后,客户端会发起TCP请求,以及3次握手建立连接 3 建立连接 ...

  9. java动态代理基本原理及proxy源码分析一

    本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...

  10. 介绍python由来, 安装python3.8.3 及其变量的定义, 小整数池

    介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字,来自Guido所挚爱 ...