数据结构:链式队列

1.设计思想:

我们可以设计出以上五种队列,但是基于时间复杂度,和空间复杂度的最优解,我们选择入队和出队均为O(1)的,也就是第五种

2.结构设计

typedef struct LPNode//数据节点
{
    int data;//数据
    struct LPNode* next;//后继指针
}LPNode;
typedef struct HNode//链式队列头节点
{    
    struct LPNode *front;//队头指针
    struct LPNode *rear;//队尾指针
}HNOde,*PLQueue;

3.链式队列的实现

//初始化
void InitQueue(PLQueue pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return;

	pq->front = NULL;
	pq->rear = NULL;
}

//往队列中入数据(入队操作)
bool Push(PLQueue pq, int val)
{
	assert(pq != NULL);
	if (pq == NULL)
		return false;
	LPNode* p = (LPNode*)malloc(sizeof(LPNode));
	assert(p != NULL);
	给p数据
	//p->data = val;
	//插入p(处理尾节点)
	//p->next = pq->front;
	//pq->front = p;
	处理队头节点
	//if (pq->rear == NULL)
	//{
	//	pq->rear = p;
	//}
	//return true;
	p->data = val;
	p->next = NULL;
	if (IsEmpty(pq))
	{
		pq->front = p;
		pq->rear = p;
	}
	else
	{
		pq->rear->next = p;//p插入队尾
		pq->rear = p;
	}
	return true;


}

//获取队头元素的值,但不删除
bool GetTop(PLQueue pq, int* rtval)
{
	assert(pq != NULL);
	if (pq == NULL)
		return false;
	if (IsEmpty(pq))
		return false;
	*rtval = pq->front->data;
	return true;
}

//获取队头元素的值,并且删除
bool  Pop(PLQueue pq, int* rtval)
{
	assert(pq != NULL);
	if (pq == NULL)
		return false;
	if (IsEmpty(pq))
		return false;

	*rtval = pq->front->data;
	LPNode* p = pq->front;
	pq->front = pq->front->next;
	free(p);

	if (pq->front == NULL)
		pq->rear = NULL;
	return true;
}

//判空
bool IsEmpty(PLQueue  pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return false;
	return pq->front == NULL;
}

//获取队列中有效数据的个数
int GetLength(PLQueue pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return -1;
	int count = 0;
	for (LPNode* p = pq->front;p!=NULL; p = p->next)
	{
		count++;
		/*if (p == pq->rear)
			break;*/
	}
	return count;
}

//清空所有的数据
void Clear(PLQueue  pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return;
	pq->front = NULL;
	pq->rear = NULL;
}

//销毁
void Destroy(PLQueue  pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return;
	LPNode* p = pq->front;
	free(p);
	p = p->next;
}

void Show(PLQueue pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return;
	for (LPNode* p = pq->front;p!=NULL; p = p->next)
	{
		printf("%d ", p->data);
		/*if (p == pq->rear)
			break;*/
	}
	printf("\n");
}

4.总结

1.带头结点,队头为第一个数据节点,队尾在最后一个数据节点

2.头结点为一个队头指针,一个队尾指针,增加队尾指针可以让入队时间复杂度为O(1) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值