队列结构体
typedef struct QNode
{
Qelemtype data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
初始化队列
status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = new QNode;
Q.front->next = NULL;
return OK;
}
入队
status EnQueue(LinkQueue &Q,Qelemtype e)
{
QueuePtr P;
P= new QNode;
P->data = e;
P->next = NULL;
Q.rear->next = P;
Q.rear = P;
return OK;
}
出队
status DeQueue(LinkQueue &Q,Qelemtype &e)
{
if(Q.front == Q.rear) return ERROR;
QueuePtr p;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p) Q.rear = Q.front;
delete p;
return OK;
}
取队头
Qelemtype GetHead(LinkQueue Q)
{
if(Q.front!=Q.rear)
return Q.front->next->data;
else return ERROR;
}
取队尾
Qelemtype GetEnd(LinkQueue Q)
{
if(Q.front!=Q.rear)
return Q.rear->data;
else return ERROR;
}
输出队列
status scd(LinkQueue Q) //输出队列
{
if(Q.front == Q.rear) return ERROR;
cout<<"所有值为:"<<endl;
do
{
printf("%d ",Q.front->next->data);
if(Q.front->next == Q.rear) break; //要点
Q.front->next=Q.front->next->next;
}while(Q.front !=Q.rear);
return OK;
}
算队长
int duichang(LinkQueue Q)
{
if(Q.front == Q.rear) return ERROR;
int i = 1;
while(Q.front->next != Q.rear)
{
i++;
Q.front->next = Q.front->next->next;
return i;
}
}
清空队列
status qingkong(LinkQueue &Q) //清空队列
{
int e;
while(Q.front->next == Q.rear)
{
DeQueue(Q,e);
}
return OK;
}
菜单
status menu()
{
cout<<"***************"<<endl;
cout<<"1:入队"<<endl;
cout<<"2:出队"<<endl;
cout<<"3:取队头元素 "<<endl;
cout<<"4:取队尾元素 "<<endl;
cout<<"5:输出队列 "<<endl;
cout<<"6:队长"<<endl;
cout<<"7:清空队列"<<endl;
cout<<"8:退出"<<endl;
cout<<"***************"<<endl;
return OK;
}
主函数
int main()
{
int a,e,b;
LinkQueue Q;
InitQueue(Q);
do
{
menu();
cout<<"请输入您要进行的操作"<<endl;
cin>>a;
switch (a)
{
case 1: cout<<"请输入您想要入队的值"<<endl;
cin>>e;
EnQueue(Q,e); break;
case 2: DeQueue(Q,e); break;
case 3: if(Q.front == Q.rear)
{
cout<<"队列为空"<<endl;
}
else
{
b = GetHead(Q);
cout<<"队头是"<<b<<endl;
}
break;
case 4: if(Q.front == Q.rear)
{
cout<<"队列为空"<<endl;
}
else
{
b = GetEnd(Q);
cout<<"队尾是"<<b<<endl;
}
break;
case 5: if(Q.front == Q.rear)
{
cout<<"队列为空"<<endl;
}
else
{
scd(Q);
}
break;
case 6: if(Q.front == Q.rear)
{
cout<<"队列为空"<<endl;
}
else
{
b = duichang(Q);
cout<<"队长是"<<b<<endl;
}
break;
case 7: qingkong(Q);
scd(Q); break;
case 8: break;
default :cout<<"输入序号错误"<<endl;
}
}while(a != 8);
return 0;
}
要点
/* .
结构体中的front和rear是指针
链接关系的改变只能用有关next的式子表示
Q.front为空节点 Q.front->next才是第一个元素
左边队头右边队尾 节点连接顺序从左到右 节点出队入队顺序从右到左
结构体分为:节点结构体 节点QNode 节点指针QueuePtr、队列结构体 队列LinkQueue。
队尾入队EnQueue 建节点,插节点。
队头出队DeQueue 判空 1.保存节点元素地址 2.保存节点元素值 3.修改链接关系 123可为(节点操作)
如果后一个节点是尾节点 尾指针与头指针相同 if(Q.rear == P) Q.rear = Q.front; 释放节点
*/