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级数据结构第二次实验记录