2017-10-07 66 views
2

我一直在试图在2个链表中搜索常用词。C两个链表搜索

我为此写了一个简单的方法。

代码

void search(node *first1, node *first2){ 

while(first2 != NULL){ 

    while(first1 != NULL){ 
     if(first1 -> string == first2 -> string){ 
      printf("%s\n", first1 -> string); 
     } 

     first1 = first1 ->next; 
    } 

    first2 = first2 ->next; 
} 
} 

first1和first2两个文件的linkedlists的头。

first2第一个元素是“是。”。输出给我27“是。”“没有别的。而27是前11个元素的数量。

+3

'strcmp' for strings? –

+1

这两个列表是否已分类? – wildplasser

+0

@EdHeal我现在用这个。没有区别 –

回答

4

完成while(first1 != NULL)循环后,您first1指针总是指向NULL,因此后续while(first2 != NULL)循环迭代总能找到first1 == NULL

为了解决这个问题,你应该“输入功能时的价值:

void search(node *first1, node *first2){ 

node *first1_head = first1; // <- keep track of the first element in first1 

while(first2 != NULL){ 
    while(first1 != NULL){ 
     if(first1 -> string == first2 -> string){ 
      printf("%s\n", first1 -> string); 
     } 

     first1 = first1 ->next; 
    } 

    first1 = first1_head; // <- restore first1 to point to its first element 
    first2 = first2 ->next; 
} 

此外,根据string”留住first1 S型,你应该使用正确的字符串比较函数。

+0

抱歉打扰你,我有一个问题。我使用了strcmp,但问题仍然存在。它给出891“**是。**”是指27 * 33。 33是第二个链表中元素的个数。不知何故,程序总是找到相同的元素,“**是。**”不是一个普通的词。 if语句有错误。 –

+0

@ M.Aktas:您需要提供一个MCVE([MCVE]),以便我们能够看到您如何创建列表以及发生了什么。你可以向MCVE提出一个新问题,展示你从这个问题中学到了什么。正如在这个答案中指出的,你需要使用'strcmp()'或类似的比较字符串;使用'first1-> string == first2-> string'来检查这些指针是否指向同一个地方(如果他们不指定这个地方,可以说是未定义的行为,但这就是“多少个天使可以在引脚上跳舞”这个悖论现在不需要关注)。 –

+0

@ M.Aktas正如上面这篇评论所提到的,你需要向我们展示你如何定义'node'以及如何将元素添加到'first1'和'first2',最好在一个新问题中为清楚起见。 – frslm