个人认为普通队列的情况,我们必须把握头指针、尾指针、和头结点之间的关系,以及队列的特性,
我们就可以很好的理解队列的各种草走的流程了!至于代码,没有必须强求自己记下来,能知道哪些
问题应该来用队列来解决就可以了!参考代码http://wenku.baidu.com/view/1b1da2106c175f0e7cd13794(自己加了些注释)
自己利用画图工具来画的,美观不行!!
首先我们来理解初始的队列:(空队列)
2.元素 X 入队的情况:
3.元素 Y 进队的关键代码: p表示新分配的结点 ,Q表示 队列
p->data=e;
Q.rear->next=p;
Q.rear=p;
4.删除元素X(FIFO 先进先出)
参考代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef struct QNode
{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int InitQueue(LinkQueue &Q)
{
Q.rear=Q.front=(QueuePtr)malloc(sizeof(QNode));
if(!Q.rear)
exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
void QueueEmpty(LinkQueue Q)//判断队列是否为空
{
if(Q.front==Q.rear)
printf("该链队为空:");
else
printf("该链队不为空:");
}
void EnQueue(LinkQueue &Q,int e)//向队列中插入某元素
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
printf("error");
p->data=e;
Q.rear->next=p;//队尾元素的next指向插入的新元素
Q.rear=p;//尾指针指向插入的元素
printf("元素%d入队成功\n",e);
}
int EnnQueue(LinkQueue &Q,int e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
return ERROR;
p->data=e;
Q.rear->next=p;
Q.rear=p;
return OK;
}
void DeQueue(LinkQueue &Q)//删除队列的首元素
{
QueuePtr p;
if(Q.front==Q.rear)
printf("该链队为空");
p=Q.front->next;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
printf("队首元素删除成功");
}
void GetHead(LinkQueue &Q)//获取队首元素
{
QueuePtr p;
if(Q.front==Q.rear)
printf("该链队为空");
p=Q.front->next;
printf("队首元素为:%d",p->data);
}
void OutQueue(LinkQueue &Q)//输出队中的所有元素
{
QueuePtr p;
if(Q.front==Q.rear)
printf("该链队为空");
p=Q.front->next;
while(p!=Q.rear->next)
{
printf("%d",p->data);
p=p->next;
}
}
void LengthQueue(LinkQueue &Q)//查询队列的长度
{
int f=0;
QueuePtr p;
if(Q.front==Q.rear)
printf("该队列的长度是:%d",f);
else
{
p=Q.front->next;
while(p!=Q.rear->next)
{
p=p->next;
f++;
}
printf("该队列的长度是:%d",f);
}
}
int main()
{
system("cls");
int flag=1,i;
LinkQueue Q;
InitQueue(Q);
printf("************************链队列功能菜单***********************\n");
printf("1:初始化链队列, 2:判断链队列是否为空, 3:进入队列, 4:取出队首元素\n");
printf("5:输出该队列的所有元素,6:输出该队列的长度, 7:结束程序, 8:清屏\n");
while(flag)
{
printf("\n请输入操作符:");
scanf("%d",&i);
switch(i)
{
case 1:
int e,n,k;
printf("请输入队列的长度:");
scanf("%d",&n);
printf("请输入队列的元素:");
for(e=1;e<=n;e++)
{
scanf("%d",&k);
EnnQueue(Q,k);
}
printf("初始化链队成功");
break;
case 2:
QueueEmpty(Q);
break;
case 3:
int j;
printf("请输入要进入队列的元素");
scanf("%d",&j);
EnQueue(Q,j);
break;
case 4:
GetHead(Q);
break;
case 5:
printf("该队列的元素是:");
OutQueue(Q);
break;
case 6:
LengthQueue(Q);
break;
case 7:
flag=0;
break;
case 8:
system("cls");
break;
}
}
printf("程序结束");
return 0;
}