我是靠谱客的博主 勤恳月饼,最近开发中收集的这篇文章主要介绍C/C++队列的链式实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

感觉就是越写代码的完善都越高,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++队列的链式实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(134)

评论列表共有 0 条评论

立即
投稿
返回
顶部