#define maxsize 6
typedef struct{
int data[maxsize];
int rear,front;
}Quene,*pQueue;
注意:(1).front表示队头元素的前一个元素在数组中的位置,rear表示队尾元素在数组中的位置
初始化:
void init(pQueue q){
q->front=0;
q->rear=0;
}
注意:(1).初始化front和rear都相等为0
进队:
void add(pQueue q,int x){
if((q->rear+1)%maxsize==q->front){
printf("overflow");
return;
}else{
q->rear=(q->rear+1)%maxsize;
q->data[q->rear]=x;
printf("添加成功\n");
}
}
注意:(1).队列满和队列空都是rear=front,怎么解决呢?可以采取少用一个元素的方法。比如可以存放6个元素的数组,到5个就默认满了,所以当(q->reaar+1)%maxsize==q->front 就表示满了,就不能再加入元素了(对maxsize取余,比如6取余6就是0,就代表绕一圈后的数组索引)
出队:
void dl(pQueue q){
if(q->front==q->rear){
printf("null");
return;
}else{
q->front=(q->front+1)%maxsize;
printf("删除的元素是:%d\n",q->data[q->front]);
}
}
注意:(1).一开始无元素,front和rear都相等等于0,则为null
(2).当把每一个元素删除完,front不断+1,当与rear相等时,就会把rear所对应的元素删除,此时队列也为空了
销毁:
void destroyQueue(pQueue q){
free(q);
q=NULL;
}
注意:(1)pQueue q=(pQueue)malloc(sizeof(Quene));为队列指针申请了一块内存空间,销毁时也要free掉,同时指向null,防止野指针
遍历队列:
void traverseQuene(pQueue q){
int i=q->front;
while(i!=q->rear){
i=(i+1)%maxsize;
printf("%d ",q->data[i]);
}
printf("\n");
}
完整代码如下:
#include
#include
#include
#define maxsize 6
typedef struct{
int data[maxsize];
int rear,front;
}Quene,*pQueue;
void init(pQueue q){
q->front=0;
q->rear=0;
}
void destroyQueue(pQueue q){
free(q);
q=NULL;
}
void add(pQueue q,int x){
if((q->rear+1)%maxsize==q->front){
printf("overflow");
return;
}else{
q->rear=(q->rear+1)%maxsize;
q->data[q->rear]=x;
printf("添加成功\n");
}
}
void dl(pQueue q){
if(q->front==q->rear){
printf("null");
return;
}else{
q->front=(q->front+1)%maxsize;
printf("删除的元素是:%d\n",q->data[q->front]);
}
}
void traverseQuene(pQueue q){
int i=q->front;
while(i!=q->rear){
i=(i+1)%maxsize;
printf("%d ",q->data[i]);
}
printf("\n");
}
int main(){
pQueue q=(pQueue)malloc(sizeof(Quene));
init(q);
add(q,1);
add(q,2);
add(q,3);
traverseQuene(q);
system("pause");
dl(q);
traverseQuene(q);
system("pause");
dl(q);
traverseQuene(q);
system("pause");
}