我想创建一个列表来保存名称,但如果列表中已存在名称,我会忽略具有相同名称的新元素。 我无法添加第二个元素:gdb 是这么说的
Program received signal SIGSEGV, Segmentation fault.
0x0000555555554c20 in search (nome=0x5555557576d0 "carl")
at desktop/test.c:*line*
*line* while(strcmp(nome,temp->name)!=0&&f==0){
如果搜索的元素不在列表中,则搜索函数应返回 NULL。
typedef struct node{
char *name;
struct node *n;
} N;
N *h=NULL;
void insert(char *name){
N *temp=malloc(sizeof(N));
if(h==NULL){
h=temp;
temp->n=NULL;
temp->name=strdup(name);
}
else{
N *curr=h;
while(curr->n!=NULL)
curr=curr->n;
curr->n=temp;
temp->name=strdup(name);
}
}
N *search(char *name){
N *temp=h;
int f=0;
if(temp==NULL)
return NULL;
else{
while(strcmp(nome,temp->name)!=0&&f==0){
temp=temp->n;
if(temp==NULL)
f=1;
}
if(f==1)
return NULL;
else
return temp;
}
}
int main(){
char *name=//getting input without problems;
N *temp=esearch(name);
if(temp==NULL)
insert(name);
//this four lines sequence repeats for every input (stdin)
}
最佳答案
在 insert
你忘记设置最后一个节点的“下一个”指针 n
至NULL
.
另一个问题是你的 search
函数不检查 temp
按正确的顺序是空指针。
我建议你将代码更改为类似的内容
else
{
while (temp != NULL && strcmp(nome, temp->name) != 0)
{
temp = temp->n;
}
return temp;
}
经过上述更改,如果您超出了列表末尾并且 temp
变成NULL
然后循环将结束,您将返回 NULL
( temp
在这种情况下将是 NULL
)。
如果找到该名称,则循环结束并 temp
将指向该节点,并且您将返回该节点。
您的代码将不起作用,因为逻辑 AND ( &&
) 将首先执行左侧表达式,然后您将取消引用空指针 temp
导致未定义的行为和可能的崩溃。
使用调试器应该很容易找出这两个问题。
可以通过使用调试器在监视变量及其值的同时单步执行代码来发现第一个问题。那么应该很容易发现n
成员将具有一些“随机”或“垃圾”值(该值不确定)。
第二个问题应该可以通过使用调试器捕获崩溃并查看指针 temp
来解决。将是NULL
在 strcmp
称呼。然后重新启动程序,再次逐行单步执行代码,很容易看到指针何时变为 NULL
。了解如何&&
运算符的工作原理及其工作方式 short-circuit性质导致左侧总是首先被评估,这也有助于理解。
关于c - 为什么无法在此列表中添加第二个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57822614/