链队列:用链表表示的队列。
一个链队列需要两个分别表示队头和队尾的指针,为了方便在我们给链队列加入一个头指针 并且头指针指向头结点。
#include<iostream>
#include<cstdio>
#define false 0
#define ok 1
using namespace std;
typedef struct qnode{
int data;
struct qnode *next;
}qnode,*qnodeptr;
typedef struct{
qnodeptr front;
qnodeptr rear;
}linkqueue;
//销毁队列 注意:销毁队列需要删除头结点
void destroyqueue(linkqueue &q){
while(q.front){
q.rear=q.front->next;
free(q.front);
q.front=q.rear;
}
}
//清空队列。注意:清空队列不需要删除头结点,但是需要将头结点进行置0操作
void clearqueue(linkqueue &q){
q.rear=q.front->next;//让头指针指向第一个值
while(q.rear){
q.front->next=q.rear->next;//更新头结点指向的地方
free(q.rear);//释放内存
q.rear=q.front->next;//更新队尾的位置
}
}
//建立一个空的队列
int initqueue(linkqueue &q){
q.front=q.rear=(qnodeptr)malloc(sizeof(qnode));
if(!q.front){
return false;
}
q.front->next=NULL;
return ok;
}
//向队列中输入元素
void cin_queue(linkqueue &q,int n){
for(int i=1;i<=n;i++){
q.rear=(qnodeptr)malloc(sizeof(qnode));
cin>>q.rear->data;//输入数据
q.front->next=q.rear;//将数据插入到队头的后面
q.rear=q.rear->next;
}
}
//输出队列中现有的元素
void cout_queue(linkqueue &q){
while(q.front->data!=0){
cout<<q.front->data<<" ";
q.front=q.front->next;
}
cout<<endl;
}
//向队尾添加元素
int enqueue(linkqueue &p,int e){
qnodeptr q;
q=(qnodeptr)malloc(sizeof(qnode));
if(!q){
return false;
}
q->data=e;
q->next=NULL;
p.rear->next=q;//让他的下一个为q
p.rear=q;//然后q当最后一个
return ok;
}
//删除队头元素
int dequeue(linkqueue &q,int &e){
if(q.front==q.rear){
return false;
}
qnodeptr p;
p=q.front->next;//指向队头元素。注意:q.front带有头结点
e=p->data;//输出队头元素的值
q.front->next=p->next;//更新队头元素的位置
return ok;
}
int main(int argc, char const *argv[]) {
linkqueue q;
int e=0;
cout<<endl;
initqueue(q);
cout<<endl;
cin_queue(q,3);
enqueue(q,11);
dequeue(q,e);
cout<<e<<endl;
cout_queue(q);
return 0;
}
注意:需要插入三个数据进行计算