c语言 队列存储,队列的顺序存储与链式存储c语言实现

一. 队列

1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表。

2.循环队列:把存储队列的顺序队列在逻辑上视为一个环。

695600f64b1254a59a34fa1e92cab1d8.png

循环队列状态:

初始时: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.完整代码

fd36724685b340163d49ce105aed9b44.gif

0ca119a6f467aa02d59cf68be74446cd.gif

#include

#include

#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;

}

运行示例:

c82bf83ce99da9a20ce7d300dc255e7b.png

三. 队列的链式存储

链队列:同时带有队头指针和队尾指针的单链表。

750f0f82e048b80521e82e71c867fb99.png

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.完整代码

fd36724685b340163d49ce105aed9b44.gif

0ca119a6f467aa02d59cf68be74446cd.gif

#include

#include

#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;

}

运行示例:

b85f3f0fa9309ad4d2877791ac160510.png

栈的顺序存储和链式存储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 typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...

C 数据结构1——线性表分析(顺序存储、链式存储)

之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug ...

线性表的链式存储C语言版

#include #include #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版)

数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是

随机推荐

Emacs学习心得之 基础配置

作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础配置 1.前言2.基础配置 一.前言 本篇博文记录了Emacs的一 ...

【hadoop2.6.0】安装+例子运行

由于下载的是hadoop的最新版,网上各种杂七杂八的东西都不适用.好在官网上说的也够清楚了.如果有人看这篇文章的话,最大的忠告就是看官网. 官网2.6.0的安装教程:http://hadoop.apa ...

标准 DateTime 格式字符串

标准 DateTime 格式字符串 MSDN 标准 DateTime 格式字符串包含一个标准 DateTime 格式说明符字符,该字符表示自定义 DateTime 格式字符串.格式字符串最终定义由格式 ...

hdu 2821 Pusher(dfs)

Problem Description PusherBoy is an online game http://www.hacker.org/push . There is an R * C grid, ...

EmEditor编辑器正则表达式的优点

(1)^[ \t]*\n这个正则表达式代表所有的空行,指含有零个或零个以上空格或制表符.以换行符结尾.不含其它字符的行.(2)(^|(?<=中国)).*?(?=中国|$)用正则表达式匹配特定字符 ...

Dynamics 365中审核用户权限变化的一种方法

摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复268或者20180311可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...

scrapy批量下载图片

# -*- coding: utf-8 -*- import scrapy from rihan.items import RihanItem class RihanspiderSpider(scra ...

利用 ajax自定义Form表单的提交方式

需求场景:有时候单纯的form表单无法向后端传递额外的参数 比如需要action传递js异步生成的参数 ,form表单默认的action就无法满足需求,这时就需要我们自定义form表单的提交方式. h ...

SQL Server 2000使用链接服务器

执行:安装盘\SQL2KSP4\install\instcat.sql 文件下载地址:http://download.csdn.net/detail/taomanman/5680765

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值