队列的顺序存储与链式存储c语言实现
一. 队列
1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表。
2.循环队列:把存储队列的顺序队列在逻辑上视为一个环。

循环队列状态:
初始时:Q.front=Q.rear=0
front指针移动:Q.front=(Q.front+1)%MaxSize
rear指针移动:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
队空条件:Q.front=Q.rear
队满条件:Q.front=Q.rear
3.区分队空和队满的三种处理
1)牺牲一个存储单元来区分队空和队满
队满条件:(Q.rear+1)%MaxSize=Q.front
队空条件:Q.front=Q.rear
队中元素个数:(Q.rear+MaxSize-Q.front)%MaxSize
2)类型中增设表示元素个数的数据成员
队空条件:Q.front=Q.rear && Q.size=0
队满条件:Q.front=Q.rear && Q.size=MaxSize
3)类型中增设tag数据成员,以区分队空还是队满
tag=0时,若因删除导致Q.front=Q.rear,则为队空
tag=1时,若因插入导致Q.front=Q.rear,则为队满
二. 循环队列的顺序存储操作
1.结构描述
typedef struct Queue{
ElemType data[MaxSize];
int front,rear,size;
}Queue;
2.初始化队列
Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=Q.size=;
return Q;
}
3.判断队列是否为空
int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear&&Q.size==)
return TRUE;
else
return FALSE;
}
4.判断队列是否为满
int Queue_Full(Queue Q)
{
if(Q.front==Q.rear&&Q.size==MaxSize)
return TRUE;
else
return FALSE;
}
5.入队
int InQueue(Queue *q)
{
if(Queue_Full(*q))
return FALSE;
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
q->data[q->rear]=x;
q->rear=(q->rear+)%MaxSize;
q->size++;
return TRUE;
}
6.出队
int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
return FALSE;
*x=q->data[q->front];
q->front=(q->front+)%MaxSize;
q->size--;
return TRUE;
}
7.完整代码

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MaxSize 10
typedef int ElemType;
typedef struct Queue{
ElemType data[MaxSize];
int front,rear,size;
}Queue; Queue InitQueue();//初始化队列
int Queue_Empty(Queue Q);//判断队列是否为空 ,用size来判断空还是满
int Queue_Full(Queue Q);//判断队列是否满
int InQueue(Queue *q);//入队
int OutQueue(Queue *q,ElemType *x);//出队,并记录出队元素
int main()
{
ElemType x;
Queue Q=InitQueue();
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
printf("此时队列长度:%d\n",Q.size);
return ;
} Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=Q.size=;
return Q;
} int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear&&Q.size==)
return TRUE;
else
return FALSE;
} int Queue_Full(Queue Q)
{
if(Q.front==Q.rear&&Q.size==MaxSize)
return TRUE;
else
return FALSE;
} int InQueue(Queue *q)
{
if(Queue_Full(*q))
return FALSE;
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
q->data[q->rear]=x;
q->rear=(q->rear+)%MaxSize;
q->size++;
return TRUE;
} int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
return FALSE;
*x=q->data[q->front];
q->front=(q->front+)%MaxSize;
q->size--;
return TRUE;
}
运行示例:

三. 队列的链式存储
链队列:同时带有队头指针和队尾指针的单链表。

1.结构描述
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct Queue{
struct Node *front,*rear;
}Queue;
2.链队列初始化
Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=(Node*)malloc(sizeof(Node));
Q.front->next=NULL;
return Q;
}
3.判断队列是否为空
int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}
4.入队
void InQueue(Queue *q)
{
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
Node *p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
5.出队
int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
{
return FALSE;
}
Node *p=q->front->next;
*x=p->data;
q->front->next=p->next;
if(q->rear==p)
{
q->rear=q->front;
}
free(p);
return TRUE;
}
6.完整代码

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node; typedef struct Queue{
struct Node *front,*rear;
}Queue; Queue InitQueue();//链队列初始化
int Queue_Empty(Queue Q);//判断队列是否为空
void InQueue(Queue *q);//入队
int OutQueue(Queue *q,ElemType *x);//出队 int main()
{
ElemType x;
Queue Q=InitQueue();
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
OutQueue(&Q,&x);
printf("出队元素:%d\n",x);
return ;
} Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=(Node*)malloc(sizeof(Node));
Q.front->next=NULL;
return Q;
} int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
} void InQueue(Queue *q)
{
ElemType x;
printf("输入入队元素:");
scanf("%d",&x);
Node *p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=NULL;
q->rear->next=p;
q->rear=p;
} int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
{
return FALSE;
}
Node *p=q->front->next;
*x=p->data;
q->front->next=p->next;
if(q->rear==p)
{
q->rear=q->front;
}
free(p);
return TRUE;
}
运行示例:

队列的顺序存储与链式存储c语言实现的更多相关文章
- 栈的顺序存储和链式存储c语言实现
一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...
- 线性表的顺序存储和链式存储c语言实现
一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }Lis ...
- 数据结构导论 四 线性表的顺序存储VS链式存储
前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char nam ...
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...
- 线性表的顺序存储和链式存储的实现(C)
//线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...
- C 数据结构1——线性表分析(顺序存储、链式存储)
之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
- 线性表的链式存储——C语言实现
SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...
- 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
随机推荐
- Java实现 LeetCode 729 我的日程安排表 I(二叉树)
729. 我的日程安排表 I 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安排. MyCalendar 有一个 book(int sta ...
- Java实现 蓝桥杯VIP 算法训练 一元三次方程
问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
- Java实现 LeetCode 220 存在重复元素 III(三)
220. 存在重复元素 III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最 ...
- 第二届蓝桥杯C++B组国(决)赛真题
以下代码仅供参考,解答部分来自网友,对于正确性不能保证,如有错误欢迎评论 四方定理. 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. 我们可以通过计算机验证其在有限范围的正确性 ...
- java实现第六届蓝桥杯密文搜索
密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...
- 使用Aspose.word (Java) 填充word文档数据(包含图片填充)
Aspose填充word数据 本文介绍了如何使用aspose进行word文档的生成,并提供了工具类供参考. 有问题欢迎 call 微信:905369866,小弟尽力而为..毕竟这玩意没吃透. 目录 A ...
- 下拉式菜单中的内容堆叠(ul型)
今天使用ul创建下拉式菜单,菜单中的内容堆在了一起. 这是我的html代码 <!DOCTYPE html> <html lang="en"> <hea ...
- ibatis BindingException Parameter 'status' not found. Available parameters are [arg1, arg0, param1, param2] 解决方法
最近做项目测试mapper接口时出现了下面这个异常,接口的函数参数找不到,网上搜索发现可能是@Param注解问题. 查阅Mybatis官方文档对@Param的解释如下: 在代码中加入, 异常消失 测试 ...
- 关于mysql auto-increment
创建表语句如下mysql> show create table Tautoincrement\G *************************** 1. row ************* ...
- DES/3DES/AES 三种对称加密算法实现
1. 简单介绍 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES ...