江城一子 2021-05-16 19:07 采纳率: 0%
浏览 52

数据结构:在VS2019上实现二叉树的创建、递归遍历等,以及根据输入数字来决定执行程序(非一次性)

我的问题有:(VS2019上,C++)

  1. 使用while循环语句后,通过Switch开关来选择自己想要执行的程序,但是输入一个合乎规则的数字后,程序直接结束了,即一次性程序;
  2. 使用system(“pause”)后,执行没有暂停,会一直进行下去,也尝试过cin.ignore(),getchar(),但是都没有达到我想要的结果。
  3. 在循环内使用cin.ignore()后,虽然执行暂停了,但是选择代码块后,结果只有一种,即便多次输入也无济于事,如图:
标题

 我的目的是:

  1. 程序可以由自己输入的数字来决定其执行语句,且没有遇到自己设置的停止符号(如代码中的数字“0”),程序便不会结束。

 当然,鄙人学识有限,可能有描述不到位的地方,望各位大神能帮我指出来,在此,感激不尽!!!

鄙人所写代码如下:(其中有些内容是他人所提供的,就main函数是自己写的,如有侵权还请告知)

// 先序遍历的递归算法
#include<iostream>
#include <stdlib.h>
// #include<conio.h>

using namespace std;
typedef struct BiNode{				//二叉链表定义
	char data;
	struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;

//用先序遍历的顺序建立二叉链表
void CreateBiTree(BiTree &T){	
	//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			//递归结束,建空树
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								//else
}									//CreateBiTree

void PreOrderTraverse(BiTree T){
	// 先序遍历二叉树T的递归算法
	if(T==NULL);			//  空二叉树
	else{
		cout<<T -> data;			//  访问根结点
		PreOrderTraverse(T -> lchild);	// 递归遍历左子树
		PreOrderTraverse(T -> rchild);	// 递归遍历右子树
	} 
 } 
void InOrderTraverse(BiTree T){  
	//中序遍历二叉树T的递归算法
	if(T){
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}
void PostOrderTraverse(BiTree T){
	// 后序遍历二叉树T的递归运算 
	if(T==NULL);			//  空二叉树
	else{
		PostOrderTraverse(T -> lchild);	// 递归遍历左子树
		PostOrderTraverse(T -> rchild); // 递归遍历右子树 
		cout << T->data ;				// 访问根结点 
	}
}
int NodeCount(BiTree T){
	// 计算二叉树结点总数 
	if(T == NULL ) return 0;  			    
	else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;	
	//  结点个数为左子树的结点个数+右子树的结点个数再+1
} 


int main(){
	BiTree tree;
	cout<<"\n 请输入建立二叉链表的序列:"<<endl;		//Inputing instance : A B C # # D E # G # # F # # #
	CreateBiTree(tree);
	// cout << "-------------------------------------" << endl;
	cout << "-----------------------------------------------\n 请输入下列内容对应数字,"
    "来选择您想执行的程序:\n-----------------------------------------------"
		"\n 0:退出程序 \n 1:先序遍历 \n 2:中序遍历 \n 3:后序遍历 \n 4:二叉树结点总数 " 
		"\n -----------------------------------------------" << endl;	   // 输入内容提示
	int num;		// 定义变量,
	cin >> num;		// 然后将键盘输入数字赋值给它
	while (num) {
		if (isdigit(num)) {    // 此处isdigit()用法有点迷惑,跟我网上查找的有点不一样
			cout << "\n 输入为非数字类型,请从上述列表你想进行的功能对应数字序列选择合适数"
                    "字进行输入!!!\n " << endl;
			break;
		}
		else {	// 首先判断输入是否在规定的范围内,然后再执行Switch开关语句
			if (0 <= num && num <= 4) {
				switch (num) {            
                // Switch开关,和系统暂停配合用来多次选择执行输入的数字所代表的的程序
				case 0:
					cout << "\n 0,退出程序" << endl; exit(0);  break;

				case 1: {
					cout << "\n 1,先序遍历的结果为:";
					PreOrderTraverse(tree);
					cout << endl;
					break;
				}
				case 2: {
					cout << "\n 2,中序遍历的结果为:";
					InOrderTraverse(tree);
					cout << endl;
					break;
				}

				case 3: {
					cout << "\n 3,后序遍历的结果为:";
					PostOrderTraverse(tree);
					cout << endl;
					break;
				}

				case 4:
					cout << "\n 4,二叉树结点总数:" << NodeCount(tree) << endl; break;
				
				default:
					_exit(0);
				}    
				cin.clear();			// 在此处使用这两句代码时,虽然VS2019的控制
                            //台会暂停,但是会出现只能执行输入的数字和之后数字的代码的情况
				cin.ignore();			// 因此,还是使用Dev编译器,使用system(“pause”)

			}
			else {		// 当输入超过范围时就报以下内容
				cout << "\n 您输入有误,请输入0-4的正整数!!!" << endl;
				break;
				cin.clear(num);
				cin.ignore(num);
			}

		}
	}
	
	system("pause");				// 系统暂停,在VS中无法使用,可以在Dev编译器上使用
	return 0;
	// getchar();					// VS2019已经淘汰了这段代码,还有sleep()也淘汰了
	// std::cin.ignore();			// 用错位置了,可以放在if中去
	printf("\n\n谢谢您的使用,请按任意键退出\n\n\n");
	
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 17:34
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办