题目:
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),请完成下列任务:
1: 队列初始化,成功返回真,否则返回假: bool init_queue(LinkQueue *LQ);
2: 入队列,成功返回真,否则返回假: bool enter_queue(LinkQueue *LQ, ElemType x);
3: 出队列,成功返回真,且*x为出队的值,否则返回假 bool leave_queue(LinkQueue *LQ, ElemType *x);
相关定义如下:
typedef struct _QueueNode {
ElemType data; // 数据域
struct _QueueNode *next; // 指针域
}LinkQueueNode, *LinkQueue;
代码:
#include "list.h" // 请不要删除,否则检查不通过
#include <stdio.h>
#include <stdlib.h>
bool init_queue(LinkQueue* LQ)
{
(*LQ) = (LinkQueue*)malloc(sizeof(LinkQueue));
(*LQ)->next = (*LQ);
if (LQ != NULL) {
return 1;
} else {
return 0;
}
}
bool enter_queue(LinkQueue* LQ, ElemType x)
{
LinkQueueNode* p; //尾指针//
LinkQueueNode* q; //入队数据//
q = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
p = (*LQ);
if (q != NULL) {
q->data = x;
q->next = p->next;
p->next = q;
(*LQ) = q;
return 1;
} else {
return 0;
}
}
bool leave_queue(LinkQueue* LQ, ElemType* x)
{
LinkQueueNode* p; //定义指针
if ((*LQ)->next == (*LQ)) {
return 0;
}
p = (*LQ);
if (p->next->next == p) {
*x = (*LQ)->data;
p = p->next;
p->next = p;
free(*LQ);
(*LQ) = p;
} else {
p = p->next->next;
(*LQ)->next->next = p->next;
*x = p->data;
free(p);
}
return 1;
}