c语言 - 当 head 被删除并向前移动时,链表不会返回主函数



我目前被困在编码字典项目的这一部分。其他的我都能轻松搞定,但这里。

我的问题是,每当我通过这个特定的if语句后将字典(链表头)返回给main函数时,就会弹出一个异常。

    item *deleteEntry(item *entry, item *dictionary)
{
    item *cont,*temp;
    int check;
    check = 0;
    for (cont = dictionary; cont != NULL; cont = cont->next)
    {
        if (!strcmp(cont->word, entry->word) && cont == dictionary)
        {
            dictionary = cont->next;
            free(cont);
            check = 1;
            break;
        }
        //other non-problematic entry-deletion statements
    }
    if (!check)
        return 0;   
    return dictionary;
}

尽管它确实在函数中正确地存储了数据(我已经通过打印进行了测试),但当返回到主函数时,它就不起作用了。

这里是我调用函数

的部分
printf("nEnter word to delete entry: ");
            getchar();
            fgets(entry->word, WORDLIMIT, stdin);
            if (dictionary[toupper(entry->word[0]) - 65] == NULL)
                printf("nWord Does not exist");
            else
            {
                cont = deleteEntry(entry, dictionary[toupper(entry->word[0]) - 65]);
                if (cont)
                    dictionary[toupper(entry->word[0] - 65)] = cont;
                else
                    printf("nError: Word doesn't exist in archive %d!!n", toupper(entry->word[0]));

例外是:

访问冲突读取位置0xDDDDDDDD。(即使在谷歌搜索之后,我也不知道这是什么。请开导我)

这是我在这里的第一个帖子,所以我要借此机会说谢谢你,因为这是我遇到困难时第一个去的地方:)

问题解决了!

正如我所评论的,我认为关键是dictionary[toupper(entry->word[0] - 65)]这段代码导致访问指针数组越界。例如

entry->word[0] = 'a'
toupper(entry->word[0] - 65) = 32

但是我认为你的数组有26个元素。

必须是

dictionary[toupper(entry->word[0]) - 65]

/* this is part of your code. check comments added by me
*/ 
 for (cont = dictionary; cont != NULL; cont = cont->next /*->next can be null*/)
{
if (!strcmp(cont->word, entry->word) && cont == dictionary)
{
dictionary = cont->next; /*if ->next above is null than boom (null->null)*/
free(cont);
check = 1;
break;
}
//other non-problematic entry-deletion statements
}

/* better use this */
cont = dictionary->next;
while(cont){
    if(...){
        dictionary=cont->next;
        free(cont);
        break; /* or return something*/
    }
    cont=cont->Next;
}
/*return other thing*/

相关内容

  • 没有找到相关文章

最新更新