主题:[讨论]这样删除整个链表对吗?
这是我在构造一个读取和记录玩家积分排行榜类时用到的部分链表操作,请问大家我这样做行吗?有没有问题呢?
部分代码如下:
...
SCORELIST *head,*p,*end;
//建立链表
SCORELIST *CMyFile::CreatLink(FILE *f)
{
head=end=new SCORELIST; //产生表头监督元节点
for(i=0;i<30;i++)
{
p=new SCORELIST;
if(f==NULL) //若无纪录文件则取默认数据
{
p->level =i/10+1;
p->order =i%10+1;
sprintf(p->name,"%s","匿名");
p->score =999;
}
else //反之则读取文件相关数据并记录到新节点
{
fscanf(fp,"%d",&p->level);
fscanf(fp,"%d",&p->order);
fscanf(fp,"%s",p->name);
fscanf(fp,"%d",&p->score);
}
end->next =p; //插在表尾处
end=p; //尾指针指向最后插入的节点
}
end->next =NULL;
return head;
}
//修改链表
void CMyFile::AmendLink(int insert,char hiname[256],int hiscore)
{
SCORELIST *h,*s,*p; //头指针,记忆指针,新节点指针
h=head;
s=head;
//建立待插入节点
p=new SCORELIST;
p->level=insert/10+1;
p->order =(insert-1)%10+1;
sprintf(p->name,"%s",hiname);
p->score =hiscore;
//新节点插入链表
for(i=0;i<insert-1;i++)
{
h=h->next; //指针移动到插入点前一节点
}
p->next=h->next;
h->next=p;
h=p; //指针指向新插入的节点
//新节点以后的节点order(名次)值加一
for(i=insert;i<10*(p->level);i++)
{
h->next->order++;
h=h->next;
} //循环结束时指针指向第九名节点
//删除相应级别最后的节点(第十名的)
s=h->next; //记住要删除的节点
h->next=s->next;
delete s;
WriteScoreListFile("HiScoreList.txt"); //把链表写入文件
}
//在构造函数中释放整个链表
CMyFile::~CMyFile()
{
SCORELIST *s,*p; //搜索指针,记忆指针
if(head!=NULL)
{
for(i=1;i<=30;i++)
{
p=s=head; //回到头节点
while(s->next!=NULL) //搜到链尾
{
p=s; //记住前个节点
s=s->next; //搜索指针下移
}
p->next=NULL; //使倒数第二的节点(记忆节点)为尾节点
delete s; //删除最末的节点
}
delete head; //删除头节点
}
}
部分代码如下:
...
SCORELIST *head,*p,*end;
//建立链表
SCORELIST *CMyFile::CreatLink(FILE *f)
{
head=end=new SCORELIST; //产生表头监督元节点
for(i=0;i<30;i++)
{
p=new SCORELIST;
if(f==NULL) //若无纪录文件则取默认数据
{
p->level =i/10+1;
p->order =i%10+1;
sprintf(p->name,"%s","匿名");
p->score =999;
}
else //反之则读取文件相关数据并记录到新节点
{
fscanf(fp,"%d",&p->level);
fscanf(fp,"%d",&p->order);
fscanf(fp,"%s",p->name);
fscanf(fp,"%d",&p->score);
}
end->next =p; //插在表尾处
end=p; //尾指针指向最后插入的节点
}
end->next =NULL;
return head;
}
//修改链表
void CMyFile::AmendLink(int insert,char hiname[256],int hiscore)
{
SCORELIST *h,*s,*p; //头指针,记忆指针,新节点指针
h=head;
s=head;
//建立待插入节点
p=new SCORELIST;
p->level=insert/10+1;
p->order =(insert-1)%10+1;
sprintf(p->name,"%s",hiname);
p->score =hiscore;
//新节点插入链表
for(i=0;i<insert-1;i++)
{
h=h->next; //指针移动到插入点前一节点
}
p->next=h->next;
h->next=p;
h=p; //指针指向新插入的节点
//新节点以后的节点order(名次)值加一
for(i=insert;i<10*(p->level);i++)
{
h->next->order++;
h=h->next;
} //循环结束时指针指向第九名节点
//删除相应级别最后的节点(第十名的)
s=h->next; //记住要删除的节点
h->next=s->next;
delete s;
WriteScoreListFile("HiScoreList.txt"); //把链表写入文件
}
//在构造函数中释放整个链表
CMyFile::~CMyFile()
{
SCORELIST *s,*p; //搜索指针,记忆指针
if(head!=NULL)
{
for(i=1;i<=30;i++)
{
p=s=head; //回到头节点
while(s->next!=NULL) //搜到链尾
{
p=s; //记住前个节点
s=s->next; //搜索指针下移
}
p->next=NULL; //使倒数第二的节点(记忆节点)为尾节点
delete s; //删除最末的节点
}
delete head; //删除头节点
}
}