在链表中搜索元素

问题描述 投票:0回答:1

我想在存储名称的链表中搜索,我创建了该函数,但是如果找到或找不到元素则输出的

printf
语句不打印任何内容。代码似乎是正确的,我试图逐行调试它,但我无法弄明白。

函数如下:

void exist(Name **head) {
    Name *ptr = malloc(sizeof(Name));
    printf("Enter your name to search:\n");
    fgets(ptr->name, 50, stdin);
    Name *p = *head;
    bool found = false;
    while (p != NULL) {
        if (strcmp(ptr->name, p->name) == 0) {
            printf("Node found\n");
            found = true;
            break; 
        }
        p = p->next;
    }
    if (!found)
        printf("Node not found\n");
}

和结构:

 typedef struct Name { 
     char name[50];
     struct Name *next;
 } Name;

这是

main
功能:

int main() {
    Name *head = NULL;
    Name *newNode = malloc(sizeof(Name));
    strcpy(newNode->name, "John");
    newNode->next = NULL;
    exist(head);
}
c linked-list c-strings singly-linked-list function-definition
1个回答
1
投票

函数

fgets
可以将新行字符
'\n'
追加到输入的字符串中,该换行符对应于您应该删除的按下的Enter键。例如

void exist(Name **head){
    Name *ptr = malloc(sizeof(Name));
    printf("Enter your name to search:\n");
    fgets(ptr->name, 50, stdin);
    ptr->name[ ( strcspn( ptr->name, "\n" ) ] = '\0';
    //...

但无论如何,按原样运行的功能是没有意义的。

对于初学者来说,由于这个声明它会产生内存泄漏

Name *ptr = malloc(sizeof(Name));

在函数内分配节点没有任何意义。此外, malloc 的调用可能会失败。在这种情况下,这样一个简单的函数将具有未定义的行为。

该功能不会向用户提出任何问题,也不会发布任何消息。函数的调用者会根据函数调用的结果来决定是发出消息还是做其他事情。

还不清楚为什么在调用函数时通过指向它的指针接受指向头节点的指针

exist(head);

代替

exist(&head);

从函数声明

void exist(Name **head);

完全不清楚到底存在什么。是指针头指向的节点存在还是别的?:)

可以通过以下方式声明和定义函数

int exist( const Name *head, const char *name )
{
    while ( head != NULL && strcmp( head->name, name ) != 0 )
    {
        head = head->next;
    }

    return head != NULL;
}

main
你可以写

int main( void ) 
{
    Name *head = malloc( sizeof( Name ) );
    strcpy( head->name, "John" );
    head->next = NULL;

    char name[50];

    printf("Enter your name to search:\n");

    fgets(name, sizeof( name ), stdin);
    name[ ( strcspn( name, "\n" ) ] = '\0';
    
    if ( exist( head, name ) )
    {
        puts("Node found");
    }
    else
    {
        puts("Node not found");
    }

    free( head );
}
© www.soinside.com 2019 - 2024. All rights reserved.