队列有两种表示方式,我们再看链表实现:
个人感觉队列也就是链表的一种特殊表,如果前面的链表知识通关了这里随便看看记住队列的游戏规则就行了。还是和前面一样,先要有头结点,总体来说就是单链表的插删。
这里与顺序队列不同的是不需要判断队列是不是满了,链表最大的特点是动态分配节点空间。
详情还是在代码中描述:
队列的链式储存结构:
typedef struct QNode
{
int data;
struct QNode *next;
}QNode;
typedef struct
{
QNode front;
QNode rear;
}LinkQueue;
链队的初始化,构造一个空队列:
int InitQueue(LinkQueue &Q)
{
Q.front=Qrear=new QNode;
Q.front->next=NULL;
return 1;
}
入队
int EnQueue(LinkQueue &Q, int e)
{
QNode *p;
p=(QNode *)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
出队
int DeQueue(LinkQueue &Q, int &e)
{
QNode *p;
if(Q.front==Q.rear)
return 0;
p=Q.front0>next;
e=p->data;
Q.front->next=p->next;
//最后一个被删那rear也删了,所以重置rear
if(Q.rear==p)
Q.rear=Q.front;
delepe p;
return 1;
}
取队头元素
int GetHead(LinkQueue Q)
{
if(Q.front!=Q.rear)
return Q.front->next->data;
}