c++ - 以不同方式传递参数,得到不同的结果?

浏览:33日期:2023-05-28

问题描述

下面的代码是要实现两个链表的的链接,other是待链接的链表,it是指向想链接的那个元素的迭代器,

void splice(const_iterator pos, list& other, const_iterator it){if (other.size() != 0) {if (it == other.begin())other.head = other.head->_next;//auto it2 = it;//++it2;link_list(pos, it.getMynode(), it.getMynode()->_next);if (other.size() == 0)free(other.head, other.tail); }}

link_list定义如下:

void link_list(const_iterator pos, NodePtr&sub_list, NodePtr&sub_tail){ sub_tail->_pre->_next = pos.getMynode(); sub_list->_pre->_next = sub_tail; auto tmp = pos.getMynode()->_pre; tmp->_next = sub_list; pos.getMynode()->_pre = sub_tail->_pre; sub_tail->_pre = sub_list->_pre; sub_list->_pre = tmp; if (head == pos.getMynode())head = sub_list;}

出现的问题是这样的,给link_list传递参数用这种形式:link_list(pos, it.getMynode(), it.getMynode()->_next);,得到的结果是错误的,但是用下面的方法就是正确的:

auto it2 = it;++it2;link_list(pos, it.getMynode(), it2.getMynode());

出现问题的地方在这里:sub_tail->_pre->_next = pos.getMynode();就是赋值之后,sub_tail的值也变成pos.getMynode()的值了,这是为什么?

//list节点template<class T>struct __list_node{ typedef __list_node<T>* _NodePtr; _NodePtr _pre; _NodePtr _next; T data;};typedef __list_node<T>* _NodePtr;_NodePtr _Ptr; //指向链表节点的指针//获取节点函数_NodePtr&getMynode(){ return _Ptr;}

调用是这样的:

list<int>ilist1{1,2,3,4,5,6};list<int>ilist2{ 555,333,999,5555};ilist1.splice(++ilist1.begin(), ilist2,ilist2.begin());

问题解答

回答1:

目测应该是因为题主的_next返回的是一个链表节点拷贝

相关文章: