#include <iostream>
using namespace std;
int main()
{
/*队列的实现不同于栈,根据队列自身的特点,
单链表是最适合用于队列的,
因为如果是数组实现队列,
在队列进行“头出”的时候需要整体元素向前移动,
造成效率较低。*/
typedef int QueueDataType;
typedef struct QueueNode
{
QueueDataType data;
struct QueueNode *next;
}QueueNode;
/*注意:
因为这是单链表,
如果想要获得尾指针就得从头指针开始遍历,
而队列不像单链表一样需要遍历整个链表,
它的整体操作均与队头,队尾有关,
所以我们可以将这二者(头指针,尾指针)进行封装,
需要时直接访问,
而无需多次遍历。*/
typedef struct Queue
{
struct Queue *head;//定义一个头指针
struct Queue *tail;//定义一个尾指针
}Queue;
//初始化队列:
void QueueInit(Queue *q)//注意这里形参的类型是Queue而不是QueueNode
{
assert(p);
q->head = NULL;
q->tail = NULL;
}
//入队列操作函数:
void QueuePush(Queue *p,QueueDataType x)
{
assert(p);
QueueNode *newnode = (QueueNode *)malloc(sizeof(QueueNode));
if (newnode == NULL)
{
cout << "malloc is fail" << endl;
exit(-1);
}
//先将新结点内的值根据题目要求赋值
newnode->data = x;
newnode->next = NULL;
//入队列的操作要考虑此时的单链表是否为空表
if (p->tail == NULL)
{
p->head = p->tail = newnode;
}
else
{
p->tail->next = newnode;//如果不进行判空,则指针p去访问NULL则会使程序无法运行
p->tail = newnode;
}
}
//出队列操作函数:
/*出队列操作必须要求链表非空*/
void QueuePop(Queue *p)
{
assert(p);
assert(!QueueEmpty(p));
QueueNode *tmp = p->head; /*这部分代码无需对结点个数大于1个进行判断,
因为当结点个数为1时,
这部分代码的 p->head 即为 NULL*/
p->head = tmp->next;//如果队列为空表,此时就是对NULL进行解引用,则会造成程序崩溃
free(tmp);
tmp = NULL;
}
//取出队头的数据:
QueueDataType QueueFront(Queue *p)
{
assert(p);
assert(!QueueEmpty(p));//取队头数据的前提是链表非空
return p->head->data;//如果队列为空表,此时就是对NULL进行解引用,则会造成程序崩溃
}
//取出队尾的数据:
QueueDataType QueueBack(Queue *p)
{
assert(p);
assert(!QueueEmpty(p));//同理,取队尾数据的前提也是链表非空
return p->tail->data;//如果队列为空表,此时就是对NULL进行解引用,则会造成程序崩溃
}
//判断队列是否为空
bool QueueEmpty(Queue *p)
{
assert(p);
return p->head == NULL;//判断第一个结点的地址是否为NULL
}
//获取队列中结点的个数
int QueueSize(Queue *p)
{
int num = 0;
QueueNode *cur = p->head;
//while (cur != p->tail)//该行代码是错误的,因为它不能完整的进行遍历
while (cur != NULL)
{
num++;
cur = cur->next;
}
return num;
}
//队列的销毁
void QueueDestroy(Queue *p)
{
assert(p);
QueueNode *cur = p->head;
while (cur)
{
QueueNode *tmp = cur->next;
free(cur);
cur = tmp;
}
//不要忘了最后要将头指针与尾指针全部置为 NULL
p->head = p->tail = NULL;
}
}
【数据结构】队列的 增,删,查,改 的实现
最新推荐文章于 2023-03-10 15:06:26 发布