Передать адрес последнего элемента списка в функцию, для вставки нового элемента, по адресу последнего

помогите, пожалуйста.

Как, получив адрес последнего элемента в функции AddrLast, вставить в конец списка по этому адресу новый элемент, используя функцию InsertAddr?

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <assert.h>

typedef struct Node {
    int field;
    struct Node* prev;
    struct Node* next;
} tNode;



void AddElemEnd(tNode** head, int NewField) {
    tNode* Elem;
    Elem = malloc(sizeof(tNode)); // Выделяем память под узел , создаем узел
    assert(Elem);// Проверяем выделение памяти
    Elem->field = NewField; // Присваивание значения узлу
    Elem->next = NULL; // Следующий - ноль
    if (!*head) {
        Elem->prev = NULL;
        *head = Elem;
    } else {
        tNode* last = *head;
        while (last->next != NULL)
            last = last->next; // Сдвигаем голову списка
        Elem->prev = last;
        last->next = Elem;
    }
}

void Reverse(tNode **head) {
    tNode *curr = *head; //Текущий - голова списка
    while (curr->next) { // Пока не дойдем до конца списка
        tNode *Elem = curr->prev;
        tNode *Neib = curr->next;
        curr->prev = curr->next; // Меняем ссылки местами (следующий становиться предыдущим)
        curr->next = Elem; // Устанавливаем ссылку на следующий
        curr = Neib;
    }
    tNode *Elem = curr->prev;
    curr->prev = curr->next; // Меняем ссылки местами (следующий становиться предыдущим)
    curr->next = Elem; // Ус
    *head = curr;
}

void AddrFirst(tNode **head) {
    tNode *p = *head;
    if (p == NULL) {
        return;
    } else {
        printf("%p ", &p->field);
    }
}
void *AddrLast(tNode **head) { 
    tNode *p = *head;
    tNode *n;
    n = p;
    do {
        n = p;
        p = n->next;
    } while (p);
        printf("%p ", &n->field);
    //return n;
}

void InsertAddr(tNode **AddrLast, int Newfield) {
    tNode *NewElem = malloc(sizeof(NewElem));
    NewElem->field = Newfield;
    NewElem->next = NULL;
    NewElem->prev = (*AddrLast);
    (*AddrLast)->next = NewElem;// Добавить ссылку от головы списка к новому элементу 
}

void FreeMemory(tNode *head) {
    while (head) {
        tNode *next = head->next;
        free(head);
        head = next;
    }
}

void PrintFunc(tNode *head) {
    tNode *p = head;
    while (p != NULL) {
        printf("%d ", p->field);
        p = p->next;
    }
    printf("\n");
}

int main() {
    setlocale(LC_ALL, "Russian");
    tNode *head = NULL;
    int c, d, val, in, ne;
    printf("Number of elements\n");
    scanf("%d", &d);
    for (int i = 0; i < d; i++) {
        printf("Input %d th element ", i);
        scanf("%d", &val);
        AddElemEnd(&head, val);
    }
    PrintFunc(head);
    AddrFirstLast(&head);
    AddrLast(&head);
    Reverse(&head);
    PrintFunc(head);
    printf("Add element\n");
    scanf("%d", &in);
    InsertAddr(&AddrLast, in);
    PrintFunc(head);
    FreeMemory(head);
    return 0;
}

Ответы (0 шт):