//2012年5月19日21:56:28
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct qnode
{
int data;
struct qnode * next;
}qnode,*queueptr; // 定义链队列的每个节点的数据结构
typedef struct linkqueue
{
queueptr front;
queueptr rear;
}linkqueue;
void initqueue(linkqueue *); //初始化队列
void dequeue(linkqueue *,int *); //删除队头元素 并返回删除的值
void enqueue(linkqueue *,int *); //在对尾插入元素
bool is_empty(linkqueue); //判断队列是否为空
void clearqueue(linkqueue *); // 清空队列
bool destroyqueue(linkqueue *); //销毁队列
int lenthqueue(linkqueue); // 队列长度
void traverse(linkqueue); //遍历队列
void main(void)
{
linkqueue q;
int i;
int val; //插入和删除的元素
while(1)
{ printf("初始化队列输入 1 \n");
printf("插入元素输入 2 \n");
printf("删除元素输入 3 \n");
printf("求队列长度输入 4 \n");
printf("遍历队列输入 5 \n");
scanf("%d",&i);
if(1==i)
{
initqueue(&q);
}
else if(2==i)
{
printf("输入要插入元素的值 \n");
scanf("%d",&val);
enqueue(&q,&val);
}
else if(3==i)
{
dequeue(&q,&val);
printf("删除的元素为 %d\n",val);
}
else if(4==i)
{
val=lenthqueue(q);
printf("当前队列长度为 %d \n",val);
}
else if(5==i)
{ printf("当前队列元素为 \n");
traverse(q);
printf("\n\n");
}
else
{
printf("输入有误 请重新输入 \n");
}
}
/* int val=10;
initqueue(&q);
enqueue(&q,&val);
traverse(q);
dequeue(&q,&val); */
}
void initqueue(linkqueue * q) //初始化队列
{
q->front=q->rear=(queueptr)malloc(sizeof(qnode));
if(NULL==q->front)
{
printf("初始化失败\n\n");
exit(-1);
}
q->front->next=NULL;
}
void enqueue(linkqueue * q,int * val) //在对尾插入元素
{
queueptr newptr=(queueptr)malloc(sizeof(qnode));
if(NULL==newptr)
{
printf("加入失败\n");
exit(-1);
}
newptr->data=*val;
newptr->next=NULL;
q->rear->next=newptr;
q->rear=newptr;
}
void dequeue(linkqueue * q,int * val) //删除队头元素 并返回删除的值
{ queueptr p;
if(q->front==q->rear)
{
printf("队列为空");
exit(-1);
}
p=q->front->next;
*val=p->data;
q->front->next=p->next;
if(q->rear==p)
q->front=q->rear; //如果队列中删除元素后为空则要进行初始化的处理
printf("删除的元素为 %d \n",*val);
free(p);
}
void traverse(linkqueue q) //遍历队列 从队尾开始遍历
{
if(is_empty(q))
{
printf("对列为空 \n");
exit(-1);
}
while(q.front->next!=NULL)
{
printf("%d ",q.front->next->data);
q.front=q.front->next;
}
//printf("\n\n");
}
bool is_empty(linkqueue q) //判断队列是否为空
{
if(q.rear==q.front)
{
return true;
}
else
return false;
}
void clearqueue(linkqueue * q) // 清空队列
{
q->front=q->rear;
}
bool destroyqueue(linkqueue * q) //销毁队列
{ queueptr p;
while(q->front!=q->rear)
{
p=q->front->next;
free(p);
p=q->front->next;
}
free(q->front);
free(q);
printf("队列已经销毁\n\n");
return true;
}
int lenthqueue(linkqueue q) // 队列长度
{
int i=0;
if(q.front==q.rear)
return 0;
while(q.front!=q.rear)
{
q.front=q.front->next;
i++;
}
return i;
}