浙大版《数据结构学习与实验指导(第2版)》题目集 案例4-1.6 树种统计 (25 分)

emmm,实现了功能
但是编译不通过,PTA的编译器跟VS2019果然有着谜之不兼容。改了_s之后也不行

发现了几个问题
Bintree t必须用t=insert(t, tmp); 调用,也就是说,t不是作为指针使用的,而是作为局部变量使用的
这个地方我理解还不是很透彻

代码如下:

#include
#include
#define _CRT_SECURE_NO_WARNINGS
#define MAXSIZE 30

using namespace std;

typedef struct LNode* Bintree;

//链表实现二叉搜索树
struct LNode {
	char* Category;//用指针定义需要动态分配内存,用数组则不需要
	int fre;
	Bintree Left;
	Bintree Right;
};
Bintree insert(Bintree t, char tmp[]) {
	if (!t) {
		t = (Bintree)malloc(sizeof(struct LNode));
		t->Category = (char*)malloc((MAXSIZE + 1) * sizeof(char));
		strcpy_s(t->Category,31,tmp);
		t->fre = 1;
		t->Left = t->Right = NULL;
	}
	else {
		int cmp = strcmp( tmp,t->Category);
		if (cmp > 0) //字典序更大
			t->Right = insert(t->Right, tmp);
		else if (cmp < 0) //字典序更大
			t->Left = insert(t->Left, tmp);
		else
			t->fre++;
	}
	
	return t;

}
void Output(Bintree t, int n) {
	if (!t) return;
	Output(t->Left, n);
	printf_s("%s %.4lf%c\n", t->Category, (double)t->fre / (double)n * 100.0, '%');
	Output(t->Right, n);
}


int main() {
	int n;
	cin >> n;
	Bintree t = NULL;
	//t->Category = (char*)malloc((MAXSIZE + 1) * sizeof(char));最好不要让根节点值为空
	char tmp[MAXSIZE + 1];
	tmp[0]=getchar();
	while (n--) {
		cin.getline(tmp, (MAXSIZE + 1));
		t=insert(t, tmp); 
	}
	Output(t, n);
}

你可能感兴趣的:(#,数据结构,PTA练习)