数据结构-链队列-基本操作
队列定义: 只能在表的一端进行插入操作,在表的另一端进行删除操作的线性表。
逻辑结构: 与线性表相同,任然为一对一关系。
运算规则: 只能在对尾或者对手进行运算,且访问节点是依照先进先出的规则。
基本操作:
Status InitQueue(LinkQueue &Q)//构造一个空的队列
void OutputQueue(LinkQueue &Q)//输出队列中的数据元素
Status EnQueue(LinkQueue &Q,QElemType e)//在队尾插入元素e,e成为新的队尾元素
Status DeQueue(LinkQueue &Q,QElemType e)//若队列不为空,则删除对位元素,用e返回其值
Status LengthQueue(LinkQueue &Q)//返回队列中元素的个数
Status ClearQueue(LinkQueue &Q)// 清空队列
Status DestoryQueue(LinkQueue &Q)//销毁一个队列
QueueTest.cpp
/*项目名: Queue
*文件名: QueueTest.cpp
*创建者: YJY
*创建时间:2021-04-08
*描述: 链队列
*/
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW 0
#define ERROR 0
typedef int QElemType ;
typedef int Status ;
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 = (QueuePtr)malloc(sizeof(QNode));
if(!Q.front){
exit(OVERFLOW);
}
Q.front->next = NULL;
return OK;
}
void OutputQueue(LinkQueue &Q){
QueuePtr p;
p = Q.front->next;
do{
printf("%d ",p->data);
p=p->next;
}while(p);
printf("\n");
}
//插入元素
Status EnQueue(LinkQueue &Q,QElemType e){
// 插入元素e,成为新的队尾元素
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));//创建一个新结点
if(!p){//如果内存分配不成功
exit(OVERFLOW);
}
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQueue(LinkQueue &Q,QElemType e){
QueuePtr p;
//若队列不为空,则删除对位元素,用e返回其值,并返回OK,否则返回error
if(Q.front == Q.rear){
printf("队列已为空,无法删除!");
return ERROR;
}else{
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.front == p){
Q.rear = Q.front;
}
free(p);
}
return e;
}
//返回队列中元素的个数
Status LengthQueue(LinkQueue &Q){
QueuePtr p;
int i = 0;
p = Q.front->next;
while(p){
++i;
p = p->next;
}
return i;
}
//清空队列
Status ClearQueue(LinkQueue &Q){
QueuePtr p;
while( Q.front->next->next ){
Q.front->next = Q.front->next->next;
free(Q.front);
}
free(Q.front->next);
Q.front->next = NULL;
Q.rear = Q.front;
return OK;
}
//销毁一个队列Q,Q不在存在
Status DestoryQueue(LinkQueue &Q){
while(Q.front){
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
if(!Q.rear){
free(Q.rear);
}
}
free(Q.rear);
return OK;
}
Status main(){
LinkQueue Q;
QElemType e;
int length,xuan,n,i;
InitQueue(Q);
printf("请输入将要建立队列的元素个数: ");
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("请输入第%d个元素:",i);
scanf("%d",&e);
EnQueue(Q,e);
}
printf("输出队列:");
OutputQueue(Q);
printf("\n\n");
while(1){
printf(" 链队列操作 \n");
printf(" ***************************************\n");
printf(" 1-----------入队 \n");
printf(" 2-----------出队 \n");
printf(" 3-----------队列长度 \n");
printf(" 4-----------清空队列 \n");
printf(" 5-----------销毁队列 \n");
printf(" 0-----------退出队列 \n");
printf(" **************************************\n");
printf(" 请输入你的选择(0--5):");
scanf("%d",&xuan);
if(xuan == 1){
printf("\n请在队尾插入一个元素:");
scanf("%d",&e);
EnQueue(Q,e);
printf("输出队列:");
OutputQueue(Q);
printf("\n\n");
}
if(xuan == 2){
printf("\n删除队列中的元素:\n");
printf("删除成功!%d\n",DeQueue(Q,e));
printf("输出队列:");
OutputQueue(Q);
printf("\n\n");
}
if(xuan == 3){
length = LengthQueue(Q);
printf("\n输出队列长度为:%d",length);
printf("\n\n");
}
if(xuan == 4){
printf("清空队列!");
ClearQueue(Q);
printf("队列已清空");
printf("\n\n");
}
if(xuan == 5){
printf("销毁这个队列:");
DestoryQueue(Q);
printf("队列已经销毁!");
printf("\n\n");
}
if(xuan == 0){
break;
}
}
printf("\n\n\n");
return OK;
}
运行截图
1.入队操作
2.出队操作
3.队列长度
4.清空队列
5.销毁队列
退出