跪求各位大神解决!!跪求!!!!类对象的析构问题
#include<stdio.h>
#define STRLENGTH 300
template<class T>
struct LinkNode
{
T ele;
char str[STRLENGTH]; //辅助变量,便于对类对象按对象中的某个字符串排序
LinkNode<T> *next;
LinkNode()
{
str[0]=NULL;
next=NULL;
}
~LinkNode(){}
};
template<class T>
class LinkList
{
public:
LinkList();
~LinkList();
int Locate(const T &ele); //锁定元素ele为第几个元素
bool AddNode(const T &ele);
bool AddNode(const T &ele,char *s);
bool DelNode(T &ele); //删除元素ele
int GetLength();
LinkNode<T>* GetHead();
LinkNode<T>* Prev(LinkNode<T> *pn); //将指针pn前移
int Locate(LinkNode<T> *pn); //返回指针pn所在的位置
void Display();
private:
LinkNode<T> *head;
LinkNode<T> *tail;
int length;
};
template<class T>
LinkList<T>::LinkList()
{
head=new LinkNode<T>;
tail=head;
length=0;
}
template<class T>
LinkList<T>::~LinkList()
{
if(head!=NULL)
delete head;
}
template<class T>
int LinkList<T>::Locate(const T &ele)
{
int pos=0;
LinkNode<T> *p=head->next;
if(length==0) return -1; //空链表
while(p!=NULL)
{
pos++;
if(p->ele==ele) //调用重载的==
return pos;
p=p->next;
}
return -1; //链表中不存在该元素
}
template<class T>
int LinkList<T>::Locate(LinkNode<T> *pn)
{
int count=0;
LinkNode<T> *p=head->next;
while(p!=NULL)
{
count++;
if(p==pn) return count;
else p=p->next;
}
return count;
}
template<class T>
LinkNode<T>* LinkList<T>::Prev(LinkNode<T> *pn) //将指针pn前移
{
int pos=Locate(pn),i=0;
LinkNode<T> *q=head;
while(i<pos-1) //找到第pos-1个结点的地址,如果pos==1,返回头结点
{
i++;
q=q->next;
}
return q;
}
template<class T>
bool LinkList<T>::AddNode(const T &ele)
{
LinkNode<T> *p=new LinkNode<T>;
if(p==NULL) return false;
p->ele=ele;
p->next=NULL;
if(length==0)
{
head->next=p;
tail=p;
length++;
}
else
{
tail->next=p;
p->next=NULL;
tail=p;
length++;
}
return true;
}
template<class T>
bool LinkList<T>::AddNode(const T &ele,char *s_t) //字符串s_t是结构体T中的一个成员变量,插入排序,
{
LinkNode<T> *p=new LinkNode<T>;
if(p==NULL) return false;
p->ele=ele;
strcpy(p->str,s_t); //初始化结点的字符串
if(length==0)
{
head->next=p;
tail=p;
length++;
}
else
{
while(strcmp(p->str,tail->str)<0)
{
tail=Prev(tail); //当为一个结点时,前移返回是head,而不是NULL
if(tail==head)
break;
}
LinkNode<T> *temp;
temp=tail->next; //temp指向右侧结点的指针,T为指向左侧结点的指针
tail->next=p;
p->next=temp;
length++;
while(tail->next!=NULL) //每次插入后都将tail指针放回尾部,方便下次插入元素ele
{
tail=tail->next;
}
}
return true;
}
template<class T>
bool LinkList<T>::DelNode(T &ele)
{
int pos=Locate(ele),count=0;
if(pos==-1) return false;
LinkNode<T> *p=head,*del=NULL;
if(pos==1)
{
del=p->next;
head->next=del->next;
delete del;
length--;
return true;
}
while(count!=pos-1)
{
p=p->next;
count++;
}
del=p->next;
p->next=del->next;
delete del;
length--;
return true;
}
template<class T>
int LinkList<T>::GetLength()
{
return length;
}
template<class T>
void LinkList<T>::Display()
{
LinkNode<T> *p=head->next;
while(p!=NULL)
{
cout<<p->ele<<" ";
p=p->next;
}
}
template<class T>
LinkNode<T>* LinkList<T>::GetHead()
{
return head;
}
#include"head.h"
#include<iostream>
#include<string.h>
using namespace std;
class Passager
{
public:
Passager()
{
name[0]=NULL;
ticket_num=0;
seat_num=NULL;
}
Passager(char *name,int t_num,int *s_num)
{
strcpy(this->name,name);
ticket_num=t_num;
if(s_num!=NULL)
{
seat_num=new int[ticket_num];
for(int i=0;i<ticket_num;i++)
seat_num[i]=s_num[i]; //把座位号逐个赋值
}
}
Passager(Passager &p)
{
strcpy(name,p.name);
this->ticket_num=p.ticket_num;
this->seat_num=new int[p.ticket_num];
for(int i=0;i<ticket_num;i++)
seat_num[i]=p.seat_num[i];
}
~Passager()
{
if(seat_num!=NULL)
delete []seat_num;
}
bool operator==(const Passager &p)const //
{
int i;
for(i=0;i<p.ticket_num;i++) //判断每个座位号是否相同
if(this->seat_num[i]!=p.seat_num[i])
return false;
else continue;
return (strcmp(name,p.name)==0&&ticket_num==p.ticket_num&&i==p.ticket_num);
}
char *ReturnName()
{return name;}
private:
char name[30]; //姓名
int ticket_num; //订票额
int *seat_num; //座位号,这里相当于有ticket_num个座号
};
int main()
{
int n_m=1;
int *s_num=new int[2]; //座位号
for(int i=0;i<2;i++) //产生连续的座位号
s_num[i]=5; //为了方便调试,我把每个客人都定为两个座位号,每个座位号都为5
Passager p1("Tom",2,s_num),p2("Jec",2,s_num),p3("Ae",2,s_num);
LinkList<Passager> list;
list.AddNode(p1,p1.ReturnName()); //这里是按名字插入排序
list.AddNode(p2,p2.ReturnName());
list.AddNode(p3,p3.ReturnName());
if(list.DelNode(p2)) //删除链表中的客人p2
cout<<"OK"<<endl;
delete []s_num;
return 0;
}//这里出现的问题是:删除p2后在析构对象p2时发生错误,错误如图。请问是哪里出问题了
ticket_num = p.ticket_num;
if ( seat_num != NULL )
delete [] seat_num;
seat_num=new int[ticket_num];
for(int i=0;i<ticket_num;i++)
seat_num[i]=p.seat_num[i];
}
[解决办法]
上面函数少了一句
return *this;
呵呵