C语言 正在获取删除所需链接列表元素的用户输入

3hvapo4f  于 2023-02-21  发布在  其他
关注(0)|答案(1)|浏览(106)
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,但如果它是那么我基本上会得到随机数。我不明白为什么会发生这种情况,我看了关于这个主题的大部分问题,但找不到原因。

jjhzyzn0

jjhzyzn01#

实际上,当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);
    }
    else
    {
        //...
    }
    return head;
}

也许在main中,您忘记将函数的返回值赋给指向头节点的指针,如

head = deleteNode( head, 1 );

否则,函数将具有未定义的行为,因为1)变量count未初始化,2)在while循环后未检查count + 1是否等于number

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 );

相关问题