数据结构(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
相关推荐
XY_墨莲伊2 小时前
【算法设计与分析】实验5:贪心算法—装载及背包问题
c语言·数据结构·c++·算法·贪心算法·排序算法
Happy_Traveller2 小时前
三角形的最大周长(976)
数据结构·算法·leetcode
水蓝烟雨2 小时前
[HOT 100] 2824. 统计和小于目标的下标对数目
算法·hot 100
KuaCpp2 小时前
搜索与图论复习2最短路
c++·算法·图论
weixin_307779132 小时前
Python获取能唯一确定一棵给定的树的最少数量的拓扑序列
数据结构·python
咒法师无翅鱼3 小时前
【leetcode详解】T598 区间加法
算法·leetcode·职场和发展
砂糖はいかがですか。3 小时前
关于合并两个有序链表
数据结构·算法·链表
c-c-developer4 小时前
C++ Primer 自定义数据结构
数据结构·c++
不会打代码呜呜呜呜4 小时前
小白零基础--CPP多线程
开发语言·c++·算法
涛ing4 小时前
【5. C++ 变量作用域及其深入探讨】
java·linux·c语言·开发语言·c++·ubuntu·vim