我编写这段代码是为了创建一个单词词典。每个单词只能存在一个;如果是,则相应的计数器递增。如果该单词在字典中,则调用 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);
.
.
.
}
最佳答案
我认为最大的问题是你在 placeWord() 中对单词的分配。严格来说,C 中的所有参数都是按值传递的。要模拟按引用传递,您需要传递对变量的引用,并在函数中取消引用它。 (也就是说,传入 &wordArr 并将单词参数的类型更改为 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。简单地分配给您用来跟踪列表中当前元素的变量是行不通的。
关于c - 再次通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11489103/