在添加-C之前删除链表中的重复项

时间:2010-05-15 14:46:12

标签: c search

我的问题是从链表中删除重复项。但我想在添加到链表之前这样做。

struct myStr{int number; mystr *next;}
void append(mystr **q,int item)
{
myStr *temp;
temp = *q;
myStr *newone;
if(*q==NULL)// There should be control of previous elements. Call of keysearch function.
     {   temp = (myStr *)malloc(sizeof(myStr));

          temp->number =size;
          temp->next=NULL;
          *q=temp;
     }
     else //And also here
     {  temp = *q;
         while(temp->next !=NULL)
         {  temp=temp->next;
         }
         newone = (myStr *)malloc(sizeof(myStr));
         newone->count = size;
         newone->next=NULL;
         temp->next=newone;

     }
}
int keysearch (myStr *p)
{
struct myStr *temp = p;
int found = 0;
int key= p->number;
while (temp->next != NULL) 
 {
 if(temp->number == key)
    {
   return 1;
//break;
        }
     temp = temp->next;   
     }
    return 0;
    }

我的问题出在keySearch上。我不知道出了什么问题?或者还有另一种方法可以做到这一点。

3 个答案:

答案 0 :(得分:0)

这看起来有点可疑:

 if(temp->number == key)
    {
   found = 1;
    }
 temp = temp->next;   
 }
return found;
}

为什么return 1只要tmp->number == key?一旦找到匹配项,就没有理由继续循环(或者至少你粘贴的其余代码没有理由)。

另一件事是,我认为您希望测试while (temp->next != NULL),而不是将整数与NULL进行比较,尤其是在将temp分配给temp->next之前。

您还希望使用更多内容:

int keysearch (myStr *p, int key)

让调用者负责将值传递给搜索。

答案 1 :(得分:0)

“错误”是什么意思?

除此之外:

首先。 temp-> number是一个整数,您可能想要检查while语句中的下一个指针。

二。如果你指定temp = p并键入p->数字的值,那么在第一次迭代时,while循环中的while循环将始终为true。

第三。如果temp在while语句中无效,则可能导致崩溃。

答案 2 :(得分:0)

在您的代码中,您有2条评论希望调用keySearch。事实上,你只需要在一个地方 - 第二个评论。这是因为首先是你要创建一个全新的列表,所以你当然不需要担心它。

在第二种情况下,您要调用此keySearch方法。我能想到的有三种类型的keySearch方法很有用:

  1. 调用方法int keySearch(mystr *p, int value),查看p的{​​{1}},如果找到,则返回value(非零数字)
  2. 调用方法true,查看int keySearch(mystr *p)以查找任何重复项并删除它们。但是,这并不会在每个追加上调用,并且上面的实现表明这不是您想要做的。无论如何,要做到这一点还有很多工作要做。
  3. 调用查看p的方法int keySearch(mystr *p),查看p中的第一个值是否重复,如果是,则返回q。这似乎是你的方法试图做的事情。
  4. 根据方法的签名,您尝试执行#2或#3。但这两个都是错误的 - 他们假设你已经将副本添加到列表中。你应该做的是试图防止首先添加重复。但是,该方法没有足够的信息来做到这一点。它需要尚未添加的元素的值。

    我建议将方法更改为#1中的方法,然后传入想要添加的值。如果找到,则返回1.在true方法中,如果此函数的计算结果为1,则不要追加任何内容。否则追加新元素。

    append

    现在,当您要添加元素时,首先通过此方法运行它。如果方法返回1,请立即保留int keysearch(struct myStr *p, int value) { if(p == NULL) return 0; // reusing p is fine - it's a local variable while(p != NULL) { if(p->number == value) return 1; // return if value exists already p = p->next; // go to next element } return 0; } 方法 - 无需执行任何操作。如果它返回0,则append您的新节点并将其设置为列表的末尾。


    编辑:一个积极进取的代码匠可能希望略微优化,以便在每个malloc我们不会在整个列表中执行2个循环(一个用于append,并且然后一个找到实际追加的最后一个元素)。您可以通过稍微修改keySearch来完成此操作...

    keySearch