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()函数测试下来是好的。向老鸟们求教!
这样看得清楚点: 展开
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()函数测试下来是好的。向老鸟们求教!
这样看得清楚点: 展开
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;
假设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节点?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只能遍历所有元素,逐个删除。
类似于这样:
list<int *> l;
// ...
for (int *item : l)
{
delete item;
}
这种情况建议还是使用只能指针。比如list<uinque_ptr<int>>或者list<shared_ptr<int>>。这样在list析构的时候自动就会把里面的指针删除了,而且unique_ptr一般也不会比直接用指针有更大的代价。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
贴出代码,你自己看看改改
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");
}
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");
}
更多追问追答
追问
你这代码有改过吗?和我的一样啊?
追答
运行了吗?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询