C связанный список не может добавить элемент в начале - PullRequest
0 голосов
/ 08 октября 2018

Я довольно новичок в 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 голосов
/ 08 октября 2018

In void insertElementFront(VectorList* l, Vector3D* v){ l - локальная переменная, которая просто содержит адрес заголовка.Локальное изменение адреса не влияет на переменную 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
}

или Вы можете вернуть указатель head

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/

0 голосов
/ 08 октября 2018

Вы действительно должны были включить определение VectorList вместо того, чтобы заставлять нас догадываться о его структуре, но ваша проблема, вероятно, заключается в следующем:

previous = &l;

l - указатель на VectorList,Делая &l, вы берете адрес указателя, а не VectorList.Поэтому, когда вы делаете это

new_VL -> next = previous;

, ваш next указатель теперь указывает на этот указатель, а не VectorList.На самом деле, вы не получили предупреждение об этом?Не игнорируйте предупреждения.

Ваша вторая и более серьезная проблема - head не обновляется, чтобы отразить новую голову, и без возможности использовать двойные указатели ваш единственный способ решения - вернутьновый головной узел в качестве возвращаемого значения от insertElementFront.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...