程序员面试金典: 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
原创粉丝点击