队列:插入数据只在队尾进行,删除数据只在队头进行。
顺序队列操作会出现 假溢出(tail指向队列最后,进行入队操作时,即使前面有空位置也显示队列已满)
解决:
1.在出队操作后,增加移动元素操作。每次进行完出队操作后,队列中后面的元素向前移动,始终保持队列第一个位置有元素。(每次移动大量元素,效率低)
2.队列首位相连--循环队列
SeqQueue.h
#define QUEUEMAX 15
typedef struct
{
DATA data[QUEUEMAX];//队列数组
int head;//队头
int tail;//队尾
}SeqQueue;
SeqQueue *SeqQueueInit()//初始化队列
{
SeqQueue *q;
if(q=(SeqQueue *)malloc(sizeof(SeqQueue)))
{
q->head=0;
q->tail=0;
return q;
}
else
return NULL;
}
void SeqQueueFree(SeqQueue *q)//释放队列
{
if(q!=NULL) free(q);
}
int SeqQueueIsEmpty(SeqQueue *q)//队列是否为空,空为0
{
return (q->head==q->tail);
}
int SeqQueueIsFull(SeqQueue *q)//队列是否为已满,满为1
{
return (q->tail==QUEUEMAX);
}
int SeqQueueLen(SeqQueue *q)//返回队列长度
{
return (q->tail-q->head);
}
int SeqQueueIn(SeqQueue *q,DATA data)//入队
{
if(q->tail==QUEUEMAX){//判断队列q是否已满,满返回0
printf("Queue is full!\n");
return 0;
}
else{
q->data[q->tail++]=data;
return 1;
}
}
DATA *SeqQueueOut(SeqQueue *q)//出队
{
if(SeqQueueIsEmpty(q))
{
printf("Queue is empty!\n");//判断队列是否为空,空返回NULL
return NULL;
}
else{
return &(q->data[q->head++]);
}
}
DATA *SeqQueuePeek(SeqQueue *q)//获取队头元素
{
if(SeqQueueIsEmpty(q))
{
printf("Queue is empty!\n");
return NULL;
}
else{
return &(q->data[q->head]);
}
}
SeqQueueTest.c
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char key[15];
char name[15];
}DATA;
#include"SeqQueue.h"
int main()
{
DATA *data1,data;
SeqQueue *q;
q=SeqQueueInit();
printf("input key name:");//一次入队
scanf("%s%s",&data.key,&data.name);
SeqQueueIn(q,data);
data1=SeqQueueOut(q);//一次出队
printf("(%s,%s)",data1->key,data1->name);
SeqQueueFree(q);
getch();
return 0;
}