队列的顺序存储与链式存储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版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
随机推荐
- ASP.NET中使用Entity Framework开发增删改查的Demo(EF增删改查+母版页的使用)
这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 这里是该项目的第二部分, 第一部分 第二部分(当前部分) 大完结版本 此Demo是新建了一个音乐类型的web,然后使用母版页 ...
- Java实现 蓝桥杯VIP 算法训练 方格取数
问题描述 设有NN的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0. 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下角的B点 ...
- Java中数组二分法查找
算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...
- java实现第六届蓝桥杯密文搜索
密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...
- 关于C#委托三种调用的分享
一.同步调用 1.同步调用会按照代码顺序来执行2.同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了. 举个栗子 ...
- css背景图片加载失败,页面部分图标无法显示
1.问题表现:首屏缺失部分图标.点击按钮切换为激活状态时,部分按钮的激活态图标无法显示. 2.问题原因:网络极差,断断续续,点击时添加class:active变为激活态, active.png这张图片 ...
- KVM NAT(网络地址转换模式)
NAT(网络地址转换模式) 使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网.也就是说,使用NAT模式可以实现在虚拟系统里访问互联网.很显然,如果你只有一 ...
- Windows10 搭建 ElasticSearch 集群服务
一.前言 集群的搭建需要多台机器,之前我使用 ubuntu 16.04 搭建过 hadoop 的单机模式和分布式模式,这个今后会写,今天先写一篇使用 < Windows10 搭建 Elastic ...
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Api (3) - Stream的终端操作
Stream API Java8中有两大最为重要的改变:第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*). Stream 是 Java8 中处 ...
- Accord.NET重启4.0 开发
Accord.NET Framework是在AForge.NET基础上封装和进一步开发来的.功能也很强大,因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注 ...