在添加-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
。看来这就是你的方法