Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在添加-C之前删除链接列表中的重复项_C_Search - Fatal编程技术网

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

在添加-C之前删除链接列表中的重复项,c,search,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

我的问题是如何从链表中删除重复项。但我想在添加到链接列表之前完成此操作

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;
    }

我的问题是钥匙搜索。我不知道怎么了?或者还有其他方法可以做到这一点。

这看起来有点可疑:

 if(temp->number == key)
    {
   found = 1;
    }
 temp = temp->next;   
 }
return found;
}
为什么不在
tmp->number==key
时立即返回1?一旦找到匹配项,就没有理由继续循环(或者至少粘贴的其余代码没有理由)

另一件事是,我认为您应该在(temp->next!=NULL)时测试
,而不是将整数与NULL进行比较,特别是在将
temp
赋值给
temp->next
之前

您还需要使用以下内容:

int keysearch (myStr *p, int key)

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

这看起来有点可疑:

 if(temp->number == key)
    {
   found = 1;
    }
 temp = temp->next;   
 }
return found;
}
为什么不在
tmp->number==key
时立即返回1
?一旦找到匹配项,就没有理由继续循环(或者至少粘贴的其余代码没有理由)

另一件事是,我认为您应该在(temp->next!=NULL)时测试
,而不是将整数与NULL进行比较,特别是在将
temp
赋值给
temp->next
之前

您还需要使用以下内容:

int keysearch (myStr *p, int key)
并让调用者负责将值传递给搜索。

您所说的“它错了”是什么意思

除此之外:

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

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

第三,。如果您的while语句中的temp无效,可能会导致崩溃。

您所说的“它错了”是什么意思

除此之外:

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

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


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

在代码中,您有两条注释,希望调用
keySearch
。事实上,你只需要在一个地方——第二条评论。这是因为第一个地方是你要创建一个全新的列表,所以当然没有什么你需要担心的

在第二种情况下,您希望调用此
keySearch
方法。我认为有3种类型的
keySearch
方法非常有用:

  • 调用一个方法
    int-keySearch(mystr*p,int-value)
    ,该方法在
    p
    中查找
    value
    ,如果找到,则返回
    true
    (非零数)
  • 调用一个方法
    int-keySearch(mystr*p)
    ,该方法通过
    p
    查找任何重复项并将其删除。但是,这不会在每个附加上调用,上面的实现表明这不是您想要做的。无论如何,要做到这一点需要做更多的工作
  • 调用一个方法
    int-keySearch(mystr*p)
    ,该方法通过
    p
    查看
    q
    中的第一个值是否重复,如果重复,则返回
    true
    。看来这就是你的方法要做的
  • 根据方法的签名,您正在尝试执行#2或#3。但这两个都是错误的——他们认为你已经将重复的内容添加到了列表中。您应该做的是,首先尝试防止添加重复项。不过,目前的方法没有足够的信息来实现这一点。它需要尚未添加的元素的值

    我建议将方法更改为#1中的方法,并传入您希望添加的值。如果找到,则返回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;
    }
    
    现在,当您准备添加一个元素时,首先用这个方法运行它。如果该方法返回1,请立即保留
    append
    方法-无需执行任何操作。如果返回0,则
    malloc
    创建新节点并将其设置为列表的末尾


    编辑:一个有进取心的代码制作人可能想稍微优化一下,这样在每个
    追加
    时,我们不会在整个列表中进行两次循环(一次用于
    键搜索
    ,然后一次用于查找实际追加的最后一个元素)。您可以通过稍微修改
    keySearch
    来完成此操作

    // returns NULL if p is empty / value exists; otherwise returns the last element
    struct myStr *keysearch(struct myStr *p, int value)
    {
       // same logic, different return values; integration into append changes too!
    }
    

    在代码中,有两条注释,您希望在其中调用
    keySearch
    。事实上,你只需要在一个地方——第二条评论。这是因为第一个地方是你要创建一个全新的列表,所以当然没有什么你需要担心的

    在第二种情况下,您希望调用此
    keySearch
    方法。我认为有3种类型的
    keySearch
    方法非常有用:

  • 调用一个方法
    int-keySearch(mystr*p,int-value)
    ,该方法在
    p
    中查找
    value
    ,如果找到,则返回
    true
    (非零数)
  • 调用一个方法
    int-keySearch(mystr*p)
    ,该方法通过
    p
    查找任何重复项并将其删除。但是,这不会在每个附加上调用,上面的实现表明这不是您想要做的。无论如何,要做到这一点需要做更多的工作
  • 调用一个方法
    int-keySearch(mystr*p)
    ,该方法通过
    p
    查看
    q
    中的第一个值是否重复,如果重复,则返回
    true
    。看来这就是你的方法