链接列表插入行为

时间:2016-09-23 14:10:44

标签: c linked-list

昨晚我在C代码中发现了一些奇怪的行为。 我有一些用于创建和操作C链接列表的基本函数。 我插入第n个位置的行为虽然很奇怪。

第一个版本工作正常,但第二个版本根本不会插入到列表中。我错过了什么吗?

//This works fine
void insert_nth(struct node** head, int data, int n_pos){
    if (n_pos == 0){
        insert_top(head, data);
        return;
    }
    struct node* current = *head;
    for(int i = 0; i < n_pos - 1 ; i++){
        if(current == NULL) return;
        else current = current->next;
    }
    if(current == NULL) return;
    insert_top(&(current->next), data);
}

//This doesn't insert at all
void insert_nth(struct node** head, int data, int n_pos){
    if (n_pos == 0){
        insert_top(head, data);
        return;
    }
    struct node* current = *head;
    for(int i = 0; i < n_pos ; i++){
        if(current == NULL) return;
        else current = current->next;
    }
    if(current == NULL) return;
    insert_top(&(current), data);
}

以下是我用作参考的其他功能。

int main(){
    struct node* head = NULL;
    build_rand_list(&head);
    list_print(&head);
    return 0;
}

void list_print(struct node** head){
    printf("List size is %d: List: ", list_length(head));
    for(struct node* current = *head; current!= NULL; current = current->next)
        printf("%d ", current->data);
    printf("\n");
}

void build_rand_list(struct node** head){
    //Assume head is NULL
    assert(*head == NULL);
    srand(time(NULL));
    for (int i = 0; i < 10; i++){
        int random_num = rand() % 11;
        insert_end(head, random_num);
    }
}

void insert_top(struct node** head, int data){
    struct node *new_node = (struct node *)malloc(sizeof(struct node));
    new_node->data = data;
    new_node->next = *head;
    *head = new_node;
}

2 个答案:

答案 0 :(得分:1)

&(current)是局部变量的地址 &(current->next)是列表中节点内指针的地址。

修改current最终所做的局部变量insert_top对列表的节点没有影响。

答案 1 :(得分:0)

例如,如果将值为2的节点传递给insert_top函数,结果将是这样的

Linked list pointers

好像你没有正确处理指针。例如,没有指向您创建的新节点的节点。

更好的实施方式是

void insert_nth(struct node *head, int data, int npos) {
    struct node *current = head;

    for (int i = 0; i < npos - 1; i++) {
        current = current->next;

        if (current == null) {
            printf("%s\n", "Insert failed");
            return;
        }
    }

    struct node *new_node = (struct node *)malloc(sizeof(struct node *));
    new_node->data = data;
    new_node->next = current->next;
    current->next = new_node;

    return;
}

head参数是列表的实际头部。 结果将使我更满意。希望这会有所帮助。

Correct linked list pointers