链表的拷贝构造函数怎么做?

liuchang2859 2002-04-30 08:29:47
链表的拷贝构造函数怎么做?就是复制一个链表给另一个链表(不是链表结点)
还有在链表里(比如说构造函数还有其他一些函数)怎么确定指向前驱结点的指针(prevptr)?
...全文
956 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sedulity 2002-05-11
  • 打赏
  • 举报
回复
简单点,只要你的析够function中要释放一些资源,你就do 拷贝够造函数
wolaiye3 2002-05-11
  • 打赏
  • 举报
回复
学习学习!
stephon 2002-05-05
  • 打赏
  • 举报
回复
谁帮我看看后面那个拷贝构造函数 啊
哪错了,是深拷贝
cber 2002-05-05
  • 打赏
  • 举报
回复
to do_do:“链表的拷贝构造函数问题,我觉得最好是不允许它被拷贝。因为深拷贝太浪费资源,浅拷贝非常危险。”

我觉得我们最好不要限制它们的拷贝,要知道假设deque可以拷贝,map可以拷贝,那么为什么list就不可以被拷贝呢?再说呢,利用pool等一些技巧,可以减轻深拷贝在时间效率上面的影响,而很多的app里面空间效率在现在则不是那么重要了(当然,我只是这样说而已,并没有说空间是一个不值得注意的地方,只是相对以前来说要低一些而已)
cowputer 2002-05-04
  • 打赏
  • 举报
回复
不知你学没学过数据结构,定位前驱,如果不是双响的话,那就只能从头指针开始搜索一直到你要插入的前一个接点,然后插入待插接点
liuchang2859 2002-05-02
  • 打赏
  • 举报
回复
根据上面朋友的提示写的一个链表的拷贝构造函数,但不行,请大伙帮忙看看那块出错了,谢谢
EdgeLink::EdgeLink(const EdgeLink&rhs)
{
Edgepoint * temp = rhs.root;
while(temp)
{
if (!root)
{
root = new Edgepoint;
rear=current=root;
}
else
{
current->next = new Edgepoint;
current = current-> next;

}
current->VerAdj = temp->VerAdj;
current->cost=temp->cost;
current-> next = NULL;
temp = temp -> next;
}
rear=current;
size=rhs.size;

}
Last_Dodo 2002-05-01
  • 打赏
  • 举报
回复
你真正想知道的可能是深拷贝和浅拷贝的问题。
首先什么是深/浅拷贝,浅拷贝是只拷贝指针的值,而深拷贝是拷贝指针指向的对象。
再就是什么时候用深/浅拷贝。由于深拷贝完全拷贝出另一个一样的对象,成本自然高。浅拷贝则导致共享对象,容易出问题(比如,一个把指针delete掉后另一个就成为dangling指针)。所以要根据具体的情况来取舍。

链表的拷贝构造函数问题,我觉得最好是不允许它被拷贝。因为深拷贝太浪费资源,浅拷贝非常危险。
liuchang2859 2002-05-01
  • 打赏
  • 举报
回复
do_do(do_do) 说到我心里去了。我就是不明白深拷贝和浅拷贝的关系
看了Effective C++里条款11,里面说只要有指针就应该自己写拷贝构造函数和assigh运算符,但是却没说具体怎么写。我现在都对指针有些恐惧了,生怕两个指针指向同一个资源?指针的拷贝函数到底该注意些什么??麻烦do_do(do_do) 或者其他高手再给我解释解释
谢谢!!
zhima2000 2002-05-01
  • 打赏
  • 举报
回复
强烈建议你看看有关数据结构方面的书!
richard_hu 2002-05-01
  • 打赏
  • 举报
回复
把所有的字节点都依次拷贝过来,直到NULL为止
uf65 2002-05-01
  • 打赏
  • 举报
回复
When you copy a linked list , make it a deep copy , shallow copy is dangerous, it'll crash your code.

steedhorse(晨星)'s example is a shallow copy.

the following is one I got from somewhere.
//********************************************************************

// Copy a list to another list
Double_list copy(const Double_list & a_list)
{
Double_list new_list;

node * temp = a_list, * last;
initialize(new_list);

while(temp)
{
if (!new_list)
{
new_list = new node;
last = new_list;
last -> previous = NULL;
}
else
{
last -> next = new node;
(last -> next) -> previous = last;
last = last -> next;
}
last -> info = temp -> info;
last -> next = NULL;
temp = temp -> next;
}
return new_list;
}

// Delete a linked list, the same as singly linked list.
void destroy(Double_list & a_list)
{
node * garbage = a_list;

while (garbage)
{
a_list = a_list -> next;
delete garbage;
garbage = a_list;
}
}



晨星 2002-04-30
  • 打赏
  • 举报
回复
如果你不是在实践,而是在编程,那么使用VC中的vector和CList都很方便的。
晨星 2002-04-30
  • 打赏
  • 举报
回复
如果不是双向,要确定前驱节点,只能从头搜索了。
List* List::PreNode(List * current)
{
List *p = this , *q;
while(p != current)
{
q = p;
p = p->pNext;
}
return q;
}
晨星 2002-04-30
  • 打赏
  • 举报
回复
我来写一个单向的给你看一下吧。
class List
{
public:
List(List &l);
……
private:
int val;
List * pNext;
}

List::List(List &l)
{
val = l.val;
List *p = l.pNext , *q = this;
while(p != NULL)
{
q->pNext = new List;
q->pNext->val = p->val;
p = p->next;
q = q->pNext;
}
q->pNext = NULL;
}

没有调试,但基本思想应该是对的。
liuchang2859 2002-04-30
  • 打赏
  • 举报
回复
不是双向,我就是指针的拷贝构造函数还有点混沌,呵呵
想问问,那麻烦告诉一下具体怎么做。一定给分
晨星 2002-04-30
  • 打赏
  • 举报
回复
从头到尾,把所有节点,一个一个申请,一个一个地复制。

如果你要经常用到前驱节点的指针,那就最好建立双向链表。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧