程序员面试金典: 9.13 C和C++ 13.7编写方法,传入参数为指向Node结构的指针,返回传入数据结构的完整拷贝。
来源:互联网 发布:程序员的头像 编辑:程序博客网 时间:2024/04/30 06:59
#include <iostream>#include <stdio.h>#include <map>using namespace std;/*问题:编写方法,传入参数为指向Node结构的指针,返回传入数据结构的完整拷贝。其中,Node 数据结构含有两个指向其他Node的指针分析:这个应该是深拷贝的问题,需要对指针重新分配内存空间,防止指针悬挂。书上解法:采用映射<指针,拷贝结果指针>,从原先结构中结点地址对应到新的相应结点。采用递归,判断 某个结点是不是复制过了。关键:1 采用递归复制的方式,深拷贝中指针拷贝一定要分配内存空间,设定<待复制结点,复制结果结点>映射,对子孙结点重复处理2 Node* copyNode(Node* node , NodeMap& nodeMap){if(NULL == node){return NULL;}NodeMap::iterator it = nodeMap.find(node);//如果待复制结点能够找到对应新结构中结点,说明已经复制过了,直接返回if(it != nodeMap.end()){return it->second;}//没有复制过,则深拷贝中指针的拷贝需要重新分配内存空间Node* newNode = createNode();//将其写入到映射中nodeMap.insert(pair<Node* , Node*>(node , newNode));//下面对待复制结点的两个孩子结点递归处理newNode->_first = copyNode(node->_first , nodeMap);newNode->_second = copyNode(node->_second , nodeMap);return newNode;}*/typedef struct Node{Node* _first;Node* _second;}Node;const int MAXSIZE = 10000;Node gNodeArray[MAXSIZE];int gIndex;Node* createNode(){++gIndex;gNodeArray[gIndex]._first = gNodeArray[gIndex]._second = NULL;return &gNodeArray[gIndex];}/* 这个方法是错误的,凡是涉及到指针拷贝,都要分配新的内存空间Node* copyNode(Node* node){Node* resultNode = createNode();//这里必须分配新的地址,但是其两个指针对象也得采用新分配的内存空间Node* firstNode = node->_first;Node* secondNode = node->_second;resultNode->_first = firstNode;resultNode->_second = secondNode;return resultNode;}*/typedef map<Node* , Node* > NodeMap;//<待复制结点,复制结果结点>的映射Node* copyNode(Node* node , NodeMap& nodeMap){if(NULL == node){return NULL;}NodeMap::iterator it = nodeMap.find(node);//如果待复制结点能够找到对应新结构中结点,说明已经复制过了,直接返回if(it != nodeMap.end()){return it->second;}//没有复制过,则深拷贝中指针的拷贝需要重新分配内存空间Node* newNode = createNode();//将其写入到映射中nodeMap.insert(pair<Node* , Node*>(node , newNode));//下面对待复制结点的两个孩子结点递归处理newNode->_first = copyNode(node->_first , nodeMap);newNode->_second = copyNode(node->_second , nodeMap);return newNode;}void process(){gIndex = 0;Node* node = createNode();Node* firstNode = createNode();Node* secondNode = createNode();node->_first = firstNode;node->_second = secondNode;NodeMap nodeMap;Node* result = copyNode(node , nodeMap);}int main(int argc, char* argv[]){process();getchar();return 0;}
0 0
- 程序员面试金典: 9.13 C和C++ 13.7编写方法,传入参数为指向Node结构的指针,返回传入数据结构的完整拷贝。
- 编写方法,传入参数为指向Node结构的指针,返回传入数据结构的完整拷贝。
- c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体)
- C的可变参数传入
- MyBatis的传入和返回参数类型
- C语言:返回传入字符串的长度
- 【学习笔记】C#执行存储过程传入参数并返回output参数和return_value的方法
- C/C++—— 写一个函数,它的参数为指向函数的指针,返回类型也为指向函数的指针
- 如果函数的传入参数和返回值是对象
- 2. 如何将java传入的String参数转换为c的char*,然后使用?
- 指针作为参数传入函数的陷阱
- C:LINUX如何来使用传入的参数
- c# 传入指针 c dll
- 传入参数为NULL的悲剧
- 【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。(辗转相除法和常规求法)
- C语言 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- C语言实现 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- python参数的传入 * ,**
- ElasticSearch5.0——中文分词插件IK安装
- 复化求积公式
- Ubuntu14.04 下安装PyCharm环境
- 直播博客
- Three.JS学习 6:光源
- 程序员面试金典: 9.13 C和C++ 13.7编写方法,传入参数为指向Node结构的指针,返回传入数据结构的完整拷贝。
- 激活ubuntu root帐号及使用SecureCRT登录
- 【C语言学习笔记】输出函数puts()
- iframe的优缺点
- ubuntu 14.04lts 桌面版中 nginx 和 swoole的 性能比较
- 深圳天瑞地安:规范的Java开发让你编程更舒心
- 素数运算
- MAZE题解
- 2016年菜鸟程序员总结