队列的链式储存结构,以及循环队列(C语言)。

队列的链式储存结构如下:

#include<stdio.h>
#include<stdlib.h>
typedef int QElemType;
typedef int Status;
/*-----------单链队列---队列的链式储存结构-------------------------*/
typedef struct QNode {
 QElemType data;   /*数据域*/
 struct QNode *next;  /*指针域*/
}QNode,*QueuePtr;
typedef struct {
 QueuePtr front;  /*队头指针*/
 QueuePtr rear;   /*队尾指针*/
}LinkQueue;

常用算法:

Status InitQueue(LinkQueue *Q) /*构造一个空队列Q*/
{
 Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
 if(!Q->front)exit(0);  /*储存分配失败*/
 Q->front->next=NULL; /*头结点指针域指向null*/
 return 1;
}
Status EnQueue(LinkQueue *Q,QElemType e)/*插入元素e为q的队尾元素*/
{
 QueuePtr p;
 p=(QueuePtr)malloc(sizeof(QNode));
 p->data=e;
 p->next=NULL;
 Q->rear->next=p;
 Q->rear=p;
 return 1;
}
Status Dequeue(LinkQueue *Q,QElemType *e)/*若队列不为空,则删除Q的队头元素,并返回其值*/
{
 QueuePtr p;
 p=Q->front->next;
 *e=p->data;
 Q->front->next=p->next;
 if(Q->rear==p)Q->rear=Q->front;
 free(p);
 return 1;
}
Status queueEmpty(LinkQueue *Q)//若队列不为空,则返回1 
{
 QueuePtr p;
 p=Q->front->next;
 if(p->data)
 {
 	return 1;
 }
 else return 0;
 
}
Status DestroyQueue(LinkQueue *Q)/*销毁队列Q*/
{
 while(Q->front){
  Q->rear=Q->front->next;
  free(Q->front);
  Q->front=Q->rear;
 }
 return 1;
}

 测试函数:先入队0,1,2,3,4,5,6,7,8,然后岀队6个在入队0,1,2,3,4,5,6,7,8.在岀队6个。

 void main()  /*测试函数*/
{
 int i,e;
 LinkQueue Q;
 InitQueue(&Q);
 for(i=0;i<9;i++)/*入队0~8*/
 {
  EnQueue(&Q,i);
 }
 printf("入队0~8后,岀队六个元素为:");
 for(i=0;i<6;i++)/*岀队六个*/
 {
  Dequeue(&Q,&e);
  printf("%d\t",e);
 }
 printf("\n");
 for(i=0;i<9;i++)/*入队0~8*/
 {
  EnQueue(&Q,i);
 }
 printf("入队0~8后,岀队五个元素为:");
 for(i=0;i<6;i++)/*岀队六个*/
 {
  Dequeue(&Q,&e);
  printf("%d\t",e);
 }
  printf("\n");
 DestroyQueue(&Q);/*销毁队列*/
 system("pause");
}

测试结果如下:(应该是岀队六个元素)

203230_mhEj_2537692.png

循环队列:

 #include<stdlib.h>
typedef int QElemType;
typedef int Status;
/*-------------循环队列-- 队列的顺序储存结构--------------*/
#define MAXQSIZE 100  /*最大队列长度*/
typedef struct{
 QElemType *base; /*初始化动态分配的空间*/
 int front;  /*如果队列不为空,指向头指针*/
 int rear;  /*尾指针,如果队列不为空,指向下一个位置*/
}SqQueue;
Status InitQueue(SqQueue *Q)/*构造一个空队列*/
{
 Q->base=(QElemType*)malloc (MAXQSIZE*sizeof(QElemType));
 if(!Q->base)exit(0);
 Q->front=Q->rear=0;
 return 1;
}
Status EnQueue(SqQueue *Q,QElemType e)/*插入新元素*/
{
 if((Q->rear+1)%MAXQSIZE==Q->front)return 0;
 Q->base[Q->rear]=e;
 Q->rear=(Q->rear+1)%MAXQSIZE;
 return 1;
}
Status DeQueue(SqQueue *Q,QElemType *e)/*删除头元素,返回其值*/
{
 if(Q->front==Q->rear) return 0;
 *e=Q->base[Q->front];
 Q->front=(Q->front+1)%MAXQSIZE;
 return 1;
}

测试函数如上,注意去掉没有的函数。程序运行结果如上。

注意:

循环队列判断是否队满有三种方式:

  1. 加一个标志位。

  2. 空一位,判断时队尾指针加1取模。

  3. 加一个计数器。

------------------------------------------华丽分割线-----------------------------------------------------

学习数据结构记录,如有错误欢迎指正。

转载于:https://my.oschina.net/wang520/blog/653126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值