概述
感觉就是越写代码的完善都越高,bug出现的概率也就越小,这个所有的细节笔栈的链式写法更完善
有很多注释,你可以粘贴到dev自己看看
#include<iostream>//遵循先进先出的原则
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}node;
typedef struct ListQueue
{
node *front;
node *rear;
int len;
}ListQueue;
void menu(void);
void caidancaozuo(ListQueue &L);
void create(ListQueue &L);
void pankong(ListQueue &L);//判断是否是空的队列或者是队列压根不存在,但在实际的函数中最好把这段代码复制到其他函数而不是调用
void charu(ListQueue &L);//插入队列元素
void deletefrontnext(ListQueue &L);//删除队头元素
void clean(ListQueue &L); //链式存储结构的话,我个人认为,销毁和删除的中间无任何区别,主要在于最后头的区别
void destroyList(ListQueue &L);//这个建议你先写删除队头的函数,然后直接根据L.len调用删除对头的函数就好
void outfront(ListQueue L);//输出队列的队头元素
void outList(ListQueue L);//输出队列的元素
void outlen(ListQueue L);//输出队列的长度
int main(void)
{
ListQueue L;
menu();
caidancaozuo(L);
}
void menu(void)
{ //很经典的菜单形式
char a01[] = "(1)创建链队列";
char a02[] = "(2)判断队列是否为空";
char a03[] = "(3)插入队尾元素";
char a04[] = "(4)删除队头元素";
char a05[] = "(5)清空队列";
char a06[] = "(6)销毁队列";
char a07[] = "(7)输出队头元素";
char a08[] = "(8)输出队列中所有元素";
char a09[] = "(9)输出队列长度";
char a10[] = "(10)出入任意不在前面菜单的数字将结束程序";
printf("%-50s", a01);
printf("%-50sn", a02);
printf("%-50s", a03);
printf("%-50sn", a04);
printf("%-50s", a05);
printf("%-50sn", a06);
printf("%-50s", a07);
printf("%-50sn", a08);
printf("%-50s", a09);
printf("%-50sn", a10);
}
void caidancaozuo(ListQueue &L)//再次自我感觉良好觉得这个自我调用也不赖,放前边了
{
cout << "请问你想选择哪个指令" << endl;
int mingling;
cin >> mingling;
switch (mingling)
{
case 1:
{
create(L);
caidancaozuo(L);
break;
}
case 2:
{
pankong(L);
caidancaozuo(L);
break;
}
case 3:
{
charu(L);
caidancaozuo(L);
break;
}
case 4:
{
deletefrontnext(L);
caidancaozuo(L);
break;
}
case 5:
{
clean(L);
caidancaozuo(L);
break;
}
case 6:
{
destroyList(L);
caidancaozuo(L);
break;
}
case 7:
{
outfront(L);//输出队头元素
caidancaozuo(L);
break;
}
case 8:
{
outList(L);//输出队中所有的元素
caidancaozuo(L);
break;
}
case 9:
{
outlen(L);//输出队列的长度
caidancaozuo(L);
break;
}
default:
cout << "您已经决定退出此程序,程序即将退出" << endl;
break;
}
}
void create(ListQueue &L)
{
L.front=new node;
L.rear=L.front;
L.front->next=NULL;
L.len=0;
if(!L.front)
{
cout<<"不知神马原因未能成功创建此队列(马上去改)"<<endl;
return;
}
cout<<"已成功按照你的要求创建了一个队列"<<endl;
}
void pankong(ListQueue &L)
{
if(!L.front)
{
cout<<"您还未创建一个队列"<<endl;
return;
}
if(L.len==0)
{
cout<<"您的队列为空队列"<<endl;
return;
}
}
void charu(ListQueue &L)//虽然下面的函数没有按照上面的菜单啥的创建,但是我感觉,下面创建函数的步骤是挺符合逻辑的
{
if(!L.front)
{
cout<<"您还未创建一个队列"<<endl;
return;
}
cout<<"请输入一个数字:"<<endl;
int x;
cin>>x;
node *temp=new node;
temp->data=x;
temp->next=NULL;
L.rear->next=temp;
L.rear=temp;
L.len++;
//测试使用的,证明已经成功了cout<<"您刚刚输入的数字是"<<L.front->next->data<<endl;
}
void deletefrontnext(ListQueue &L)//删除队头元素
{
if(!L.front)
{
cout<<"您还未创建一个队列"<<endl;
return;
}
if(L.len==0)
{
cout<<"您的队列为空队列"<<endl;
return;
}
node *temp=L.front->next;
L.front->next=temp->next;
free(temp);
L.len--;
}
void clean(ListQueue &L) //链式存储结构的话,我个人认为,销毁和删除的中间无任何区别,主要在于最后头的区别
{
if(!L.front)
{
cout<<"您还未创建一个队列"<<endl;
return;
}
if(L.len==0)
{
cout<<"您的队列为空队列无需清除"<<endl;
return;
}
node *temp;
int a=L.len;//因为后面的L.len一直在发生变化,所以加一个这个玩意我感觉更好一点
for(int i=0;i<a;i++)
{
temp=L.front->next;
L.front->next=temp->next;
free(temp);
L.len--;
}
L.front->next=NULL;
L.rear=L.front;
cout<<"您要求的队列已被清空了"<<endl;
}
void destroyList(ListQueue &L)//这个建议你先写删除队头的函数,然后直接根据L.len调用删除对头的函数就好
{
if(!L.front)
{
cout<<"您还未创建一个队列"<<endl;
return;
}
node *temp;
int a=L.len;//因为后面的L.len一直在发生变化,所以加一个这个玩意我感觉更好一点
for(int i=0;i<a;i++)
{
temp=L.front->next;
L.front->next=temp->next;
free(temp);
L.len--;
}//你会发现这个销毁和清楚的部分在这部分的代码一模一样但是嗷,后边会有细微的小区别
free(L.front);
L.front=L.rear=NULL;
}
void outfront(ListQueue L)//输出队列的队头元素 非常的简单哈,就下面这三个函数
{
if(!L.front)
{
cout<<"您还未创建一个队列"<<endl;
return;
}
if(L.len==0)
{
cout<<"您的队列为空队列"<<endl;
return;
}
node *temp=L.front->next;
cout<<"您队头元素是"<<temp->data<<endl;
}
void outList(ListQueue L)//输出队列的元素
{
if(!L.front)
{
cout<<"您还未创建一个队列"<<endl;
return;
}
if(L.len==0)
{
cout<<"您的队列为空队列"<<endl;
return;
}
cout<<"您队列中所有的元素如下:"<<endl;
node *temp=new node;
temp=L.front->next;
for(int i=0;i<L.len;i++)
{
cout<<temp->data<<endl;
temp=temp->next;
}
}
void outlen(ListQueue L)
{
if(!L.front)
{
cout<<"您还未创建一个队列"<<endl;
return;
}
cout<<"您的队列的长度是"<<L.len<<endl;
}
最后
以上就是勤恳月饼为你收集整理的C/C++队列的链式实现的全部内容,希望文章能够帮你解决C/C++队列的链式实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复