链队列
要求:实现链队列的创建、初始化、入队、出队 (先进先出)
代码
//
// 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);
}
运行结果
循环队列
要求:循环队列的 创建、入队列、出队列,显示队列 (计数器方法)
代码
//
// 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);
}
运行结果
*********************循环队列入队操作*********************
请输入入队的数据(输入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