链式队列的操作实现

操作实现结果:

一、运行后的效果:

二、入列:

三、出列:

四、取队头元素:

代码:

/**
*程序是链式的队列的代码
*/



#include <iostream>
#include <malloc.h>
#include <math.h>
using namespace std;
typedef int DataType;//定义DataType 为整型

/**
*创建链式队列的节点的结构体的定义如下
*
*/
typedef struct qnode{
DataType data;
struct qnode *next;
}LQNode;
/**
*为了方便把链式队列的头指针和尾指针定义成结构体
*/
typedef struct {
LQNode *front;
LQNode *rear;
}LQueue;
//初始化
void QueueInitiate(LQueue *q){
q->rear = NULL;
q->front = NULL;
}
//判断非空
int QueueNotEmpty(LQueue *q){
if(q->front== NULL){
return 0;
}else {
return 1;
}

}
/**
*
*入列
*/
int QueueAppend(LQueue *q,DataType x){
LQNode *p;
/**
*判断是否成功申请空间
*
*/
if(p != NULL){
free(p);
p =NULL;
}
p = (LQNode *)malloc(sizeof(LQNode));
if(p !=NULL){
cout<<"申请空间成功!"<<endl;
}else{
cout<<"内存空间不足!"<<endl;
return 0;
}
p->data = x;
p->next = NULL;//到此已经成功的创建了一个新的节点
/**
*将新的节点插入队列的末尾
*
*/
if(q->rear != NULL){
q->rear->next = p;
q->rear = p;
}
if(q->front == NULL){
q->rear = p;
q->front = p;
}
cout<<"成功的入列!"<<endl;
}
//出队列
int QueueDelete(LQueue *q,DataType *d){
LQNode *p;
/**
*判断内存中是否有数据,有就输出,没有返回0
*
*/
if(q->front == NULL){
cout<<"此时队列中无元素出列!"<<endl;
return 0;
}else{
*d = q->front->data;
p = q->front;
q->front= q->front->next;
if(q->front == NULL){
q->rear = NULL;
}
free(p);//释放节点内存空间
return 1;
}

}
//取队头元素
int QueueGet(LQueue *q,DataType *d){
if(q->front == NULL){
cout<<"队列已空,没有队头元素"<<endl;
return 0;
}else {
*d = q->front->data;//获取队头元素
return 1;
}
}
//撤销动态申请的空间
void Destroy(LQueue *q){
LQNode *p,*p1;
/**
*撤销链式队列所占的内存空间
*
*/
p = q->front;
while(p != NULL){
p1 =p;
p = p->next;
free(p1);
}
}
void menu(){
cout<<"_________________________________________________________"<<endl;
cout<<"|*******************************************************|"<<endl;
cout<<"|*****************欢迎进入菜单选项*.********************|"<<endl;
cout<<"|*****************进入初始化阶段请稍后....**************|"<<endl;
cout<<"|*****************1、入列 ***************|"<<endl;
cout<<"|*****************2、出列 ***************|"<<endl;
cout<<"|*****************3、取队头元素 ***************|"<<endl;
cout<<"|*******************************************************|"<<endl;
cout<<"_________________________________________________________"<<endl;
}
/**
*菜单项的操作
*以及一些循环操作的实现
*/
void operation(LQueue *q){
int input;
int num;
int a,i =0;
char c;
menu();
cout<<"请选择:";cin>>input;
switch(input){
case 1:
//cout<<"请输入要入列的数:";
while(c!=NULL || c != 'n'){
cout<<"请输入要入列的数:";cin>>num;
QueueAppend(q,num);
cout<<"是否继续输入:Y/N"<<endl;
cin>>c;
if(c == 'Y'||c == 'y'){
continue;
}
else if(c == 'N'||c =='n'){
break;
}else{
while(c !='n'||c != 'N'){
cout<<"输入参数不合法!请重新输入!"<<endl;
cin>>c;
if(c == 'n'||c =='N'){
cout<<"跳转成功!"<<endl;
break;
}
}
break;
}

}
operation(q);break;
case 2:
while(c!=NULL|| c != 'n'){
if(QueueDelete(q,&a)==0){
cout<<"你可入列操作!"<<endl;
}else{
cout<<"第"<<++i<<"个出队列元素:"<<a<<endl;
}
cout<<"是否继续出:Y/N"<<endl;
cin>>c;
if(c == 'Y'||c == 'y'){
continue;
}else if(c == 'N'||c =='n'){
break;
}else{
while(c !='n'||c != 'N'){
cout<<"输入参数不合法!请重新输入!"<<endl;
cin>>c;
if(c == 'n'||c =='N'){
cout<<"跳转成功!"<<endl;
break;
}
}
break;
}

}
operation(q);break;
case 3:
if(QueueGet(q,&a) ==1){
cout<<"头数据元素:"<<a<<endl;
cout<<"取头数据元素成功!"<<endl;
}
operation(q);
break;

}

}

int main(){
LQueue *q;
q = (LQueue *)malloc(sizeof(LQueue));
QueueInitiate(q);
QueueNotEmpty(q);
operation(q);
Destroy(q);
return 0;
}

原文地址:https://www.cnblogs.com/qpxv/p/3758889.html