Icoding题解
题干
队列 循环链表表示队列
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),请完成下列任务:
1: 队列初始化,成功返回真,否则返回假: bool init_queue(LinkQueue *LQ);
2: 入队列,成功返回真,否则返回假: bool enter_queue(LinkQueue *LQ, ElemType x);
3: 出队列,成功返回真,且*x为出队的值,否则返回假 bool leave_queue(LinkQueue *LQ, ElemType *x);
相关定义如下:
1 2 3 4
| typedef struct _QueueNode { ElemType data; struct _QueueNode *next; }LinkQueueNode, *LinkQueue;
|
分析
注释代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| bool init_queue(LinkQueue *LQ) { if (*LQ == NULL) return false; *LQ = (LinkQueue)malloc(sizeof(LinkQueueNode)); if (*LQ == NULL) return false; (*LQ)->next = *LQ; (*LQ)->data = 0; return true; }
bool enter_queue(LinkQueue *LQ, ElemType x) { LinkQueue Temp = NULL; Temp = (LinkQueue)malloc(sizeof(LinkQueueNode)); if (Temp == NULL) return false; Temp->data = x; Temp->next = (*LQ)->next; (*LQ)->next = Temp; (*LQ) = Temp;
return true; }
bool leave_queue(LinkQueue *LQ, ElemType *x) { if ((*LQ)->next == (*LQ)) return false; LinkQueue Temp; LinkQueue Head = (*LQ)->next; Temp = Head->next; *x = Temp->data; Head->next = Temp->next;
if (Temp == (*LQ)) { (*LQ) = Head; } free(Temp);
return true; }
|
完整代码
完整代码的版本和前面带注释的版本都是可以通过icoding检测的。
对比两者的差别有助于更好地理解题目。
个人觉得这个版本的出队写得更优雅一点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| bool init_queue(LinkQueue *LQ) { *LQ = (LinkQueue)malloc(sizeof(LinkQueueNode)); if(*LQ == NULL) return false; (*LQ)->data = 0; (*LQ)->next = (*LQ); return true; }
bool enter_queue(LinkQueue *LQ, ElemType x) { LinkQueue Temp = (LinkQueue)malloc(sizeof(LinkQueueNode));
if(Temp == NULL) return false;
Temp->data = x; Temp->next = (*LQ)->next; (*LQ)->next = Temp; (*LQ) = (*LQ)->next; return true; }
bool leave_queue(LinkQueue *LQ, ElemType *x) { LinkQueue HeadNode = (*LQ)->next; LinkQueue LeaveNode = (*LQ)->next->next; if (HeadNode == LeaveNode) return false; *x = LeaveNode->data; HeadNode->next = LeaveNode->next; if ((LeaveNode) == (*LQ)) (*LQ) = (*LQ)->next; free(LeaveNode); return true; }
|