C语言数据结构 链队列 基本操作的实现

C语言数据结构实验代码如下:

//链队列基本操作的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
	int data;
	struct Node* next;
}Node;

typedef struct {
	Node* front;
	Node* rear;
}LinkQueue;
//定义一个队列长度的计数器
int length = 0;
//声明一个链队列
LinkQueue* Q = NULL;

//链队列的初始化
void InitQueue() {
	//定义一个临时变量
	Node* temp;
	temp = (Node*)malloc(sizeof(Node));
	Q = (Node*)malloc(sizeof(Node));
	//判断所分配的空间是否存在
	if (!temp) {
		printf("链队列初始化失败\n");
		return;
	}
	Q->front = temp;
	Q->rear = temp;
	temp->next = NULL;
}

//判断队列是否为空
int QueueEmpty() {
	if (Q->front == Q->rear) {
		return 1;//队列为空返回1
	}
	else {
		return 0;//队列不为空返回0
	}
}

//元素入队
int EnQueue() {
	//元素输入
	int num;
	scanf("%d", &num);
	//默认输入-1为结束的标志
	if (num == -1) {
		return 0;//未能成功入队返回0
	}
	//分配一个节点空间
	Node* temp = (Node*)malloc(sizeof(Node));
	//判断所分配的空间是否存在
	if (!temp) {
		printf("链队列空间分配失败\n");
		return;
	}
	//给新节点的数据和指针域进行定义
	temp->data = num;
	temp->next = NULL;
	//使新节点成为原队列最后一个结点的的直接后继
	Q->rear->next = temp;
	Q->rear = temp;
	length++;//更新队列长度
	return 1;//成功入队返回1
}

//初始化多元素入队
void CreatQueue() {
	printf("请输入元素:");
	//定义一个结束循环的标志
	int flag = 1;//默认为1
	while (flag) {
		flag = EnQueue();
	}
}

//打印依次出队元素
void PrintQueue() {
	if (QueueEmpty()) {
		printf("当前队列为空\n");
		return;
	}
	//定义一个指针变量指向头节点
	Node* p = Q->front;
	printf("当前队列依次出队为:");
	//遍历队列
	while (p->next != NULL) {
		p = p->next;
		printf("%d  ", p->data);
	}
	printf("\n");
}

//获取当前链队列的长度
void GetQueueLength() {
	printf("当前链队列的长度为:%d\n", length);
}

//删除当前链队列的队头元素,并打印其值
void DeQueue() {
	//判断当前队列是否为空
	if (QueueEmpty()) {
		printf("当前队列为空\n");
		return;
	}
	//定义一个指针变量
	Node* p = Q->front->next;
	printf("当前队列的队头元素为:%d\n", p->data);
	Q->front->next = p->next;
	length--;//更新链表长度
	//判断删除后队列内是否还有元素
	if (p == Q->rear) {
		Q->rear = Q->front;//队列内没有元素
	}
	free(p);//释放空间
}

//销毁当前队列
void DestroyQueue() {
	while (Q->front) {
		Q->rear = Q->front->next;
		free(Q->front);
		Q->front = Q->rear;
	}
	printf("当前链队列已销毁\n");
}


//菜单
void menu() {
	printf("------------链队列基本操作的实现------------\n");
	printf("1.建立一个链队列\n");
	printf("2.退出菜单\n");
	printf("请输入你所选择的操作数:");
	int i = 0;
	while (1) {
		scanf("%d", &i);
		switch (i) {
		case 1:
			InitQueue();
			CreatQueue();
			PrintQueue();
			break;
		case 2:
			printf("--------------------------------------------");
			return;
		default:
			printf("\n输入的操作数有误,请重新输入:");
		}
		if (i == 1) {
			break;
		}
	}
	while (1) {
		printf("\n");
		printf("1.获取当前链队列的长度\n");
		printf("2.插入新的元素为队尾元素\n");
		printf("3.删除当前链队列的队头元素,并打印其值\n");
		printf("4.打印当前链队列\n");
		printf("5.销毁当前队列,并退出菜单\n");
		printf("请输入你所选择的操作数:");
		scanf("%d", &i);
		switch (i) {
		case 1:
			GetQueueLength();
			break;
		case 2:
			printf("请输入你所插入元素的值:");
			EnQueue();
			PrintQueue();
			break;
		case 3:
			DeQueue();
			break;
		case 4:
			PrintQueue();
			break;
		case 5:DestroyQueue();
			printf("--------------------------------------------");
			return;
			break;
		default:
			printf("\n输入的操作数有误,请重新输入:");
		}
	}
}

//菜单运行
void main() {
	menu();
}

ps.陕理工22级数据结构第二次实验记录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值