零、说明
- 在链队列中,head指向头节点,但是实际的head是head指向的节点,即第一个有元素的节点
- tail在循环队列中指向空位置,但是在链队列中,tail指向最后一个节点
一、数据类型
和链栈一样采取两个结构体的形式
typedef struct Queuenode
{
int data;
struct Queuenode *next;
}Qqueuenode,*Queueptr;
typedef struct Linkqueue
{
Queueptr head,tail;
int num;
}Linkqueue;
二、初始化
void Initial(Linkqueue *Q)
{
Q->head=new Queuenode;
Q->tail=Q->head;
Q->num=0;
Q->head->next=NULL;
}
三、入出队列
- 入队列
操作:新建节点设置好data和next,处理Q的tail,处理Q的num
void Enque(Linkqueue *Q,int data)
{
Queueptr p;
p=new Queuenode;
p->data=data;
p->next=NULL;
Q->tail->next=p;
Q->tail=p;
Q->num++;
}
- 出队列
操作:得到真正的队头的data,处理Q的head,处理Q的num
int Deque(Linkqueue *Q)
{
int ret;
ret=-1;
if(Q->num!=0)
{
Queueptr p;
p=Q->head->next;//第一个节点才是真正的队头
ret=p->data;
Q->head->next=p->next;
if(p==Q->tail)//如果Q中只有一个存数据的节点,那删除时还要改变尾节点,注意这一点
{
Q->tail=Q->head;
}
Q->num--;
delete p;
}
else
{
cout<<"EMPTY"<<endl;
}
return ret;
}
- Gethead
int Gethead(Linkqueue *Q)
{
return Q->head->next->data;
}
四、主函数测试
int main()
{
Linkqueue Q;
Initial(&Q);
for(int i=1;i<=100;i++)
{
Enque(&Q,i);
}
cout<<Deque(&Q)<<endl;
cout<<Gethead(&Q)<<endl;
for(int i=1;i<=100;i++)
{
cout<<Deque(&Q)<<' ';
}
return 0;
}