-4

我制作了这段代码来创建一个单词词典。每个单词只能存在一个;如果是,则相应的计数器增加。如果单词在字典中,strcmp()则调用该方法并交换指针。

我的问题是,当我的函数被调用时,它使用strcmp(),但每次我这样做时, *wordArr都没有被修改过。因此,每次代码运行时,它都会与自动 < 任何单词的 "" 进行比较。

有人能指出我正确的方向吗?

void placeWord(struct wordNode *words,char *tempW)
{
   int value;

    if(uniqueWordCount==0)  //HEAD
    {
       words = createNewWord(tempW);
    }   

    else ///SEARCHING AND AMMEND
    {
      while(1)
        {   
            value = strcmp(words->word,tempW);
            if(value<0)
            {
                words =createNewWord(tempW);
                (words-1)->next= words;
                words->prev = (words-1);
                break;
            }
            else if(value==0)
            {
                (words->howmany)++;
                wordCount++;
                break;
            }
         words=words->next;
            if(words->next!=NULL)
                break;
        }
    }
}
.
.
.
.
}

int main(){
.
.
.  struct wordNode *wordArr =(struct wordNode* )malloc(size * sizeof(struct wordNode));


   placeWord(wordArr,tempW);
.
.
.
}
4

1 回答 1

0

我相信最大的问题是你在 placeWord() 中对单词的分配。严格来说,所有参数在 C 中都是按值传递的。要模拟按引用传递,您需要在函数中传递对变量的引用并取消对它的引用。(也就是说,传入 &wordArr 并将你的 words 参数的类型更改为 struct wordNode **。)然后你可以将当前单词存储在一个变量中:

void placeWord(struct wordNode **words, char *tempWord) {
    struct wordNode *currWordNode = *words;

}

要实际更改列表头部的值,您必须这样做:

newHeadNode->next = *words;  // If there was a previous head node.
*words = newHeadNode;

另请注意,如果您不修改链表的头部,则必须跟踪前一个节点并将 prevNode->next 设置为您要插入的 wordNode。简单地分配给您用来跟踪列表中当前元素的变量是行不通的。

于 2012-07-15T03:51:25.740 回答