如何在链表中查找重复项?

时间:2018-05-22 14:48:49

标签: c linked-list

void duplicates()
{
    int count=0;
    struct node *temp=(struct node*)malloc(sizeof(struct node));
    temp=head;
    struct node *temp1=(struct node*)malloc(sizeof(struct node));
    temp1=head;
while(temp!=NULL)
{
    while(temp1!=NULL)
    {
        if(strcmp(temp->FN,temp1->FN)==0)
        {

            count++;
        }
        temp1=temp1->next;
    }
    if(count>1)
    {
        printf("DUPLICATE FOUND: %s",temp->FN);
    }
    count=0;
    temp=temp->next;
}
}

我试图从链接列表中找到重复项并且无法通过我的函数找到它,我已经检查过链接列表是否已将所有数据存储在print()函数中,所以我认为问题在于我找到重复的逻辑。 谢谢

1 个答案:

答案 0 :(得分:2)

你错过了代码中的一条关键线(或者把它放在错误的位置)。

当您循环内循环时,永远不会重置temp1以再次指向列表的开头。

void duplicates()
{
    int count=0;
    struct node *temp;
    struct node *temp1;
    temp=head;
    while(temp!=NULL)
    {
        temp1=head;
        count=0;
        while(temp1!=NULL)
        {
            if(strcmp(temp->FN,temp1->FN)==0)
            {

                count++;
            }
            temp1=temp1->next;
        }
        if(count>1)
        {
            printf("DUPLICATE FOUND: %s",temp->FN);
        }
        temp=temp->next;
    }
}

您不需要为temptemp1分配内存,因为它们将指向为您的列表分配的内存。

我还将count=0的重置移到内循环之前,因为在内循环之前准备事物而不是之后重置它们是有意义的。