C语言实现链队列

链队列和单链表相似,在单链表的基础上增加了两个头尾指针,且元素的删除和增加按照循环队列规则。

//队列链表结构的节点
typedef struct node
{

    int data;
    struct node *next;
} Q_node;

//链表结构(头尾指针)
typedef struct List
{
    Q_node *front;
    Q_node *rear;
} ListQueue;

初始化操作:

ListQueue *InitListQueue(ListQueue *Q)    
{
    Q = (ListQueue *)malloc(sizeof(ListQueue)); //生成节点指针
    Q->front = (Q_node *)malloc(sizeof(Q_node)); //生成头结点
    if (Q->front == NULL)
    {
        exit(-1);
    }
    Q->rear = Q->front;   //空队列时头指针和尾指针一样,指向头节点
    Q->front->next = NULL; //空队列的头结点的next指向空
    return Q;
}

进队操作:

void InListQueue(ListQueue *Q, int data)
{
    Q_node *p;
    p = (Q_node *)malloc(sizeof(Q_node));
    if (!p)
    {
        exit(-1);
    }

    p->data = data;    //传入需要入队的值
    p->next = NULL;    //将其指针域作为尾,即将其作为最后一个元素
    Q->rear->next = p; //将入队的元素赋为当前队列尾节点的后继
    Q->rear = p;       //将入队的元素当做为尾节点
}

出队操作:

void OutListQueue(ListQueue *Q, int *data)
{
    Q_node *p;

    if (Q->front == Q->rear)
    {
        printf("队空");
        exit(-1);
    }

    p = Q->front->next;       //p指向队头节点
    *data = p->data;          //保存删除的值
    Q->front->next = p->next; //将原队头的后继变成队头
    if (Q->rear == p)         //若此时队头也是队尾
    {
        Q->rear = Q->front;
    }

    free(p);   //移除队列之后记得释放保存其内容的指针
}

打印:

void PrintListQueue(ListQueue *Q)
{

    Q_node *q;
    q = Q->front->next;
    if (Q->front->next == Q->rear->next)
    {
        printf("空队列\n");
        exit(0);
    }

    while (q != NULL)
    {
        printf("节点的值为: %d\n", q->data);
        q = q->next;
    }
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值