数据结构(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
相关推荐
tobias.b7 小时前
408真题解析-2010-6-数据结构-哈夫曼树
数据结构·计算机考研·408真题解析
tobias.b8 小时前
408真题解析-2010-7-数据结构-无向连通图
数据结构·算法·图论·计算机考研·408真题解析
良木生香9 小时前
【鼠鼠优选算法-双指针】003:快乐数 & 004:盛水最多的容器
算法
Cx330❀9 小时前
【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列
c++·算法
沃尔特。9 小时前
直流无刷电机FOC控制算法
c语言·stm32·嵌入式硬件·算法
CW32生态社区9 小时前
CW32L012的PID温度控制——算法基础
单片机·嵌入式硬件·算法·pid·cw32
Cx330❀9 小时前
【优选算法必刷100题】第038题(位运算):消失的两个数字
开发语言·c++·算法·leetcode·面试
漫随流水9 小时前
leetcode回溯算法(93.复原IP地址)
数据结构·算法·leetcode·回溯算法
燃于AC之乐9 小时前
我的算法修炼之路--5——专破“思维陷阱”,那些让你拍案叫绝的非常规秒解
c++·算法·贪心算法·bfs·二分答案·扩展域并查集·动态规划(最长上升子序列)
艾莉丝努力练剑9 小时前
【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值
数据结构·c++·算法·leetcode·stl