typedef struct QNode//结点结构
{
int data;
struct QNode* next;
}QNode,*Queueptr;
typedef struct//队列的链表结构
{
Queueptr front;//头指针
Queueptr rear;//尾指针
}LinkQueue;
1.初始化
void InitQueue(LinkQueue &q)//初始化
{
q.front = (Queueptr)malloc(sizeof(QNode));//开辟空间
if (!q.front)
{
printf("false");
exit(0);
}
q.rear = q.front;//当rear 与 front相等时为空
q.front->next = NULL;
}
2.入队
链栈入队无需考虑队列是否为满
int EnQueue(LinkQueue* q, int e)//插入,e为插入的元素
{
Queueptr s = (Queueptr)malloc(sizeof(QNode));
s->data = e;
s->next = NULL;
q->rear->next = s;
q->rear = s;
return 1;
}
3.出队
出队是我们需要考虑,链队是否为空,并且还需要考虑 队列中是否只剩一个元素,当队列只剩一个元素的时候,我们需要将 移动尾指针的位置:就是 rear = front 操作,将front指针赋值与rear指针,然后在释放空间;
int DeQueue(LinkQueue* q, int& e)//e用来记录被删除的值
{
if (q->front == q->rear)//判断队列是否为空,如果头指针等于尾指针,则队列为空
return 0;
Queueptr p = (Queueptr)malloc(sizeof(QNode));
p = q->front->next;
e = p->data;
q->front->next = p->next;
if (p == q->rear)//如果 p == q->rear ,则说明队列只有一个元素
{
q->rear = q->front;
}
free(p);
return 1;
}
4.遍历队列
void traverseQueue(LinkQueue q)//遍历队列
{
Queueptr p = q.front->next;
if (q.front == q.rear)//判断队空
return;
while (p!= NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
5.销毁队列
void DestoryQueue(LinkQueue& q)//销毁队列
{ /* 不需要考虑队列是否为空*/
while (q.front)
{
q.rear = q.front->next;
free(q.front);
q.front = q.rear;
}
}