icoding数据结构——队列 循环链表表示队列(详细注释)

题目:

假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),请完成下列任务:

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 <stdio.h>
#include <stdlib.h>
#include "list.h" // 请不要删除,否则检查不通过

// 队列初始化
bool init_queue(LinkQueue *LQ) {
    // 创建头结点
    *LQ = (LinkQueue)malloc(sizeof(LinkQueueNode));
    if (*LQ == NULL) {
        return false;
    }
    (*LQ)->next = *LQ;  // 头结点的next指针指向自己,表示为空队列
    return true;
}

// 入队列
bool enter_queue(LinkQueue *LQ, ElemType x) {
    LinkQueueNode *newNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    if (newNode == NULL) {
        return false;
    }
    newNode->data = x;
    newNode->next = (*LQ)->next;  // 新结点的next指针指向队列头结点的next指针
    (*LQ)->next = newNode;        // 头结点的next指针指向新结点
    *LQ = newNode;                // 队尾指针指向新结点
    return true;
}

// 出队列
bool leave_queue(LinkQueue *LQ, ElemType *x) {
    if ((*LQ)->next == *LQ) {  // 队列为空
        return false;
    }
    LinkQueueNode *firstNode = (*LQ)->next->next;  // 第一个结点
    *x = firstNode->data;                          // 获取第一个结点的值
    (*LQ)->next->next = firstNode->next;           // 头结点的next指针指向第二个结点
    if (firstNode == *LQ) {                        // 如果出队列的是最后一个结点
        *LQ = (*LQ)->next;                          // 队尾指针指向头结点
    }
    free(firstNode);                               // 释放第一个结点的内存
    return true;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值