队列结构中允许堆两端进行操作,但是两端的操作不同。在表的一端只能进行删除操作,称为队头;在表的另一端只能进行插入操作,称为队尾。如果队列中没有元素,称为空队列。(先进先出)
入队列:将一个元素添加到队尾(相当于到队列最后排队等候)
出队列:将队头的元素取出,同时删除该元素,使后一个元素成为队头。
准备数据
#define QUWUWLEN 15
struct DATA
{
char name[10];
int age;
};
struct SQType
{
DATA data[QUEUELEN];//队列数组
int head;//队头
int tail;//队尾
}
初始化队列结构
在使用顺序队列之前,首先创建一个空的顺序队列,也就是初始化顺序队列。顺序队列的初始化操作步骤如下:
(1)按符号常量QUEUELEN指定的大小申请一块内存空间,用来保存队列中的数据。
(2)设置head=0,和tail=0,表示一个空栈。
SQType* SQTypeInit()
{
SQType *q;
if(q=(SQType*)malloc(sizeof(SQType)))//申请内存
{
q->head=0;//设置队头
q->tail=0;//设置队尾
return q;
}
else
{
return NULL;//返回空
}
}
判断空队列
int SQTypeIsFull(SQType* q)
{
int temp;
temp=(q->tail==q->QUEUELEN);
return temp;
}
在这里,输入参数q为一个指向操作的队列的指针。程序中,判断队列tail是否已经等于QUEUELEN,从而判断队列是否已满。
清空队列
void SQTypeClear(SQType* q)
{
q->head=0;//设置队头
q->tail=0;//设置队尾
}
释放空间
void SQTypeFree(SQType *q)
{
if(q!=NULL)
{
free(q);
}
}
入队列
(1)首先判断队列顶tail,如果tail等于QUEUELEN,则表示溢出,进行出错处理,否则执行下操作;
(2)设置tail=tail+1,(队列顶指针加1,指向入队列的地址)
(3)将入队列遇难苏保存到tail指向的位置。
int InSQType(SQType* q,DATA data)
{
if(q->tail=QUEUELEN)
{
printf("队列已满!操作失败!\n");
return 0;
}
else
{
q->data[q->tail++]=data;//将元素入队列
return 1;
}
}
出队列
(1)判断队列head,如果head等于tail,则表示为空队列,进行出错处理。否则执行下一步。
(2)从队列首部取出队头元素(实际返回对头元素的指针)
(3)设修改对头head的序号,使其指向后一个元素。
DATA *OutSQType(SQType* q)
{
if(q->head==q->tail)
{
printf("\n队列以空!操作失败\n");
exit(0);
}
else
{
return &(q->data[q->head++]);
}
}
**读结点数据 **
未完待续