700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 队列的顺序存储结构和链式存储结构

队列的顺序存储结构和链式存储结构

时间:2021-11-30 22:35:21

相关推荐

队列的顺序存储结构和链式存储结构

队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。

一、队列的顺序存储形式

一般队列的顺序存储结构运用的是循环队列,在编写程序之前,需要了解循环队列的相关计算。

初始时:Q.front=Q.rear=0

队空条件:Q.front==Q.rear

队满条件:(Q.rear+1)%MaxSize==Q.front

队头指针进1:Q.front=(Q.front+1)%MaxSize

队尾指针进1:Q.rear=(Q.rear+1)%MaxSize

队列长度:(Q.rear-Q.front+MaxSize)%MaxSize

基础代码如下所示:

#include<stdio.h>#include<stdlib.h>#define MaxSize 50typedef struct//队列的顺序存储结构{int data[MaxSize]; //存放队列元素int front, rear; //队头指针和队尾指针}SqQueue;void Init(SqQueue& Q) //初始化队列{Q.front = Q.rear = 0; //是0不是空}bool IsEmpty(SqQueue Q) //判队空{if (Q.front == Q.rear)return true;elsereturn false;}bool Enter(SqQueue& Q, int x) //入队{if ((Q.rear + 1) % MaxSize == Q.front) //判断队列是否为满return false;Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MaxSize;return true;}bool Out(SqQueue& Q) //出队{if (Q.front == Q.rear) //判断队列是否为空return false;int x = Q.data[Q.front];printf("%4d", x);Q.front = (Q.front + 1) % MaxSize;return true;}int main() {SqQueue Q;Init(Q);int x=0,i=0;printf("输入一串数据,以“-99999”结束:");while (x != -99999) {scanf_s("%d", &x);Enter(Q, x);i++; //i记录队列中数据元素个数}printf("\n出队:");for(int j=0;j<i-1;j++) //队列中的数据依次出队Out(Q);}

结果如下:

二、队列的链式存储结构

队列的链式存储结构的主要思想,正是带表头结点的单链表

与顺序存储不一样的是:

顺序存储中,front指向第一个值,而rear指向最后一个值的后一个位置;

链式存储中,front指向头结点,rear指向最后一个结点。

以下简单地给出队列链式存储的初始化,判队空,进出队的操作。

基础代码如下:

#include<stdio.h>#include<stdlib.h>typedef struct LinkNode //链式队列结点{ int data;struct LinkNode* next;}LinkNode;typedef struct//链式队列{LinkNode* front, * rear;}LinkQueue;void Init(LinkQueue &Q) //队列初始化{Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //创建头结点Q.front->next = NULL;}bool IsEmpty(LinkQueue Q) //判队空{if (Q.front == Q.rear)return false;elsereturn true;}void Enter(LinkQueue& Q,int x) //入队{LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));s->data = x; s->next = NULL;Q.rear->next = s;Q.rear = s;}bool Out(LinkQueue& Q) //出队{if (Q.front == Q.rear)return false;LinkNode* p = Q.front->next;int x = p->data;printf("%4d", x);Q.front->next = p->next;if (Q.rear == p)//若队列中只有一个结点,删除后变空Q.rear = Q.front;free(p);return true;}int main() {LinkQueue Q;Init(Q);int x=0,i=0;printf("输入一串数据,以“-99999”结束:");while (x != -99999) {scanf_s("%d", &x);Enter(Q, x);i++; //i记录队列中数据元素个数}printf("\n出队:");for(int j=0;j<i-1;j++) //队列中的数据依次出队Out(Q);}

结果如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。