C链表无法在开头添加元素

时间:2018-10-07 22:25:41

标签: c pointers

我对C语言还很陌生,所以我们有了一个专家,需要在程序中编写带有预定功能和参数的链表。 现在我遇到了一个问题,需要在列表的开头添加一个新元素,其他所有方法都可以使用,语法如下。

int main(){

    Vector3D foo;
    foo.x = 521;
    foo.y = 2;
    foo.z = 3;

    VectorList * head;
    head = create_VL(NULL, &foo);

    insertElementBack(head, &foo);
    foo.x = 456;
    insertElementBack(head, &foo);
    foo.x = 2;
    insertElementFront(head, &foo);
    print_list(head);
    printf("%d\n", size(head));

}

void insertElementFront(VectorList* l, Vector3D* v){

    VectorList *previous, *new_VL;

    previous = &l;

    new_VL = NULL;
    new_VL = malloc(sizeof(VectorList));

    new_VL -> value = *v;

    new_VL -> next = previous;

    l = new_VL;
}

VectorList *create_VL(VectorList* l, Vector3D* v) {

    VectorList* new_VL = (VectorList*)malloc(sizeof(VectorList));

    if(new_VL == NULL)
    {
        printf("Error creating a new node.\n");
        exit(0);
    }
    new_VL->value = *v;
    new_VL->next = l;

    return new_VL;
}

void insertElementBack(VectorList* l, Vector3D* v){

    VectorList *vl = l;

    while( vl -> next != NULL){
        vl = vl -> next;
    }

    VectorList *new_List = create_VL(NULL, v);
    vl -> next  = new_List;

}

不允许更改名称和参数,我可以使用双指针作为参数来解决此问题,但不允许这样做。 有人可以给我一个提示,我尝试了很多事情,但没有任何效果。

最佳

马丁

2 个答案:

答案 0 :(得分:0)

您确实应该包含VectorList的定义,而不是让我们猜测其结构,但是您的问题可能是这样的:

previous = &l;

l是指向VectorList的指针。通过执行&l,您将获取指针的地址,而不是VectorList。所以当你这样做

new_VL -> next = previous;

您的next指针现在指向该指针,而不是VectorList。实际上,您没有收到警告吗?不要忽略警告。

您的第二个更大的问题是head不会更新以反映新的头,并且如果不能使用双指针,则您唯一的解决方法是将新的头节点作为返回值返回来自insertElementFront

答案 1 :(得分:0)

void insertElementFront(VectorList* l, Vector3D* v){中 l是仅保存head地址的局部变量。在本地更改地址不会影响head变量。

您可以将head设为全局变量,并采用以下方式进行操作

void insertElementFront(VectorList* l, Vector3D* v){

    VectorList *new_VL;

    new_VL = NULL;
    new_VL = malloc(sizeof(VectorList));

    new_VL -> value = *v;

    new_VL -> next = l;

    head = new_VL
}

或者您可以返回头指针

VectorList* insertElementFront(VectorList* l, Vector3D* v){

    VectorList *new_VL;

    new_VL = NULL;
    new_VL = malloc(sizeof(VectorList));

    new_VL -> value = *v;

    new_VL -> next = l;

    return new_VL
}

head = insertElementBack(head, &foo);

更多信息请看 https://www.geeksforgeeks.org/how-to-write-functions-that-modify-the-head-pointer-of-a-linked-list/