c - 为什么无法在此列表中添加第二个元素?

标签 c linked-list

我想创建一个列表来保存名称,但如果列表中已存在名称,我会忽略具有相同名称的新元素。 我无法添加第二个元素: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你忘记设置最后一个节点的“下一个”指针 nNULL .

<小时/>

另一个问题是你的 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 来解决。将是NULLstrcmp称呼。然后重新启动程序,再次逐行单步执行代码,很容易看到指针何时变为 NULL 。了解如何&&运算符的工作原理及其工作方式 short-circuit性质导致左侧总是首先被评估,这也有助于理解。

关于c - 为什么无法在此列表中添加第二个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57822614/

相关文章:

data-structures - 具有不安全 Rust 的链表会泄漏内存

c - 为什么函数调用不是左值

c - 为什么samples/bpf 中的ebpf 程序不起作用?

c - Linux;如果您不是 root,请将 UID 更改为 root

c - 作为给定示例,从第一次出现的位 1 开始设置给定数字的位的逻辑?

Leetcode中ListNode的Python逻辑

c - unsigned char Pixel_intensity[] 到图像; C 代码、Linux

c - 运行时错误和错误答案链表

C - 使用链表和无序数组进行插入排序

java - 排序算法中的程序中断 block