给头部指针新添加一个指针域指向尾部节点,这样头尾都可以在O(1)时间复杂度里访问。
用这样的代码改造单链表的结构体设计 会使得下面都出现一个新添加的指针域 如图所示。(只在头结点出现即可)
头文件 链式队列 lqueue.h
#pragma once
typedef int ELEM_TYPE;
typedef struct Node
{
ELEM_TYPE data;//数据域
struct Node *next;//指针域
}Node, *PNode;
//我们对头结点重新设计其结构体
typedef struct Head
{
struct Node *front;//一直指向第一个节点
struct Node *rear;//一直指向最后一个节点
//int length;//如果需要频繁获取队列的有效长度,可以加上length
}Head, *PHead;
//初始化
void Init_lqueue(PHead pq);
//入队
bool Push(PHead pq, ELEM_TYPE val);
//出队
bool Pop(PHead pq, int *rtval);
//获取队列顶部元素
bool Top(PHead pq, int *rtval);
//获取其有效长度个数
int Get_length(PHead pq);
//判空
bool IsEmpty(PHead pq);
判满 不需要判满
//bool IsFull(PHead pq);
//清空
void Clear(PHead pq);
//销毁
void Destroy(PHead pq);
void Show(PHead pq);
lqueue.cpp
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include "Lstack.h"
//作业:补全代码
//初始化
void Init_stack(PLStack ps)
{
ps->next = NULL;
}
//入栈(或者叫压栈 push) 头插
bool Push(PLStack ps, ELEM_TYPE val)
{
assert(ps != nullptr);
LStack* pnewnode = (LStack*)malloc(sizeof(LStack*) * 1);
assert(pnewnode != nullptr);
pnewnode->data = val;
pnewnode->next = ps->next;
ps->next = pnewnode;
return true;
}
//出栈 尾删(或者叫弹栈 pop(获取顶部数据,并且删除))//rtval是一个输出参数(C语言讲到)
bool Pop(PLStack ps, ELEM_TYPE* rtval)
{
assert(ps != nullptr);
LStack* p = ps;
for (p; p->next->next != NULL; p = p->next);
*rtval = p->next->data;
LStack* q = p->next;
p->next = q->next;
//free(q);
q = nullptr;
return true;
}
//获取顶部元素值 top(获取顶部数据)
bool Top(PLStack ps, ELEM_TYPE* rtval)
{
assert(ps != nullptr);
LStack* p = ps;
for (p; p->next != nullptr; p = p->next);//让p跑完指向最后一个节点
*rtval = p->data;
return true;
}
//获取其有效数据个数
int Get_length(PLStack ps)
{
assert(ps != nullptr);
int count = 0;
for (LStack* p = ps; p->next != nullptr; p = p->next)
{
count++;
}
return count;
}
//清空 一间房住了一户人 清空相当于把人赶出去
void Clear(PLStack ps)
{
Destroy(ps);
}
//销毁 一间房住了一户人 销毁相当于把人赶出去还把房烧了
void Destroy(PLStack ps)
{
assert(ps != nullptr);
while (ps->next != nullptr)
{
LStack* p = ps->next;
ps->next = p->next;
//free(p);
}
ps->next = nullptr;
}
//打印
void Show(PLStack ps)
{
assert(ps != nullptr);
for (LStack* p = ps->next; p != nullptr; p = p->next)
{
printf("%d ", p->data);
}
printf("\n");
}