数据结构(c语言版) 队列

链队列

要求:实现链队列的创建、初始化、入队、出队 (先进先出)

代码

c 复制代码
//
// Created by My.cy on 2023/10/19.
//
//链队列  创建、初始化、入队、出队   先进先出

#include <stdio.h>
#include <malloc.h>


//定义结构体
struct Node{
    int data;
    struct Node* next;
};

//将头指针和尾指针封装在一起
struct FR{
    struct Node* front;
    struct Node* rear;
};

//初始化
void init(struct Node* node, struct FR* fr){
    node->next = NULL;
    fr->front = node;
    fr->rear = node;
}

//入队
void inqueue(struct FR* fr, int value){
    struct Node* NewNode = malloc(sizeof(struct Node));
    if(NewNode){
        NewNode->data = value;
        NewNode->next = NULL;
        fr->rear->next = NewNode;
        fr->rear = NewNode;
        printf("数据 %d 入队成功,地址为 %p \n",value, NewNode);
    }
}

//显示队列
void isqueue(struct FR* fr){
    struct Node* temp = fr->front;
    while (temp->next != NULL){
        printf("%d-->", temp->next->data);
        temp = temp->next;
    }
}

//出队列
void outqueue(struct FR* fr){
    if(fr->front->next == NULL){
        printf("出队列失败:队列为空!\n");
    }

    struct Node* temp = fr->front->next;
    int value = temp->data;

    if(temp->next == NULL){
        fr->front->next = NULL;
        free(temp);
        printf("数据 %d 出队列成功!\n",value);
        return;
    }
    fr->front->next = temp->next;
    free(temp);
    printf("数据 %d 出队列成功!\n",value);

}

int main(){
    struct Node node;
    struct FR fr;
    //初始化
    init(&node, &fr);

    printf("*********************链队列入队操作*********************\n");
    int value;
    printf("请输入入队的数据(输入0则结束):");
    scanf("%d",&value);
    while (value != 0){
        inqueue(&fr, value);
        printf("请输入入队的数据(输入0则结束):");
        scanf("%d",&value);
    }

    printf("\n*********************链队列显示操作*********************\n");
    isqueue(&fr);

    printf("\n*********************链队列出栈操作*********************\n");
    int out;
    printf("出队列输入1,结束输入0:");
    scanf("%d",&out);
    while (1){
        if(out == 1){
            outqueue(&fr);
        }
        if(out == 0){
            break;
        }
        printf("出队列输入1,结束输入0:");
        scanf("%d",&out);
    }

    printf("\n*********************链队列显示操作*********************\n");
    isqueue(&fr);

    printf("\n*********************链队列入队操作*********************\n");
    int value_1;
    printf("请输入入队的数据(输入0则结束):");
    scanf("%d",&value_1);
    while (value_1 != 0){
        inqueue(&fr, value_1);
        printf("请输入入队的数据(输入0则结束):");
        scanf("%d",&value_1);
    }

    printf("\n*********************链队列显示操作*********************\n");
    isqueue(&fr);

}

运行结果

循环队列

要求:循环队列的 创建、入队列、出队列,显示队列 (计数器方法)

代码

c 复制代码
//
// Created by My.cy on 2023/10/19.
//
//循环队列(计数器方法)     创建、入队列、出队列,显示队列       先进先出

#include <stdio.h>
#define MAXSIZE 5


struct C_S_Queue{
    int data[MAXSIZE];
    int front;
    int rear;
    int num;
};

//初始化
void init(struct C_S_Queue* CSQ){
    CSQ->front = 0;
    CSQ->rear = 0;
    CSQ->num = 0;
}

//入队列
void inQueue(struct C_S_Queue* CSQ, int value){
    if(CSQ->num == MAXSIZE){
        printf("入队列失败:队列为满队列!\n");
        return;
    }
    int index = CSQ->rear % MAXSIZE;
    CSQ->data[index] = value;
    CSQ->rear = (CSQ->rear + 1) % MAXSIZE;
    CSQ->num ++;
    printf("数据 %d 在数组的第 %d 位入队成功!\n",value, index+1);
}

//出队列
void outQueue(struct C_S_Queue* CSQ){
    if(CSQ->num == 0){
        printf("出队列失败:队列为空队列!\n");
        return;
    }
    int index = CSQ->front % MAXSIZE;
    int value = CSQ->data[index];
    CSQ->front = (CSQ->front + 1) % MAXSIZE;
    CSQ->num --;
    printf("数据 %d 出队列成功!\n", value);
}


//显示队列
void isQueue(struct C_S_Queue* CSQ){
    if(CSQ->num == 0){
        printf("显示队列失败:队列为空队列!\n");
        return;
    }
    int index = 1;
    int f = CSQ->front % MAXSIZE;

    while (index <= CSQ->num){
        printf("队列第 %d 位数据为 %d \n",index, CSQ->data[f]);
        f = (f+1)%MAXSIZE;
        index ++;
    }
}

int main(){
    struct C_S_Queue CSQ;
    //初始化
    init(&CSQ);

    printf("*********************循环队列入队操作*********************\n");
    int value;
    printf("请输入入队的数据(输入0则结束):");
    scanf("%d",&value);
    while (value != 0){
        inQueue(&CSQ, value);
        printf("请输入入队的数据(输入0则结束):");
        scanf("%d",&value);
    }

    printf("*********************显示循环队列操作*********************\n");
    isQueue(&CSQ);

    printf("*********************循环队列出队操作*********************\n");
    int out;
    printf("出队列输入1,结束输入0:");
    scanf("%d",&out);
    while (1){
        if(out == 1){
            outQueue(&CSQ);
        }
        if(out == 0){
            break;
        }
        printf("出队列输入1,结束输入0:");
        scanf("%d",&out);
    }

    printf("*********************显示循环队列操作*********************\n");
    isQueue(&CSQ);

    printf("*********************循环队列入队操作*********************\n");
    int value_1;
    printf("请输入入队的数据(输入0则结束):");
    scanf("%d",&value_1);
    while (value_1 != 0){
        inQueue(&CSQ, value_1);
        printf("请输入入队的数据(输入0则结束):");
        scanf("%d",&value_1);
    }

    printf("*********************显示循环队列操作*********************\n");
    isQueue(&CSQ);

}

运行结果

c 复制代码
*********************循环队列入队操作*********************
请输入入队的数据(输入0则结束):123
数据 123 在数组的第 1 位入队成功!
请输入入队的数据(输入0则结束):23
数据 23 在数组的第 2 位入队成功!
请输入入队的数据(输入0则结束):34
数据 34 在数组的第 3 位入队成功!
请输入入队的数据(输入0则结束):445
数据 445 在数组的第 4 位入队成功!
请输入入队的数据(输入0则结束):142
数据 142 在数组的第 5 位入队成功!
请输入入队的数据(输入0则结束):0
*********************显示循环队列操作*********************
队列第 1 位数据为 123
队列第 2 位数据为 23
队列第 3 位数据为 34
队列第 4 位数据为 445
队列第 5 位数据为 142
*********************循环队列出队操作*********************
出队列输入1,结束输入0:1
数据 123 出队列成功!
出队列输入1,结束输入0:1
数据 23 出队列成功!
出队列输入1,结束输入0:0
*********************显示循环队列操作*********************
队列第 1 位数据为 34
队列第 2 位数据为 445
队列第 3 位数据为 142
*********************循环队列入队操作*********************
请输入入队的数据(输入0则结束):100
数据 100 在数组的第 1 位入队成功!
请输入入队的数据(输入0则结束):0
*********************显示循环队列操作*********************
队列第 1 位数据为 34
队列第 2 位数据为 445
队列第 3 位数据为 142
队列第 4 位数据为 100
相关推荐
夜月yeyue23 分钟前
个人写HTOS移植shell
c++·mcu·算法·性能优化·架构·mfc
Nix Lockhart31 分钟前
《算法与数据结构》第七章[算法3]:图的最小生成树
c语言·数据结构·算法
十重幻想37 分钟前
PTA6-5 使用函数求1到10的阶乘和(C)
java·c语言·算法
名誉寒冰1 小时前
【LeetCode】454. 四数相加 II 【分组+哈希表】详解
算法·leetcode·散列表
会开花的二叉树1 小时前
c语言贪吃蛇游戏开发
c语言·开发语言
十重幻想2 小时前
PTA6-4 使用函数统计指定数字的个数(C)
c语言·c++·算法
夜月yeyue2 小时前
ART 加速器、流水线与指令预测的关系详解
linux·服务器·c语言·单片机·嵌入式硬件·性能优化·嵌入式高阶技巧
迎風吹頭髮2 小时前
UNIX下C语言编程与实践36-UNIX 时钟:系统时间、高分辨率时间与日历时间的转换与使用
服务器·c语言·unix
格林威2 小时前
机器视觉的工业镜头有哪些?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
Yupureki2 小时前
从零开始的C++学习生活 5:内存管理和模板初阶
c语言·c++·学习·visual studio