数据结构练习--链队列实验

c语言代码实现

注:函数功能和注释都在代码里

#include<stdio.h>
#include<stdlib.h>

//学生类型定义
typedef struct
{
	int age;
	int height;
	double weigth;

}Student;

//队列节点类型
typedef struct _node
{
	Student stu;
	struct  _node* next;

}Node;

//队列头指针和尾指针类型
typedef struct
{
	Node* front;
	Node* rear;
}LinkQueue;

//初始化队列函数
int initQueue(LinkQueue *q)
{
	//为队列生成一个头节点,然后队列的头指针指向头节点
	q->front = (Node*)malloc(sizeof(Node));
	q->rear = q->front;//初始化时,头尾指向同一个节点
	if (!q->front)exit(-1);

	//设置头节点的next值为空
	q->front->next = NULL;
	return 1;

}
//销毁队列函数
int destoryQueue(LinkQueue* q)
{
	if (!q->front)return 0;
	while (q->front != NULL)
	{
		//从队列头部开始释放节点
		q->rear = q->front->next;
		free(q->front);
		q->front = q->rear;
	}
	return 1;
}
//入队列函数
int insertQueue(LinkQueue *q,Node *node )
{
	if (!q->front)return 0;
	q->rear->next = node;  
	q->rear = node;
	q->rear->next = NULL;
	return 1;
}
//节点值复制函数
void copyValue(Node *node1,Node *node2)
{
	if (!node2)return ;
	*node1 = *node2;
	node1->next = NULL;
}
//出队列函数
int deleteQueue(LinkQueue* q, Node* node)
{
	if (q->front == q->rear)return 0;
	Node* p = q->front->next;//从头节点的下一个节点开始释放
	if (!p)return 0;
	copyValue(node,p);
	q->front->next = p->next;

	//如果队列的尾指针指向的是头指针的下一个,那么这个节点是最后一个数据节点
	if (q->rear == p)q->rear == q->front;
	free(p);
	return 1;
}
//显示学生信息函数
void displayValue(Student* stu)
{
	if (!stu)return;
	printf("age=%5d,weight=%5d,height=%5lf\r\n",stu->age, stu->height , stu->weigth );
}
//遍历队列函数
int displayQueue(LinkQueue *q)
{
	if (q->front == q->rear)return 0;
	Node* p = q->front->next;
	while (p!=NULL)
	{
		displayValue(&p->stu);
		p = p->next;
	}
	return 1;

}
//为学生输入信息函数
void inputValue(Student* stu)
{
	if (!stu)return;
	printf("输入学生年龄,身高,体重\n");
	scanf_s("%d%d%lf", &stu->age, &stu->height, &stu->weigth);

}

//生成节点函数
Node* createNode(Student *stu)
{
	Node* node = (Node *)malloc(sizeof(Node));
	if (!node)return NULL;
	node->stu = *stu;//把学生信息传给节点
	node->next = NULL;
	return node;
}
//测试程序:生成n个数据节点
void test(LinkQueue *q ,int n)
{
    Student stu;
	Node* node;
    for (int i = 0; i < n; i++)
    {
		inputValue(&stu);//输入学生信息
		node = createNode(&stu);//创建节点
		insertQueue(q, node);//插入节点
    }
}
int main()
{
	LinkQueue q;
	//初始化队列
	initQueue(&q);

	//测试程序:增加3个队列节点
	test(&q,3);
	printf("打印增加3个节点后的队列信息\n");//打印增加3个节点后的队列信息
	displayQueue(&q);

	//出队列
	Node node;
	deleteQueue(&q, &node);
	printf("打印出队列后的队列信息\n");//打印出队列后的队列信息
	displayQueue(&q);
	printf("打印出队列的成员信息\n");//打印出队列的成员信息
	displayValue(&node.stu);

	//销毁队列
	destoryQueue(&q);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值