定义和结构
#include#include #include #include #include #include #define MAXSIZE 100 #define ElemType int #define Status int enum TF{ERROR,OK}; using namespace std; typedef struct QNode { ElemType 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 DestroyQueue(linkQueue &Q)
{
if(Q.front==Q.rear) //队列是否为空条件
{
printf("队空!n");
return ERROR;
}
Q.front=Q.rear;
printf("队列已销毁!n");
return OK;
}
Status ClearQueue(linkQueue &Q)
{
if(Q.front==Q.rear) //队列是否为空条件
{
printf("队空!n");
return ERROR;
}
Q.front=Q.rear;
printf("队列已清空!n");
return OK;
}
判断队空
bool QueueEmpty(linkQueue Q)
{
if(Q.front==Q.rear) return true;
return false;
}
求队列长度
int QueueLength(linkQueue Q) //有问题
//躺了,直接用循环求
{
int i=0;
QNode *p=Q.front->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
入队
Status EnQueue(linkQueue &Q,ElemType e)
{
QNode *p=new QNode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
出队
Status DeQueue(linkQueue &Q,ElemType &e)
{
if(Q.front==Q.rear)
{
printf("队空!n");
return ERROR;
}
QNode *p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
//重头
if(Q.rear==p) //删除的是队列的最后一个节点
{
Q.rear=Q.front;
}
return OK;
}
取对头元素
Status GetHead(linkQueue Q,ElemType &e)
{
if(Q.front==Q.rear)
{
printf("队空!n");
exit(0); //直接停止
}
e=Q.front->next->data;
return OK;
}
遍历元素/打印元素
Status QueueTraverse(linkQueue &Q)
{
if(Q.front==Q.rear)
{
printf("队空!n");
exit(0);
}
printf("队列元素:");
QNode *p=Q.front->next;
while(p)//while(p!=Q.rear)
{
printf("%d ",p->data);
p=p->next;
}
printf("n");
return OK;
}
void Print(linkQueue Q)
{
if(Q.front==Q.rear)
{
printf("队空!n");
}
QNode *p=Q.front->next;
//也可以p=new QNode; p=Q.front->next; 只是创建的那个新节点不被利用,浪费了一块空间
while(p)//while(p!=Q.rear->next)
{
printf("%d ",p->data);
p=p->next;
}
printf("n");
}
菜单
void menu()
{
printf("********1.入队 2.出队*********n");
printf("********3.取队顶 4.清空队*******n");
printf("********5.遍历 6.销毁*********n");
printf("********7.队长度 8.退出*********n");
}
以下为功能函数
void enqueue(linkQueue &Q)
{
int n;
ElemType e;
int flag;
printf("请输入入队元素个数(>=1):");
scanf("%d",&n);
for(int i=0;i
主函数
int main()
{
linkQueue Q;
InitQueue(Q);
int choice;
while(1)
{
menu();
printf("请输入菜单号:");
scanf("%d",&choice);
if(choice==8) break;
switch(choice)
{
case 1:enqueue(Q);break;
case 2:dequeue(Q);break;
case 3:gethead(Q);break;
case 4:ClearQueue(Q);break;
case 5:QueueTraverse(Q);break;
case 6:DestroyQueue(Q);break;
case 7:queuelength(Q);break;
default:printf("输入错误!");
}
}
return 0;
}
运行截图



