标题:求助 链表操作异常退出
只看楼主
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
结帖率:60%
已结贴  问题点数:20 回复次数:5 
求助 链表操作异常退出
   while (tp != NULL) {
        if (memcmp(tp->data, str, slen) == 0) {
            tp->number++;
            return tp;
        }
        if(tp->next==NULL)break;
        tp = tp->next;//如果不加上一句判断,而next为NULL会直接退出程序,看不出哪里越界了.
    }
编译环境 DEV C++ 4.9.9
gcc version 3.4.2 (mingw-special)

[ 本帖最后由 ljw970243 于 2013-1-4 11:14 编辑 ]
搜索更多相关主题的帖子: version return 
2013-01-04 10:52
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:20 
while (tp != NULL) {
         if (memcmp(tp->data, str, slen) == 0) {
             tp->number++;
             return tp;
         }
         // if(tp->next==NULL)break; 这句是没有必要的
         tp = tp->next;// 这句一定要的,同时要确保最后一个节点的next 为null,也就是说这个链表初始化一定要正确。
         // 我估计你的最后一个节点不是null结尾?

     }

我行我乐
我的博客:
http://blog.yuccn. net
2013-01-04 12:17
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:0 
tp = tp->next ,当tp的next为null了的时候,执行这句就已经赋给了tp了,下一次while的时候就会不进入循环了。不会做成越界。除非你的链表本身就是没有初始化好的,

我行我乐
我的博客:
http://blog.yuccn. net
2013-01-04 12:19
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
得分:0 
回复 2楼 yuccn
while (tp != NULL) {
        if (memcmp(tp->data, str, slen) == 0) {
            tp->number++;
            return tp;
        }
        printf("P:%p,N:%p\t",p,p->next);//每次执行到这一行都能打印出来 P:003E2540,N:00000000
        tp = tp->next; //如果不加上一句判断,而next为NULL会直接退出程序,看不出哪里越界了.
        printf("P:%p,N:%p\n",p,p->next);//这一行从来没有显示,因为程序已经退出了.

    }
2013-01-04 14:10
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
得分:0 
程序代码:
sd* sd::insd(char *str) {
    sd* tp = this;
    int slen, tlen = strlen(str);
    for (slen = 0; slen < tlen; slen++) {
        if (*(str + slen) == 32 || *(str + slen) == ']')break;
        if (*(str + slen) > 64 && *(str + slen) < 91)*(str + slen) += 32;
    }
    if (slen <= 2)return NULL;
    if (len == 0) {
        memcpy(data, (const char*) str, slen);
        data[slen] = 0;
        len = slen;
        return this;
    }
    while (tp != NULL) {
        if (memcmp(tp->data, str, slen) == 0) {
            tp->number++;
            return tp;
        }
        if (tp->next == NULL)break; //感觉这一行没有必要加上,但没有这一行就会导致程序异常退出,是在搞不明白.
        tp = tp->next;
    }
    sd *newp = new sd;
    if (newp == NULL)return NULL;
    tp->next = newp;
    memcpy(newp->data, (const char*) str, slen);
    newp->data[slen] = 0;
    newp->len = slen;
    return newp;
}


[ 本帖最后由 ljw970243 于 2013-1-4 14:13 编辑 ]
2013-01-04 14:12
ljw970243
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:105
注 册:2011-8-20
得分:0 
晕,搞了半天,原来是错在另一个地方了.
过几天在结吧,看看有没有人发现.
2013-01-04 15:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-394989-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.264908 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved