6.3w+
社区成员
//为什么使用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--;
}
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的 */
#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;
}