回 帖 发 新 帖 刷新版面

主题:[讨论]这样删除整个链表对吗?

这是我在构造一个读取和记录玩家积分排行榜类时用到的部分链表操作,请问大家我这样做行吗?有没有问题呢?

部分代码如下:

...
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;  //删除头节点
    }
    
}

回复列表 (共8个回复)

沙发

安徽威诚网络科技有限公司是一家提供专业网站建设、网站设计、平面设计等网络业务和平面媒体设计的专业公司。为客户提供专业、快捷、周到的服务是我们始终不渝坚持的原则,是您实施网络计划与平面计划理想的合作伙伴。
我们的服务宗旨:价格最优、保证质量、客户至上、诚信第一
我们的服务范围:网站设计,平面设计、画册设计、LOGO设计、网站建设、域名注册、虚拟主机、服务器托管、企业邮局、网络推广、网络构架、企业咨询(策划咨询)、计算机软件开发等。


公司网站:http://www.0551web.com
QQ:56583752
QQ:903171302
TEL:0551-3521179
E-MAIL:weic518@hotmail.com
联系人:朱先生

板凳

气死人了,竟然在我满心期待回复的帖子里免费做广告啊!
感觉象一个纯洁的小女孩被龌龊的脏手摸遍了全身...

3 楼

好像不对啊

4 楼

有不对吗?至少我运行下没发现内存泄露,因为刚自学了链表就用在实践中了,所以我还是有点怀疑自己的算法,没有自信啊.

5 楼

应该没有问题。。。不过这个算法太浪费时间了吧?复杂度是O(n*n)吧?。。。为什么不直接顺次删除呢?只要在删除前记忆下一个节点就可以了吧?
在做什么游戏么?我对这方面也有些兴趣有机会能不能一起讨论讨论呢?

6 楼

你的意思是从表头开始删除吗?我还没搞懂时间复杂度的计算方法,不过看来你的方法要比我的快,不用每次都倒回表头处.
我做的是老游戏<记忆力锻炼>,主要是锻炼自己的编程能力的.用的是VC++6.0,已经基本完成了.链表在游戏里用来记录玩家的排行榜的.不过有时退出程序时会出错,应该还是链表的问题.
游戏包含了原代码和执行程序,要的话说一声.

7 楼


如果从头删除,大概是下面这样吧,没在机上试过:

myLink *p;

while ((p=head)!=NULL)
{            
    if (p->next!=NULL)
    {
        head = p->next;
        delete p;
        p = NULL;
    }
    else
    {
        delete p;
        head = p = NULL;
    }
}

8 楼

myLink *p;

while ((p=head)!=NULL)
{            
    if (p->next!=NULL)
    {
        head = p->next;
        delete p;
        p = NULL;         //这边貌似多余了呃。。。
    }
    else
    {
        delete p;
        head = p = NULL; //这边也多余了个p。。。省时间呵呵~
    }
}

有时间一定看看~不知道怎么联系呢?~也许把那个老游戏好好想想怎么创新下也很有意思呢~我最喜欢这样了。。那时改老游戏猜数字加了猜的位数的选择和次数选择还加了一些技能呵呵~还有那个商人的游戏也做过排行系统~不过那个就3个排行还没必要用链表呵呵~一起努力吧~

我来回复

您尚未登录,请登录后再回复。点此登录或注册