循环队列练习
(1)创建队列在堆区申请空间
(2)入队:只能在队尾插入
(3)出队:只能在队头
(4)遍历函数
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#define MAXSIZE 10
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;
typedef struct
{
//数据元素
datatype data[MAXSIZE];
//队头
int front;
//队尾
int rear;
}Queue;
Queue *Create();
void enQueue(Queue *q,datatype e);
void OutQueue(Queue *q);
void QueueShow(Queue *q);
#endif
test.c
#include "head.h"
Queue *Create()
{
Queue *q=(Queue *)malloc(sizeof(Queue));
if(q==NULL)
return NULL;
//成功返回队列
q->front=q->rear=0;
return q;
}
//入队
void enQueue(Queue *q,datatype e)
{
//1.判断队列是否存在
if(q==NULL)
{
printf("队列已满!!");
return;
}
if(q->front==(q->rear+1)%MAXSIZE)
{
printf("队列已满!!");
return;
}
//2.入队
q->data[q->rear]=e;
q->rear=(q->rear+1)%MAXSIZE;
}
//出队
void OutQueue(Queue *q)
{
if(q==NULL||q->rear==q->front)
{
printf("链表已经为空!出队失败!!!");
return;
}
printf("出队的元素是:%d\n",q->data[q->front]);
q->front=(q->front+1)%MAXSIZE;
}
//遍历
void QueueShow(Queue *q)
{
if(q==NULL)
{
printf("链表为空!!!");
return;
}
for(int i=q->front;i!=q->rear;i=(i+1)%MAXSIZE)
{
printf("%d\t",q->data[i]);
}
printf("\n");
}
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
Queue *p=Create();
if(p==NULL)
{
printf("队列创建失败");
return -1;
}
//入队
int n;
datatype e;
printf("入队的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&e);
enQueue(p,e);
}
//遍历
QueueShow(p);
//出队
OutQueue(p);
QueueShow(p);
char key;
while(p)
{
printf("是否继续出队:y/n");
scanf("%c",&key);
if(key=='n'||key=='N')
return;
else if(key=='y'||key=='Y')
{
OutQueue(p);
QueueShow(p);
}
}
return 0;
}
输出结果:
链式队列
(1)难点:创建队列在堆区申请空间
(2)入队
(3)出队
(4)遍历
head.h
//链式队列
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
//数据域
union{
int len;
datatype data;
};
//指针域
struct node *next;
}Node;//结点的定义
typedef struct
{
Node *front;
Node *rear;
}Queue;
void QueueLinkShow(Queue *q);
Queue *CreatLink();
void enQueueLink(Queue *q,datatype e);
void outQueueLink(Queue *q);
#endif
test.c
#include "head.h"
//创建队列
Queue *CreatLink()
{
Queue *q=(Queue *)malloc(sizeof(Queue));
if(q==NULL)
return NULL;
//创建单向链表的头结点
Node *L=(Node *)malloc(sizeof(Node));
if(L==NULL)
return NULL;
L->len=0;
L->next=NULL;
q->front=L;
q->rear=L;
return q;
}
//入队:尾插
void enQueueLink(Queue *q,datatype e)
{
if(q==NULL)
return;
Node *p=(Node *)malloc(sizeof(Node));
if(p==NULL)
return;
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
q->front->len++;
}
//出队
void outQueueLink(Queue *q)
{
if(q==NULL||q->front->next==NULL)
return -1;
if(q->front->len==0)
{
printf("出队失败!!(队列已空)");
return;
}
Node *p=q->front->next;
q->front->next=p->next;
free(p);
p=NULL;
q->front->len--;
printf("队列的长度为%d\n",q->front->len);
}
//遍历
void QueueLinkShow(Queue *q)
{
if(q==NULL)
return;
Node *p=q->front;
while(p->next)
{
p=p->next;
printf("%d\t",p->data);
}
printf("\n");
}
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
Queue *M=CreatLink();
if(M==NULL)
return -1;
printf("插入几个数?");
int n,e;
scanf("%d",&n);
//入队【尾插]
for(int i=0;i<n;i++)
{
scanf("%d",&e);
enQueueLink(M,e);
}
//遍历
QueueLinkShow(M);
//出队【头删】
outQueueLink(M);
QueueLinkShow(M);
while(1)
{
if(M->front->len==0)
{
printf("链表已空!出队失败!");
break;
}
char key;
printf("您要继续出队吗?y/n");
scanf("%c",&key);
if(key=='y'||key=='Y')
{
outQueueLink(M);
QueueLinkShow(M);
}
if(key=='n'||key=='N')
break;
}
return 0;
}
输出结果: