【数据结构练习】基于链表结构实现的队列

基于链表结构实现的队列,特点是先进先出,由于是链表结构实现了,所以理论上队列不会为满。


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

//定义节点的数据类型
typedef struct _node
{
	int data;
	struct _node* p_next;
}Node;

typedef struct _queue
{
	//队首指针,指向队列中第一个元素
	Node *p_head;
	//队尾指针,指向队列最后一个元素,目的是为了添加元素的时候不用遍历,典型的空间换时间
	Node *p_cur;
	//记录队列中元素的个数
	int size;
}Queue;

//创建一个节点
Node* create_node(int data);

//创建一个队列
Queue* create_queue(void);

//判空
int is_empty(Queue* p_queue);

//判满
int is_full(Queue* p_queue);

//入队操作
void push_queue(Queue* p_queue, int data);

//出列操作
int pop_queue(Queue* p_queue);

//遍历元素
void travel_queue(Queue* p_queue);

//测试代码
int main(void)
{
	Queue* p_queue = create_queue();
	int arr[] = {1, 22, 333, 4444, 55555};
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		push_queue(p_queue, arr[i]);
	}
	printf("----\n");
	while (1 != is_empty(p_queue))
	{
		travel_queue(p_queue);
		printf("出列 %d\n", pop_queue(p_queue));
	}
	return 0;
}

//遍历元素
void travel_queue(Queue* p_queue)
{
	if (1 == is_empty(p_queue))
	{
		printf("queue is empty.\n");
		return;
	}
	Node *p_temp = p_queue->p_head;
	while(NULL != p_temp)
	{
		printf("%d ", p_temp->data);
		p_temp = p_temp->p_next;
	}
	printf("\n");
}

//出列操作
int pop_queue(Queue* p_queue)
{
	if (1 == is_empty(p_queue))
	{
		return -1;
	}
	int temp = p_queue->p_head->data;
	//判断是不是只有一个元素,如果只有一个元素,队尾指针必须回复成空指针
	if (p_queue->p_head == p_queue->p_cur)
	{
		p_queue->p_cur = NULL;
	}
	Node *p_temp = p_queue->p_head;
	p_queue->p_head = p_queue->p_head->p_next;
	//释放弹出的元素空间
	free(p_temp);
	p_queue->size--;
	return temp;
}

//判空
int is_empty(Queue* p_queue)
{
	return 0 == p_queue->size;
}

//判满
int is_full(Queue* p_queue)
{
	return 0;	
}

//入队操作
void push_queue(Queue* p_queue, int data)
{
	Node* p_node = create_node(data);
	//对列为空,头指针和末尾指针同时指向刚添加的元素
	if (1 == is_empty(p_queue))
	{
		p_queue->p_head = p_node;
		p_queue->p_cur = p_node;
		p_queue->size++;
		return;
	}
	//队列不为空,直接添加到队列末尾
	p_queue->p_cur->p_next = p_node;
	//把队列中记录首尾元素的指针指向新的首尾元素
	p_queue->p_cur = p_node;
	p_queue->size++;
}

//创建一个队列
Queue* create_queue(void)
{
	Queue* p_queue = (Queue*)malloc(sizeof(Queue));
	p_queue->size = 0;
	p_queue->p_head = NULL;
	p_queue->p_cur = NULL;
	return p_queue;
}

//创建一个节点
Node* create_node(int data)
{
	Node* p_node = (Node*)malloc(sizeof(Node));
	p_node->p_next = NULL;
	p_node->data = data;
	return p_node;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值