链式队列 || 循环队列--C语言实现

链式队列的思想是尾插法,先进先出。
1、首先我们需要一个头节点

//创建一个结构体表示节点
typedef struct node_s {
    int data;
    struct node_s* next;
}que;
//创建头节点
que* creat_head_node() {
    que* head = (que*)malloc(sizeof(que));
    head->next = NULL;
    memset(head, 0, sizeof(que));
    return head;

2、然后我们在进队列(添加新节点)需要一个尾指针rear,尾指针永远指向队列的最后一个元素(节点),所以进来的时候:rear->next = new_node;rear = new_node,以便下一个元素进队之前尾指针是指向最后一个元素的

que* add_que(que* rear, int data) {
    que* new_node = (que*)malloc(sizeof(que));
    new_node->data = data;
    new_node->next = NULL;
    //使用尾插法向链队列中添加数据元素
    rear->next = new_node;
    rear = new_node;
    return rear;

3、出队列(删除节点)的时候,需要一个头指针top,头指针永远指向头节点,在出队列的时候,通过top->next指向头节点后边的那个节点,这个节点就是即将出队的节点创建一个新指针指向它,p = head->next,因为它要出去,所有要断开它的所有连接,既让头节点指向它的下一个节点,p->next = top->next。

que* de_que(que* top, que* rear) {
    if (top->next == NULL) {
        printf("\n");
        printf("出队完成");
        return rear;
    }
    que* p = top->next;
    printf("%d ", p->data);
    top->next = p->next;
    if (rear == p) {
        rear = top;
    }
    return rear;

所以实现链式队列就三个步骤,逻辑理清楚之后就很容易理解了。
以下是全部代码

#include <stdio.h>
#include <stdlib.h>
typedef struct node_s {
    int data;
    struct node_s* next;
}que;
que* creat_head_node() {
    que* head = (que*)malloc(sizeof(que));
    head->next = NULL;
    memset(head, 0, sizeof(que));
    return head;
}
que* add_que(que* rear, int data) {
    que* new_node = (que*)malloc(sizeof(que));
    new_node->data = data;
    new_node->next = NULL;
    //使用尾插法向链队列中添加数据元素
    rear->next = new_node;
    rear = new_node;
    return rear;
}
que* de_que(que* top, que* rear) {
    if (top->next == NULL) {
        printf("\n");
        printf("出队完成");
        return rear;
    }
    que* p = top->next;
    printf("%d ", p->data);
    top->next = p->next;
    if (rear == p) {
        rear = top;
    }
    return rear;
}
int main() {
    que* queue, * top, * rear;
    queue = top = rear = creat_head_node();//创建头结点
    //向链队列中添加结点,使用尾插法添加的同时,队尾指针需要指向链表的最后一个元素
    rear = add_que(rear, 1);
    rear = add_que(rear, 2);
    rear = add_que(rear, 3);
    rear = add_que(rear, 4);
    //入队完成,所有数据元素开始出队列
    rear = de_que(top, rear);
    rear = de_que(top, rear);
    rear = de_que(top, rear);
    rear = de_que(top, rear);
    rear = de_que(top, rear);
    return 0;
}

9月9号更新
循环队列:

/*********************************************************************************
 *      Copyright:  (C) 2021 li liangshi<1007146932@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  queue.c
 *    Description:  This file is 循环队列
 *                 
 *        Version:  1.0.0(2021年09月07日)
 *         Author:  li liangshi <1007146932@qq.com>
 *      ChangeLog:  1, Release initial version on "2021年09月07日 19时17分58秒"
 *                 
 ********************************************************************************/

#include <stdio.h>
#include <stdlib.h>

//#define  QUEUE_SIZE 10;

typedef struct queue
{
    int             *value;
    unsigned int    front;
    unsigned int    rear;
    unsigned int    maxsize;
}QUEUE, *PQUEUE;

QUEUE Queue;

/* 创建空的循环队列 */
void Creatqueue(PQUEUE q, int maxsize)
{
    q->value  = (int *)malloc(sizeof(int) * maxsize);
    q->front = 0;
    q->rear = 0;
    q->maxsize = maxsize;
}

/* 判断循环队列是否为空 */
int Emptqueue(PQUEUE q)
{
    if(q->front == q->rear)
        return 1;
    else
        return 0;
}

/* 判断循环队列是否已满 */
int Fullqueue(PQUEUE q)
{
    if(q->front == (q->rear+1)%(q->maxsize))
        return 1;
    else
        return 0;
}

/* 入队列 */
int In_queue(PQUEUE q, int value)
{
    if(Fullqueue(q) == 0)
    {
        q->value[q->rear] = value;
        q->rear = (q->rear+1)%q->maxsize;
        return 1;
    }
    else
        return 0;
}

/* 出队列 */
int Outqueue(PQUEUE q, int *val)
{
    if(Emptqueue(q) == 0)
    {
        *val = q->value[q->front];
        q->front = (q->front+1)%(q->maxsize);
        return 1;
    }
    else
        return 0;
}


int main (int argc, char **argv)
{
    int data, i, num;
    int val;
    
    printf("你想新建一个多长的循环队列:");
    scanf("%d", &num);
    Creatqueue(&Queue, num);

    for(i=1; i<num; i++)
    {
        printf("第%d个进去队列的数据是:", i);
        scanf("%d", &data);
        In_queue(&Queue, data);
    }

    printf("出队列!");
    for(i=1; i<num; i++)
    {
        Outqueue(&Queue, &val);
        printf("%d ", val);
    }
    printf("\n");
    return 0;
} 

运行结果截图
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值