c++,怎么删除自己写的list里new出来的节点?

自己写一个双向链表练手。定义了一个叫节点的structure:structnode{node*last;node*next;char*str;}然后我的链表初始化就是一个... 自己写一个双向链表练手。定义了一个叫节点的structure:
struct node{
node* last;
node* next;
char* str;
}
然后我的链表初始化就是一个假节点sentinel,然后有个构造函数和析构函数,还有一个append()专门往链表末尾插入新节点:
class linkedList{
private:
node sentinel;
public:
//构造函数
linkedList::linkedList(){
sentinel.last=&sentinel;
sentinel.next=&sentinel;
sentinel.str="I am sentinel!!";
}
//析构函数
linkedList::~linkedList(){
node* lastOne=sentinel.last;
while(lastOne!=&sentinel){
lastOne=lastOne->last;
delete lastOne->next->last;
delete lastOne->next->next;
delete lastOne->next->str;
}
//链表末尾插入新节点
void linkedList::append(char* str){
node* newNode=new node;
newNode->str=str;
newNode->last=sentinel.last;
(*sentinel.last).next=newNode;
sentinel.last=newNode;
(*newNode).next=&sentinel;
}
};
我的问题是:因为每次插入的新节点是用new初始化的,最后在程序结束的时候怎么把这些节点依次删除?我现在是在析构函数里写了删除的代码,但每次运行的时候总是说exe终止运行。不知道是什么原因。但append()函数测试下来是好的。向老鸟们求教!
这样看得清楚点:
展开
 我来答
nthelement
2013-12-31 · 超过18用户采纳过TA的回答
知道答主
回答量:41
采纳率:100%
帮助的人:26.3万
展开全部
根据析构函数,你是前向删除的,lastOne=lastOne->last; delete lastOne->next->last; delete lastOne->next->next; delete lastOne->next->str;
假设lastOne是节点N,lastOne->Next就是节点N+1,delete lastOne->next->last;就释放了节点N,即lastOne,后面的lastOne指针都是野指针了应该是delete lastOne->next->str; delete lastOne->next;
追问
|
012345
我要删5,lastOne是5。lastOne=lastOne->last;之后,lastOne是4。
现在删5,就应该把节点里一前一后两个指针和一个一个值全删了。
这里的delete lastOne->next->last; 删的是5指向4的前指针还是直接删4节点?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
BlueWanderer
2015-11-10 · TA获得超过9209个赞
知道大有可为答主
回答量:5673
采纳率:83%
帮助的人:2012万
展开全部

只能遍历所有元素,逐个删除。


类似于这样:

 list<int *> l;
 
 // ...

 for (int *item : l)
 {
  delete item;
 }

这种情况建议还是使用只能指针。比如list<uinque_ptr<int>>或者list<shared_ptr<int>>。这样在list析构的时候自动就会把里面的指针删除了,而且unique_ptr一般也不会比直接用指针有更大的代价。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
拷你妹
2013-12-31
知道答主
回答量:43
采纳率:0%
帮助的人:22万
展开全部
贴出代码,你自己看看改改
struct node{ node* last; node* next; char* str;};
class linkedList{private: node sentinel;public: //构造函数 linkedList::linkedList() { sentinel.last=&sentinel; sentinel.next=&sentinel; sentinel.str="I am sentinel!!"; } //析构函数 linkedList::~linkedList() { node* lastOne = sentinel.last; while(lastOne!=&sentinel) { lastOne=lastOne->last; delete lastOne->next->last; delete lastOne->next->next; delete lastOne->next->str; } } //链表末尾插入新节点 void linkedList::append(char* str) { node* newNode=new node; newNode->str=str; node* newNode_t = &sentinel ; while(newNode_t->next != &sentinel) newNode_t = newNode_t->next; newNode->last = newNode_t; (*newNode_t).next=newNode; (*newNode).next=&sentinel; } };int main(){ linkedList mylist; mylist.append("hello"); mylist.append("world");
}
更多追问追答
追问
你这代码有改过吗?和我的一样啊?
追答
运行了吗?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式