吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1241|回复: 8
收起左侧

[已解决] c++结构体指针结点问题

[复制链接]
13242589201 发表于 2019-11-12 23:42
本帖最后由 13242589201 于 2019-12-3 14:58 编辑

这是求二叉树下一个结点函数,结点指针的地址不知道如何赋值。基础不扎实,好烦呀。

struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode *father;
        TreeNode(int x) : val(x), left(NULL), right(NULL), father(NULL) {}
        
};
TreeNode* inorderSuccessor(TreeNode *p) {
        if (!p) return NULL;
        if (p->right) {
                p = p->right;
                while (p->left) p = p->left;
                return p;
        }

        while (p->father && p->father->right == p) {
                p = p->father;
        }

        if (p->father) return p->father;
        return NULL;
}
int main() {
        
        TreeNode *Node1 = new TreeNode(2);
        TreeNode *Node2 = new TreeNode(1);
        TreeNode *Node3 = new TreeNode(3);
        TreeNode *Node4 = new TreeNode(NULL);
        TreeNode *Node5 = new TreeNode(NULL);
        TreeNode *Node6 = new TreeNode(NULL);
        TreeNode *Node7 = new TreeNode(NULL);
        *Node2->father = *Node1;
        *Node1->left = *Node2;
        *Node1->right = *Node3;
        *Node2->left = *Node4;
        *Node2->right = *Node5;
        *Node3->left = *Node6;
        *Node3->right = *Node7;
        TreeNode*result = inorderSuccessor(Node1);//就是不知道为什么一直只能用地址,而导致函数无法传送参数而变成零。

        }
        

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 13242589201 发表于 2019-11-13 00:14
忘记说了,是中序遍历
46197zh 发表于 2019-11-13 12:00
[C++] 纯文本查看 复制代码
TreeNode* inorderSuccessor(TreeNode *p) {
	if (p==nullptr) 
		return nullptr;
	if (p->right != nullptr) {
		p = p->right;
		while (p->left != nullptr)
			p = p->left;
		return p;
	}
	while (p->father != nullptr&&p->father->right == p) {
		p = p->father;
	}
	if (p->father != nullptr)
		return p->father;
	else return nullptr;
}
int main() {

	TreeNode *Node1 = new TreeNode(2);
	TreeNode *Node2 = new TreeNode(1);
	TreeNode *Node3 = new TreeNode(3);
	//优化一下代码,建议这么写
	Node2->father = Node1;
	Node3->father = Node1;
	Node1->left = Node2;
	Node1->right = Node3;
	/*不知道你想表达什么,函数参数类型是指针类型,你想传什么类型?*/
	TreeNode*result = inorderSuccessor(Node1);//就是不知道为什么一直只能用地址,而导致函数无法传送参数而变成零。

	if(result!=nullptr)
	   std::cout << result->val;
	delete Node1;
	delete Node2;
	delete Node3;
}
 楼主| 13242589201 发表于 2019-11-13 12:32
46197zh 发表于 2019-11-13 12:00
[mw_shl_code=cpp,true]TreeNode* inorderSuccessor(TreeNode *p) {
        if (p==nullptr)
                return nullptr ...

我想请问下,就是有没有可能给这个指针地址赋值。
 楼主| 13242589201 发表于 2019-11-13 12:53
46197zh 发表于 2019-11-13 12:00
[mw_shl_code=cpp,true]TreeNode* inorderSuccessor(TreeNode *p) {
        if (p==nullptr)
                return nullptr ...

因为我它给的示例就是2,3,1,NULL,NULL,NULL,NULL所以我才这么赋初值,结果是返回最后的那个结点的。(初始化多初始了一次,以为要再给个NULL才能实现,看了下你的代码,确实是这样,感谢
是我描述少了。它确实就是应该输出空值的。函数实现的目标就是那个最后的空值结点
46197zh 发表于 2019-11-13 12:57
13242589201 发表于 2019-11-13 12:32
我想请问下,就是有没有可能给这个指针地址赋值。

可以,但这么做不好。相当于野指针,使用野指针不能确保程序发生什么情况。

Node1= (TreeNode *)(13432424);

 楼主| 13242589201 发表于 2019-11-13 13:35
46197zh 发表于 2019-11-13 12:57
可以,但这么做不好。相当于野指针,使用野指针不能确保程序发生什么情况。

Node1= (TreeNode *)(1343 ...

        TreeNode *Node1 = (TreeNode *)(13432424);//应该是这样吧?
这就叫野指针是吧?
难道这个空间就不能用了吗?
46197zh 发表于 2019-11-13 14:48
13242589201 发表于 2019-11-13 13:35
TreeNode *Node1 = (TreeNode *)(13432424);//应该是这样吧?
这就叫野指针是吧?
难道这个空间就不能 ...

系统很可能没有为Node1所指的地址分配内存,所以这块空间是无法访问和写入值的,可以调试查看这样定义的指针是无法读取内存的
{
TreeNode *p=new TreeNode(3);//堆区分配内存 指针p指向这块内存
TreeNode node(4);//栈区分配内存
TreeNode *q=&node;//q指向node所在的内存
}
 楼主| 13242589201 发表于 2019-11-13 18:29
46197zh 发表于 2019-11-13 14:48
系统很可能没有为Node1所指的地址分配内存,所以这块空间是无法访问和写入值的,可以调试查看这样定义的 ...

嗯嗯,谢谢,初始化分配内存这个我知道,就是那个野指针概念经过你的点醒才知道。只是听老师讲过,自己是小白,谢谢指点
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表