队列是先进先出的线性表,在队尾插入元素,在队头删除元素
以下代码实现了构造空队列、销毁队列、队尾插入元素、对头删除元素功能
#include <stdio.h>
#include <stdlib.h>
#define QElemType int
#define OK 1
#define ERROR 0
/********队列的链式存储结构********/
//设置链表结点
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr Front; //队头指针
QueuePtr Rear; //队尾指针
}LinkQueue;
/***********构造队列************/
int InitQueue(LinkQueue &Q)
{
//构造一个空队列
Q.Front = (QueuePtr)malloc(sizeof(QNode));
if(!Q.Front) //存储分配失败
return ERROR;
Q.Rear = Q.Front;
Q.Front->next = NULL;
Q.Rear->next = NULL;
return OK;
}
/************队尾插入元素***********/
int EnQueue(LinkQueue &Q,QElemType e)
{
//插入元素e为Q的队尾元素
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
return ERROR;
p->data = e;
p->next = NULL;
Q.Rear->next = p;
Q.Rear = p;
return OK;
}
/***********删除元素**********/
int DeQueue(LinkQueue &Q,QElemType &e)
{
//若队列不为空,删除对头元素,用e返回其值,为空则返回ERROR
QueuePtr p;
if(Q.Front == Q.Rear)
return ERROR;
p = Q.Front->next; //设置一个中间变量p
e = p->data;
Q.Front->next = p->next;
if(Q.Rear == p) //判断删除后队列是否为空
Q.Rear = Q.Front;
free(p);
return OK;
}
/***********销毁队列***********/
int DestroyQueue(LinkQueue &Q)
{
//销毁队列Q
while(Q.Front)
{
Q.Rear = Q.Front->next;
free(Q.Front);
Q.Front = Q.Rear;
}
return OK;
}
/********输出队列信息********/
void PrintQueue(LinkQueue &Q)
{
QueuePtr q;
q = Q.Front->next;
while(q != Q.Rear)
{
printf("%d ",q->data);
q = q->next;
}
printf("%d\n\n",q->data);
}
int main()
{
LinkQueue Queue;
int sum,num,i;
/*********构造队列实现*********/
if(InitQueue(Queue))
{
/**********队尾插入数据**********/
printf("请输入数据的个数:");
scanf("%d",&sum);
for(i = 1;i <= sum;i++)
{
printf("请输入第%d个数:",i);
scanf("%d",&num);
EnQueue(Queue,num);
}
printf("队列元素为:\n");
PrintQueue(Queue);
/**********删除元素**********/
DeQueue(Queue,num);
printf("删除的元素为:%d\n",num);
printf("删除后队列内的元素为:\n");
PrintQueue(Queue);
/*********队尾插入元素*********/
printf("请输入插入的元素值:");
scanf("%d",&num);
EnQueue(Queue,num);
printf("插入队列后元素的值:\n");
PrintQueue(Queue);
/***********销毁队列************/
if(DestroyQueue(Queue))
{
printf("销毁队列成功!\n");
}
}else
{
printf("构造队列失败!\n");
}
return 0;
}