【问题标题】:Getting empty length获取空长度
【发布时间】:2015-01-18 07:01:11
【问题描述】:

这个函数是我将节点连同它的数据插入到链表中的地方。

void insertNodeAndWord(struct ListNode ** pointerToHead, char word[16]) {
    struct ListNode * newNode = (struct ListNode *)malloc(sizeof(struct      ListNode));
    newNode->word = word;
    newNode->next = NULL;

    //printf("%s\n", newNode->word); // Prints out the correct words when i     try to print from here.

    if(*pointerToHead == NULL) {
        newNode->next = *pointerToHead;
    }
    *pointerToHead = newNode;
}

这个函数是我从boggle board获取所有单词的地方(这个函数似乎工作正常,因为当我在这里打印出单词时,它会正确打印出来。

struct ListNode * getAllWords(char currWord[16], int x, int y, const char     board[4][4], int check[4][4], struct ListNode * list) {
    if(x<0||y<0||x>=4||y>=4) { //base case
        return list;
    } else if (check[x][y] == 0) {
        char newWord[16];
        strcpy(newWord, currWord);
        if(isPrefix(newWord) == 0) {
            return list;
        }
        int length = strlen(newWord);
        newWord[length] = board[x][y];
        newWord[length+1] = '\0';

        if(isWord(newWord) != 0) {
            insertNodeAndWord(&list, newWord);
            //printf("%s\n", list->word); // Prints out the correct words when i try to print from here.
            printf("Length: %d\n", listLength(list)); // Prints out 1 every time.
        }
        int row, col;
        for(row =-1; row<=1; row++) {
            for(col=-1; col<=1; col++) {//
                check[x][y] = 1; //marks the board tile as visited
                getAllWords(newWord, x+row, y+col, board, check, list);
                check[x][y] = 0; //unmarks the board tile as visited
            }
        }
    }
    return list;
}


struct ListNode * findWords(const char board[4][4]) {
    int x, y;
    int check[4][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0,    0}};
    char word[16] = "";
    struct ListNode * list;
    list = NULL;
    for(x=0; x<4; x++) {
        for(y=0; y<4; y++) {
            getAllWords(word, x, y, board, check, list);
            // printf("%s\n", list->word); // I get a "has stopped working" error here when i try to print out the words.
        }
    }
    return list;
 }

【问题讨论】:

    标签: c matrix linked-list boggle


    【解决方案1】:

    我看到的问题:

    问题 1

    newNode->word = word;
    

    不对。链表中的每个节点都会存储一个指向同一个节点的指针 从getAllWords 传递的内存块。更糟糕的是,那块 内存对应于getAllWords 中的函数局部变量,一旦您从getAllWords 返回,该变量将不再有效。你最终会 节点指向悬空内存。

    你需要类似的东西

    newNode->word = strdup(word);
    

    问题 2

    不清楚insertNodeAndWord是否应该在 列表末尾或列表开头。

    如果你想在列表的开头添加它,你的函数可以是:

    void insertNodeAndWord(struct ListNode ** pointerToHead, char word[16]) {
       struct ListNode * newNode = malloc(sizeof(struct ListNode));
       newNode->word = strdup(word);
       newNode->next = *pointerToHead;
       *pointerToHead = newNode;
    }
    

    如果要将新节点添加到列表的末尾,逻辑是 更多的参与。

    问题 3

    您没有使用getAllWords 的返回值,它被调用。

    换行(getAllWords

            getAllWords(newWord, x+row, y+col, board, check, list);
    

            list = getAllWords(newWord, x+row, y+col, board, check, list);
    

    换行(findWords

         getAllWords(word, x, y, board, check, list);
    

         list = getAllWords(word, x, y, board, check, list);
    

    杂项

    作为一种良好的编程习惯,请始终检查从malloc 返回的值。这样,您就可以避免取消引用 NULL 指针的不良后果。

    struct ListNode * newNode = malloc(sizeof(struct ListNode));
    if ( newNode == NULL )
    {
       // Deal with error condition.
       // This is one way to deal with it - print an error message and exit.
       perror("Unable to get memory for a ListNode.\n");
       exit(EXIT_FAILURE);
    }
    

    【讨论】:

    • 感谢您的快速评论,您指出的观点是有道理的。但是,我仍然在 test_findWords 函数中获得大小为 0 的链表。对于问题 2:无论是 end 还是 front 都可以。
    • @RSahu curious:你的答案通常都很好,但你为什么不给 OP 建议不要检查malloc 的返回值?
    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多