Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2023, 22:55   #1
Maria_Kim
 
Регистрация: 05.12.2022
Сообщений: 9
По умолчанию двусвязные списки

Здравствуйте, очень нужна помощь с написание программы на языке си(с функцией main)
двусвязные списки. Функции: добавление элемента в начало, конец, в n-ую позицию. Очистка всего списка, очистка n-ого элемента в списке.
Буду очень благодарна за помощь!
Maria_Kim вне форума Ответить с цитированием
Старый 11.02.2023, 01:24   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Можно поступить так:
1. Скачать книжку: Т.А. Павловская, С/с++. Программирование на языке высокого уровня.
Ищем в Сети.
Не знаю, можно ли так делать ссылку? Но вот:
http://cph.phys.spbu.ru›documents/First/books/7.pdf
Если "ругнётся", то жми кнопку "Найти"

2. Открываем её на стр. 115. Параграф "Линейные списки".
3. Изучаем код двунаправленного списка с его функционалом. При необходимости, далее по книге, можно найти и реализацию через класс (очень возможно потребуется)
4. Частью копируем в свой код и модифицируем под свои нужды.

Другой вариант Фриланс. Это разделом пониже. Там много не "дерут" вроде бы как.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.02.2023, 02:15   #3
Alex_andr
Пользователь
 
Регистрация: 08.12.2022
Сообщений: 23
По умолчанию

Сейчас попробую. Не судите строго

Последний раз редактировалось Alex_andr; 12.02.2023 в 02:17.
Alex_andr вне форума Ответить с цитированием
Старый 12.02.2023, 02:15   #4
Alex_andr
Пользователь
 
Регистрация: 08.12.2022
Сообщений: 23
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
struct node {
    int data;
    struct node* prev;
    struct node* next;
};
 
struct node* head = NULL;
struct node* tail = NULL;
 
// Функция для добавления элемента в начало списка
void add_to_start(int data) {
    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    new_node->data = data;
    new_node->prev = NULL;
    new_node->next = head;
    if (head != NULL)
        head->prev = new_node;
    head = new_node;
    if (tail == NULL)
        tail = new_node;
}
 
// Функция для добавления элемента в конец списка
void add_to_end(int data) {
    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    new_node->data = data;
    new_node->next = NULL;
    new_node->prev = tail;
    if (tail != NULL)
        tail->next = new_node;
    tail = new_node;
    if (head == NULL)
        head = new_node;
}
 
// Функция для добавления элемента в n-ую позицию
void add_to_position(int data, int position) {
    int i;
    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    struct node* temp = head;
    new_node->data = data;
    if (position == 1) {
        add_to_start(data);
        return;
    }
    for (i = 0; i < position - 2; i++) {
        temp = temp->next;
        if (temp == NULL) {
            printf("Позиция находится за пределами списка\n");
            return;
        }
    }
    new_node->next = temp->next;
    new_node->prev = temp;
    if (temp->next != NULL)
        temp->next->prev = new_node;
    temp->next = new_node;
}
 
// Функция для очистки n-ого элемента в списке
void clear_nth(int position) {
    int i;
    struct node* temp = head;
    if (head == NULL) {
        printf("Список пуст\n");
        return;
    }
    if (position == 1) {
        head = temp->next;
        head->prev = NULL;
        free(temp);
        return;
    }
    for (i = 0; i < position - 2; i++) {
        temp = temp->next;
        if (temp == NULL) {
            printf("Позиция находится за пределами списка\n");
            return;
        }
    }
    if (temp->next == NULL) {
        printf("Позиция находится за пределами списка\n");
        return;
    }
    temp->next->prev = temp->prev;
    temp->prev->next = temp->next;
    free(temp);
}
 
// Функция для очистки всего списка
void clear_list() {
    struct node* temp = head;
    while (head != NULL) {
        head = head->next;
        free(temp);
        temp = head;
    }
    tail = NULL;
}
 
// Функция для вывода списка
void display() {
    struct node* temp = head;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}
 
int main() {
    setlocale(LC_ALL, "Russian");
    add_to_start(1);
    add_to_start(2);
    add_to_end(3);
    add_to_end(4);
    add_to_position(5, 3);
    printf("Исходный список: ");
    display();
    clear_nth(3);
    printf("После очистки 3-го элемента: ");
    display();
    clear_list();
    printf("После очистки всего списка: ");
    display();
    return 0;
}
Надеюсь верно, сам только учусь
Alex_andr вне форума Ответить с цитированием
Старый 12.02.2023, 02:49   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
void add_to_position(int data, int position) {
    int i;
// Вот вы выделили память под структуру
//    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    struct node* temp = head;
//    new_node->data = data;
    if (position == 1) {
        add_to_start(data);
// А тут вы вышли из функции потеряв указатель на локальную структуру new_node
        return;
    }
    for (i = 0; i < position - 2; i++) {
        temp = temp->next;
        if (temp == NULL) {
            printf("Позиция находится за пределами списка\n");
// И тут вы вышли из функции потеряв указатель на локальную структуру new_node
            return;
        }
    }

// А стоит сделать вот так, чтобы не было утечки памяти
    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    new_node->data = data;

    new_node->next = temp->next;
    new_node->prev = temp;
    if (temp->next != NULL)
        temp->next->prev = new_node;
    temp->next = new_node;
}
А вот это выводит ваша программа.
онлайн компилятор
Цитата:
Исходный список: 2 1 5 3 4
После очистки 3-го элемента: 2 5 3 4
После очистки всего списка:
Третьим элементом оказалась 1
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязные списки Екатерина57 Помощь студентам 2 19.06.2016 23:03
Двусвязные списки RedWhiteCasual Паскаль, Turbo Pascal, PascalABC.NET 0 06.02.2014 09:01
Двусвязные списки на Си Kastiel94 Помощь студентам 9 22.05.2013 21:20
Двусвязные списки aidar9012 Помощь студентам 6 28.06.2010 02:05