如何在不破坏旧链表的情况下获得C中的Node



你好,我在"获取"节点时遇到了一些问题,到目前为止,我的代码看起来是这样的。。。

LinklistNode* get_node(LinklistNode* list_head, int index){
LinklistNode* temp = list_head;
if(temp != NULL && index > 0){
    LinklistNode* list_pointer = temp;
    LinklistNode* next_list_pointer = list_pointer ->next;
    while(next_list_pointer->next != NULL && index >0){
        index--;
        if(index == 0) break;
        list_pointer = next_list_pointer;
        next_list_pointer = next_list_pointer ->next;
    }
    temp = list_pointer->next;
    temp->next = NULL;

}
else if(index == 0){
    return temp;
}
return temp;
}

现在我试着给它传递一个完全相同的临时变量,但我认为这不起作用,因为它们只是共享相同的内存地址,我如下所述(也许这会有所帮助)

LinklistNode* list_head2 = list_head;
list_head2 = get_node(list_head2,2);
print_list(list_head2);
print_list(list_head);

这个输出看起来像这个

list_head before anything:list:8 100 7 6 5 3 200 2 1 0 1 2 3 4 5 6 7 8

list_head2调用方法后:list:7

list_head在调用方法后:list:8 100 7

所以我的问题是,我正在破坏list_heads的值,我不知道如何制作它,这样list_head的值和长度就不会改变。任何帮助都将不胜感激。

如果我理解正确,您需要以下

LinklistNode * get_node( LinklistNode *list_head, unsigned int index )
{
    while ( index != 0 && list_head )
    {
        --index;
        list_head = list_head->next;
    }
    return list_head;
}

原始列表未更改。

如果你需要提取一个节点,那么函数可以按照以下方式

LinklistNode * get_node( LinklistNode **list_head, unsigned int index )
{
    LinklistNode *prev = NULL, *current = *list_head;
    while ( index != 0 && current )
    {
        --index;
        prev = current; 
        current = current->next;
    }
    if ( prev == NULL )
    {
        if ( current ) *list_head = current->next;
    }
    else if ( current ) 
    {
        prev->next = current->next;
    }
    if ( current ) current->next = NULL;        
    return current;
}

如果你需要一个节点的副本,那么该功能可以看起来像

LinklistNode * get_node( LinklistNode *list_head, unsigned int index )
{
    LinklistNode *tmp = NULL;
    while ( index != 0 && list_head )
    {
        --index;
        list_head = list_head->next;
    }
    if ( list_head )
    {
        tmp = malloc( sizeof( LinklistNode ) );
        if ( tmp )
        {
            *tmp = *list_head;
            tmp->next = NULL;
        }
    }
    return tmp;
}

删除行时

 temp->next = NULL;

那么代码就可以随心所欲地工作了。

相关内容

  • 没有找到相关文章

最新更新