队列
队列也是一种受限的线性结构,只能在头出,尾进,如下图为其存储模式,一定要将指针方向搞明白了,因为出队是在队头操作,出队后我们需要明白下一个是谁就必须知道出队前下一个是谁,这样来看就是队头指向队尾了,而头结点还是只是一个特殊结点,无具体的data
具体代码实现
有特殊需要可自行修改
#include<bits/stdc++.h>
using namespace std;
typedef struct Linknode { //定义队列结点
int data;
struct Linknode* next;
}Linknode;
typedef struct Linkqueue { //队列
Linknode* front, * rear; //队列的头指针和尾指针,注意和双链表区别开,这里front和rear是单独的
}Linkqueue;
void Initqueue(Linkqueue& Q) //初始化
{
Q.front = Q.rear = (Linknode*)malloc(sizeof(Linknode));
Q.front->next = NULL;
}
bool Emptyqueue(Linkqueue Q)//判空
{
if (Q.front == Q.rear)
return true;
return false;
}
bool Push(Linkqueue& Q, int e) //入队,对rear操作,理解为入队肯定是在队伍尾端进入
{
Linknode* p = (Linknode*)malloc(sizeof(Linknode));
if (!p)
return false;//分配空间错误!内存不足
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return true;
}
bool Pop(Linkqueue& Q, int& e) //出队,对于front操作
{
if (Emptyqueue(Q) == 1)
return false;
Linknode* p = (Linknode*)malloc(sizeof(Linknode)); //p结点用来释放结点空间
p = Q.front->next;
e = p->data;
Q.front ->next= p->next;
free(p);
return true;
}
void Printqueue(Linkqueue Q)
{
if (Emptyqueue(Q) == 1)
cout << "队列为空!" << endl;
else
{
Linknode*p=Q.front->next; //跳过头结点
while (p!=NULL)
{
cout << p->data << " "; //遵循队列先进先出原则输出
p = p->next;
}
cout << endl;
}
}
int main()
{
Linkqueue Q;
Initqueue(Q);
Push(Q, 1);
Push(Q, 2);
Push(Q, 3);
Printqueue(Q);
int e = 0;
Pop(Q, e);
cout << "出队一次的数据为:" << e << endl;
Printqueue(Q);
return 0;
}