数据结构------队列

队列

sequeue

 

.h

#pragma once
#ifndef _SEQUEUE_H_
#define _SEQUEUE_H_
#include <stdio.h>
#include<stdlib.h>
#define N 32
typedef int DataType;
typedef struct sequeue
{
	DataType data[N];
	int front;//保存队头下标
	int rear;//保存插入元素下表的后一位
}sequeue;
//创建一个空的队列
sequeue* SequeueCreate();
//入队
void SequeueInput(sequeue* info, DataType data);
DataType SequeueOutput(sequeue* q);
#endif

.c

#include"sequeue.h"
sequeue* SequeueCreate()
{
    sequeue* head = (sequeue*)malloc(sizeof(sequeue));
    head->front = head->rear = 0;
    return head;
}
//入队
void SequeueInput(sequeue* info, DataType data)
{

	if (info == NULL)
	{
		printf("队列不存在!\n");
	}

		if ((info->rear+1)%N==(info->front)) //队满
		{
			printf("队满\n");
			return;
		}

		//赋值
		info->data[info->rear] = data;
		info->rear = (info->rear + 1) % N;
		
		return;
	}
DataType SequeueOutput(sequeue* q)
{
	if (q == NULL)
	{
		printf("队列不存在!\n");
		return (DataType)-1;
	}
	if (q->front == q->rear)
	{
		printf("队列为空!\n");
		return (DataType)-1;

	}
	DataType data = q->data[q->front];
	q->front = (q->front + 1) % N;
	return data;
}

main.c

#include"sequeue.h"
int main(void)
{
	sequeue * q= SequeueCreate();
	for (int i = 0; i < 31; i++)
	{
		SequeueInput(q, i + 1);
		printf("%d入队\n", i + 1);
	}
	DataType data;
	for (int i = 0; i < 31; i++)
	{
		data=SequeueOutput(q);
		printf("%d出队\n",data);
	}
}

linkqueue

.h

#pragma once
#ifndef _LINKQUEUE_H_
#define _LINKQUEUE_H_
#include <stdio.h>
#include<stdlib.h>
typedef int Datatype;
//定义一个节点
typedef struct node//队列节点结构体
{
	Datatype data;//数据域
	struct node* next;//指针域
}node;
typedef struct linkqueue
{
	node* front;//队头指针
	node* rear;//队尾指针
}linkqueue;
//创建一个空队列
linkqueue* LinkQueuecreate();
//入队(尾插法)
void LinkQueuqInput(linkqueue* info, Datatype data);
//出队(头删法
Datatype LinkQueueOutput(linkqueue* info);
#endif // !_LINKQUEUE_H_

.c

#include"linkqueue.h"
//创建一个空队列
linkqueue* LinkQueuecreate()
{
	//为队列信息开辟空间
	linkqueue* Info = (linkqueue*)malloc(sizeof(linkqueue));
	if (Info == NULL)
	{
		printf("malloc failure\n");
		return NULL;
	}
	//赋初值
	Info->front = NULL;
	Info->rear = NULL;
	//为头节点开辟空间
	node* head = (node*)malloc(sizeof(node));
	if (head == NULL)
	{
		printf("malloc failure\n");
		return NULL;
	}
	//赋初值
	head->next = NULL;
	Info->front = Info->rear=head;
	return Info;
}
//入队(尾插法)
void LinkQueuqInput(linkqueue* info, Datatype data)
{
	if (info == NULL || info->front == NULL)
	{
		printf("队列不存在!\n");
		return;
	}
	//申请一个新节点
	node* temp = (node*)malloc(sizeof(node));
	if (temp == NULL)
	{
		printf("malloc failure\n");
		return NULL;
	}
	temp->next = NULL;
	temp->data = data;
	//使用rear指针进行尾插法
	temp->next = info->rear->next;
	info->rear->next =temp ;
	info->rear = temp;//rear保存最新插入的元素的地址
	return;
}
//出队(头删法
Datatype LinkQueueOutput(linkqueue* info)
{
	if (info == NULL || info->front == NULL)
	{
		printf("队列不存在!\n");
		return;
	}
	if (info->front == info->rear)
	{
		printf("队列为空!\n");
		return;
	}
	node* p = info->front->next;
	Datatype data = p->data;
	info->front->next = p->next;//将第二个节点的地址保存在头节点的指针域
	free(p);
	p = NULL;
	if (info->front->next == NULL)//如果是最后一个元素出队,rear会变成野指针
	{
		info->rear = info->front;
	}
	return data;
}

main.c

#include"linkqueue.h"
int main(void)
{
	linkqueue* q = LinkQueuecreate();
	for (int i = 0; i < 10; i++)
	{
		LinkQueuqInput(q, i + 1);
		printf("%d入队\n", i + 1);
	}
	Datatype data;
	for (int i = 0; i <10; i++)
	{
		data = LinkQueueOutput(q);
		printf("%d出队\n", data);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值