获取用户输入以删除所需的链表元素

问题描述 投票:0回答:2
NodePointer deleteNode(NodePointer head,int number)
{
    NodePointer ptrNode;
    NodePointer ptrNodePrev;
    int count;
    if(head == NULL)
    {
        printf("There is no element at list");
    }
    if(number == 1)
    {
       ptrNodePrev=head;
       head=head->next;
       free(ptrNodePrev);
    }
    else{
        ptrNode=head;
        while(ptrNode->next != NULL && count+1 != number){
            count++;
            ptrNodePrev=ptrNode;
            ptrNode=ptrNode->next;
        }
        ptrNode=ptrNode->next;
        printf("Node: %d-%d-%d - %s",ptrNodePrev->next->x.year,
                                      ptrNodePrev->next->x.month,
                                      ptrNodePrev->next->x.day,
                                      ptrNodePrev->next->x.event);
        printf("Successfully deleted");
        free(ptrNodePrev->next);
        ptrNodePrev->next=ptrNode;
    }
    return head;
}

嗨,我一直在学习单链表,想做一个关于它的例子。基本上我要求用户输入他想要多少个节点,然后他填充它们。之后,我要求他们删除一个节点,然后他们将输入一个数字,据说该数字将删除相应的节点。如果输入的数字不是 1 也没关系,但如果是,那么我基本上会得到随机数。我不明白为什么会这样,我在这里查看了有关此主题的大部分问题,但找不到原因。有人可以解释我的错误吗?

c linked-list user-input
2个回答
0
投票

您的代码中的问题是您在 while 循环中使用它之前没有初始化 count 变量。尝试删除第一个节点时,这可能会导致未定义的行为。

要解决此问题,您可以在 while 循环之前将计数初始化为 1,如下所示:

int count = 1;

这样,当number为1时,第一个节点将被正确删除。

此外,最好在使用变量之前始终初始化变量以避免此类问题。


0
投票

实际上,当

number
等于
1
时,函数就可以正常工作了。

NodePointer deleteNode(NodePointer head,int number)
{
    NodePointer ptrNode;
    NodePointer ptrNodePrev;
    int count;
    if(head == NULL)
    {
        printf("There is no element at list");
    }
    if(number == 1)
    {
       ptrNodePrev=head;
       head=head->next;
       free(ptrNodePrev);
    }
    //...
    return head;
}

也许在 main 中你忘了把函数的返回值赋值给指向头节点的指针 like

head = deleteNode( head, 1 );

否则该函数具有未定义的行为,因为 1) 变量

count
未初始化,并且 2) 在这个 while 循环之后您没有检查指针
ptrNode
是否等于
NULL

    while(ptrNode->next != NULL && count+1 != number){
        count++;
        ptrNodePrev=ptrNode;
        ptrNode=ptrNode->next;
    }
    ptrNode=ptrNode->next;
    //...

注意C索引是从

0
开始的。函数的第二个参数应该是无符号整数类型,例如
size_t
。否则,允许用户向函数传递一个负值。

此外,该功能不应发出任何消息。

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

int deleteNode( NodePointer *head, size_t n )
{
    while ( n-- && *head != NULL ) head = &( *head )->next;

    int success = *head != NULL;

    if ( success )
    {
         NodePointer current = *head;
         *head = ( *head )->next;
         free( current );
    }

    return success;
}

如果在 main 中你有一个像这样的指针声明

NodePointer head = NULL;
//...

然后调用函数就像

deleteNode( &head, n );

其中

n
是指定列表中从 0 开始的索引的某个值。也就是说,如果你想删除第一个节点,那么你应该写

deleteNode( &head, 0 );
© www.soinside.com 2019 - 2024. All rights reserved.