在C++中为树创建新结构
Creating new structure for trees in C++
我会保持简短。当我运行代码时,我输入第一个字符(例如:"k"(,一切都很好。第二次输入字符(例如:"j"(时,我得到一个错误,编译器说它在行上(有注释(。请帮忙。非常感谢。
代码:
struct nodeType{
char letter;
nodeType*leftNode;
nodeType*rightNode;
};
void putInNode(nodeType*n,char c){
if ((char)(n->letter) >='a' && (char)(n->letter) <='z')/* ERROR IS HERE*/
{
if(n->letter < c)
putInNode(n->leftNode, c);
else
putInNode(n->rightNode, c);
}
n->letter=c;
}
int main(){
nodeType*a=new nodeType();
char c;
do {
cin >> c;
if(c=='.')
break;
putInNode(a,c);
} while (true);
cout << a->letter << endl;
}
如果这样做的目的是只从输入流中构建一个字母树,在到达一个句点时停止,并跳过任何不在{'a'...'z'}
中的内容,我认为这就是你想要的:
#include <iostream>
struct nodeType
{
nodeType(char ch = 0)
: letter(ch), leftNode(), rightNode()
{}
char letter;
nodeType* leftNode;
nodeType* rightNode;
};
void putInNode(nodeType*& n,char c)
{
if (!n)
{
n = new nodeType(c);
}
else if (n->letter >='a' && n->letter <='z')
{
if(c < n->letter)
putInNode(n->leftNode, c);
else
putInNode(n->rightNode, c);
}
}
int main()
{
nodeType* a = NULL;
char c;
while ((std::cin >> c) && c != '.')
putInNode(a,c);
if (a)
std::cout << a->letter << 'n';
}
注意:这会将重复项向下推到右侧子行。如果不是这样,请更改以下内容:
if(c < n->letter))
putInNode(n->leftNode, c);
改为:
if(c <= n->letter)) // <== note less-or-equal
putInNode(n->leftNode, c);
我将清理生成的动态树留给您。需要注意的是,正如所写的(之前和现在(,第一个节点将始终是你的树的根(我假设有一天你计划通过轮班来平衡,比如你在这条路上走得更远(。
可以肯定的是,问题是您实际上没有从根节点分配任何节点appart。因此,当您输入第二个字母时,第一个字母已经在父节点中设置了字母,当它试图取消引用树中的左侧节点时,它失败了(b/c,这是未分配的内存(。
问题是您只为单个节点分配空间,而没有初始化变量。
第一次通过do
循环时,我假设a->letter = 0
,因此当进入putInNode
函数时,字母将分配给k
。下一次通过循环n->letter
将是位于a
和z
之间的k
,并且k < j
将为真,因此putInNode(n->leftNode, c);
然而,n->leftNode
还没有初始化,所以当你试图像n->letter
一样尊重它时,你会得到一个segfault。
要解决此问题(假设您不希望此函数生成新节点(,请为结构创建一个构造函数,然后检查null。
struct nodeType{
nodeType()
{
letter = 0;
leftNode = nullptr;
rightNode = nullptr;
}
char letter;
nodeType*leftNode;
nodeType*rightNode;
};
然后在putInNode
中
void putInNode(nodeType*n,char c){
if(n == nullptr) {
return;
}
if ((char)(n->letter) >='a' && (char)(n->letter) <='z') {
.
.
.
相关文章:
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 是否需要删除函数中未使用的新结构?
- 有没有办法初始化不涉及编写构造函数的新结构变量?
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- 为什么可以使用指针创建新结构,但不能以相同的方式创建双精度?
- 对新结构的Oploading Operator()
- C++ 为什么我制作新结构并得到错误?(双链表通函)
- 元编程:动态声明一个新结构
- 访问违规新C 结构
- 将共享指针指向具有初始化的新结构
- 模板类中新结构的C++语法
- 如何在std::list中插入一个新结构
- 当条件更改时,在 while 循环内创建新结构
- 多次创建新结构
- 是使用特定于编译器的变量对新结构{}进行列表初始化
- 如何正确设置指向新结构的指针
- 控制台中的新结构崩溃,原因
- 使用新结构体进行聚合初始化是否有效
- 在c++中自动更新新结构体中的相关值
- 如何在创建新结构体时给成员指针赋NULL值