跪求各位大神解决!!跪求!!!!类对象的析构问题

无助的TOM 2013-01-01 07:48:40
#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时发生错误,错误如图。请问是哪里出问题了
...全文
784 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
无助的TOM 2013-01-02
  • 打赏
  • 举报
回复
嗯嗯,这次运行对了。我还有一个问题想问:我想把每个Passager对象以二进制形式存到文件中,然后再读出来,但是读出时出错,是不是seat_num这个指针的问题呀??指针能不能存到二进制文件中呀??如果以文本形式存又该怎么存??有没有什么好的解决办法??
无助的TOM 2013-01-02
  • 打赏
  • 举报
回复
明白了,多谢多谢
dataxdata 2013-01-02
  • 打赏
  • 举报
回复
指针是内存中的地址,存到文件中没有意义,要把指针指向的内容保存到文件中
dataxdata 2013-01-01
  • 打赏
  • 举报
回复
上面函数少了一句 return *this; 呵呵
dataxdata 2013-01-01
  • 打赏
  • 举报
回复
原因是AddNode中的这一句 p->ele=ele 由于没有重载赋值运算符,所以用了缺省的赋值运算,直接复制了指针seat_num,造成两个Passager元素公用一个指针,到DelNode的时候,就把seat_num删除了,在析构的时候再次删除,就出错了 重载一下赋值运算符就可以了 Passager &operator=(const Passager p) { strcpy(name, p.name); 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]; }

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧