new ,delete 疑问

effective_person 2008-02-28 07:41:27

//为什么使用delete 出现错误?


template <typename T>
void Linklist<T>::Insert(int i,T x)
{
if(i<0||i>length+1) //抛出异常
throw Overflow();
if(length==0)//由于第一个节点不同于其它节点的插入
{//可以直接把 pt节点连接在first(头接点)的后面
Node<T> *pt=new Node<T>;
pt->data=x;
first->next=pt;
pt->next=NULL;//最后pt要指向空
// delete pt; //为什么收回空间会出现错误?
}
else
{
Node<T> *p=first;
for(int j=0;j<i-1&&p;j++)
p=p->next;//找到要插入的位置
Node<T> * newdata=new Node<T>;
newdata->data=x;//一般插入节点
newdata->next=p->next;
p->next=newdata;
// delete newdata;//出现错误
}
length++;
}
template <typename T>
void Linklist<T>::Delete(int i)
{
if(i<0||i>length)//抛出异常
throw Overflow();
else
{
Node<T> *p=first->next;
for(int j=0;j<i-2;j++)
p=p->next;//找到要删除节点位置之前的节点
Node<T> *q=new Node<T>;
q=p->next;//删除节点
p->next=q->next;
delete q;//为什么这没有出现错误呢?
}
length--;
}
...全文
85 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
effective_person 2008-02-28
  • 打赏
  • 举报
回复
大悟!我现在弄明白了!
在(1) (2)处不需要收回空间,因为开辟节点的空间是要到最后收回的,如果中途收回会造成异常.
虽然收回空间后指针可以使用 但指向的内存空间没了 ,我只考虑指针的使用和还有new 使用后是要delete的.
好久没有写程序了见笑了! 忘了基本了!!!
谢谢各位!!
effective_person 2008-02-28
  • 打赏
  • 举报
回复

Node <T> *pt=new Node <T> ;
pt-> data=x;
first-> next=pt;
pt-> next=NULL;//最后pt要指向空
// delete pt; //为什么收回空间会出现错误?

这一段不是矛盾吗? 你把申请的新节点空间放在 first-> next 上,这个时候,pt 和 first-> next 都指向同一位置,然后你又马上删除 delete pt;,等于也就是删除了 first-> next 。那你后面用到first-〉next 数据的时候肯定出错。
/* delete pt后 但是指针pt在后面还可以用的.*/


后面的这段:
for(int j=0;j <i-2;j++)
p=p-> next;//找到要删除节点位置之前的节点
Node <T> *q=new Node <T> ;
q=p-> next;//删除节点
p-> next=q-> next;
delete q;//为什么这没有出现错误呢?

你好像写错了。你再看看吧。如果 Node <T> *q=new Node <T> ; q=p-> next;那么你前面用 new 干什么?
/* Delete 是没有错误的.
可以用new 和delete的 */


Supper_Jerry 2008-02-28
  • 打赏
  • 举报
回复
同意3楼的,根本无需delete。
sinosinux 2008-02-28
  • 打赏
  • 举报
回复
up
dubiousway 2008-02-28
  • 打赏
  • 举报
回复
Node<T> *pt=new Node<T>;
pt->data=x;
first->next=pt;
pt->next=NULL;//最后pt要指向空
// delete pt; //为什么收回空间会出现错误?

这一段不是矛盾吗? 你把申请的新节点空间放在 first->next 上,这个时候,pt 和 first->next 都指向同一位置,然后你又马上删除 delete pt;,等于也就是删除了 first->next 。那你后面用到first-〉next 数据的时候肯定出错。

后面的这段:
for(int j=0;j<i-2;j++)
p=p->next;//找到要删除节点位置之前的节点
Node<T> *q=new Node<T>;
q=p->next;//删除节点
p->next=q->next;
delete q;//为什么这没有出现错误呢?

你好像写错了。你再看看吧。如果 Node<T> *q=new Node<T>; q=p->next;那么你前面用 new 干什么?
effective_person 2008-02-28
  • 打赏
  • 举报
回复

#include <iostream>
namespace List
{
template <typename T>
struct Node
{
T data;
Node<T> *next;
};
template <typename T>
class Linklist
{
public:
Linklist();
~Linklist();
void Insert(int i,T x);
void Delete(int i);
int Find(T x) const;
T Get(int i) const ;
bool Empty() const;
void Print() const;
int Length() const;
private:
Node<T>* first;//头接点
int length;//保存链表的长度
};
template <typename T>
Linklist<T>::Linklist()
{
first=new Node<T>;
first->next=NULL;//初始化条件
length=0;
}
template <typename T>
Linklist<T>::~Linklist()
{
delete first;
length=0;
}
template <typename T>
void Linklist<T>::Insert(int i,T x)
{
if(i<0||i>length+1) //抛出异常
throw Overflow();
if(length==0)//由于第一个节点不同于其它节点的插入
{//可以直接把 pt节点连接在first(头接点)的后面
Node<T> *pt=new Node<T>;
pt->data=x;
first->next=pt;
pt->next=NULL;//最后pt要指向空
// delete pt; //为什么收回空间会出现错误?
}
else
{
Node<T> *p=first;
for(int j=0;j<i-1&&p;j++)
p=p->next;//找到要插入的位置
Node<T> * newdata=new Node<T>;
newdata->data=x;//一般插入节点
newdata->next=p->next;
p->next=newdata;
// delete newdata;//出现错误
}
length++;
}
template <typename T>
void Linklist<T>::Delete(int i)
{
if(i<0||i>length)//抛出异常
throw Overflow();
else
{
Node<T> *p=first->next;
for(int j=0;j<i-2;j++)
p=p->next;//找到要删除节点位置之前的节点
Node<T> *q=new Node<T>;
q=p->next;//删除节点
p->next=q->next;
delete q;
}
length--;
}
template <typename T>
int Linklist<T>::Find(T x) const
{//查找元素所在的位置
int k=-1;
Node<T> *p=first;
for(int i=0;i<=length;i++,p=p->next)
if(p->data==x)
k=i;
if(k==-1)
std::cout<<"没有找到!"<<std::endl;
return k;
}
template <typename T>
T Linklist<T>::Get(int i) const
{//获取i位置的元素
Node<T> *p=first->next;
if(i<0||i>length)
throw Overflow();
for(int j=0;j<i-1;j++)
p=p->next;
return p->data;
}
template <typename T>
bool Linklist<T>::Empty() const
{
return length==0?1:0;
}
template <typename T>
int Linklist<T>::Length() const
{
return length;
}

template <typename T>
void Linklist<T>::Print() const
{//打印链表
Node<T> *p=first->next;
if(p==NULL)
std::cout<<"空表"<<std::endl;
while(p!=NULL)
{
std::cout<<p->data<<" ";
p=p->next;
}
std::cout<<std::endl;
}
}


#include "SeqList.h"
#include "Linklist.h"
#include <iostream>
#include <string>
using namespace List;
int main()
{//测试顺序表和链表
Linklist<int> l;
l.Insert(1,10);
l.Insert(2,11);
l.Insert(3,12);
l.Insert(1,9);
l.Print();
std::cout<<l.Length()<<std::endl;
l.Delete(2);
l.Print();
std::cout<<l.Length()<<std::endl;
std::cout<<l.Empty()<<std::endl;
std::cout<<l.Find(12)<<std::endl;
std::cout<<l.Get(l.Length()-1)<<std::endl;
return 1;
}
星羽 2008-02-28
  • 打赏
  • 举报
回复
给出完整测试程序
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-02-28 07:41
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下