Возможно ли в односвязном списке сделать ввод/удаление элементов в конец/из конца списка?

Рейтинг: 0Ответов: 1Опубликовано: 22.03.2023

Я знаю (но пока не понял реализацию), что с помощью двух указателей (то есть реализовать уже двусвязный список) сделать ввод/удаление элементов в конец/из конца списка возможно.

Но как это сделать в односвязном списке БЕЗ перебора элементов в поисках конца списка(условие задачи)? Если все же сделать без двух указателей это невозможно, то сильно ли изменится оставшийся код программы? Удалось сделать эти действия только в начало списка:

struct person
{
    char secondname[30];
    int math, rus, eng;
};
typedef struct person DataType;
struct node
{
    DataType data;
    struct node* head;
    //struct node* tail;
    struct node* next;
}
.....
list new_node(list begin, DataType person)
{
    list temp = (list)malloc(sizeof(struct node));
    temp->data = person;
    temp->next = begin;
    return temp;
}
.....
list delete_node(list begin)
{
    system("CLS");
    struct node* temp;
    if (begin)
    {
        temp = begin;
        begin = begin->next;
        free(temp);
        puts("Удалено");
        system("pause");
    }
    return begin;
}

Ответы

▲ 2Принят

Можно хранить адрес последнего узла, но для его получения придётся всё равно хоть раз список пробежать.

И постоянно заботиться об его актуальности: добавили в конец - обновили last

P.S.
Однако удаление последнего узла всё равно потребует поиска предыдущего проходом с начала.