我的问题是从链表中删除重复项。但我想在添加到链表之前这样做。
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上。我不知道出了什么问题?或者还有另一种方法可以做到这一点。
答案 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
方法很有用:
int keySearch(mystr *p, int value)
,查看p
的{{1}},如果找到,则返回value
(非零数字)true
,查看int keySearch(mystr *p)
以查找任何重复项并删除它们。但是,这并不会在每个追加上调用,并且上面的实现表明这不是您想要做的。无论如何,要做到这一点还有很多工作要做。p
的方法int keySearch(mystr *p)
,查看p
中的第一个值是否重复,如果是,则返回q
。这似乎是你的方法试图做的事情。根据方法的签名,您尝试执行#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