注册 登录
编程论坛 C++教室

求助 链表操作异常退出

ljw970243 发布于 2013-01-04 10:52, 332 次点击
   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 编辑 ]
5 回复
#2
yuccn2013-01-04 12:17
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结尾?

     }
#3
yuccn2013-01-04 12:19
tp = tp->next ,当tp的next为null了的时候,执行这句就已经赋给了tp了,下一次while的时候就会不进入循环了。不会做成越界。除非你的链表本身就是没有初始化好的,
#4
ljw9702432013-01-04 14:10
回复 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);//这一行从来没有显示,因为程序已经退出了.

    }
#5
ljw9702432013-01-04 14:12
程序代码:
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 编辑 ]
#6
ljw9702432013-01-04 15:38
晕,搞了半天,原来是错在另一个地方了.
过几天在结吧,看看有没有人发现.
1