
Нужна помощь! Даю максимальное количество баллов! Язык программирования си (с функцией main) . Надо
создать двусвязные списки. Функции: добавление элемента в начало, конец, в n-ую позицию. Очистка всего списка, очистка n-ого элемента в списке. Умоляю, помогите!!!! Если можно, то с объяснением, дам лучший ответ!!! 

Ответы на вопрос

Ответ:
#include <stdio.h>
#include <stdlib.h>
typedef struct List List;
typedef struct Node Node;
struct List
{
unsigned int size;
Node* head;
Node* tail;
};
struct Node
{
int data;
Node* pNext;
Node* pPrev;
};
void init(List* list)
{
list->head = NULL;
list->tail = NULL;
list->size = 0;
}
void push_back(List* list, int data)
{
Node* new_node = (Node*) malloc(sizeof(Node));
if (new_node == NULL) return;
new_node->data = data;
new_node->pNext = NULL;
new_node->pPrev = NULL;
if (list->head == NULL)
{
list->head = new_node;
list->tail = new_node;
}
else
{
new_node->pPrev = list->tail;
list->tail->pNext = new_node;
list->tail = new_node;
}
list->size++;
}
void push_front(List* list, int data)
{
Node* new_node = (Node*) malloc(sizeof(Node));
if (new_node == NULL) return;
new_node->data = data;
new_node->pNext = NULL;
new_node->pPrev = NULL;
if (list->head == NULL)
{
list->head = new_node;
list->tail = new_node;
}
else
{
new_node->pNext = list->head;
list->head->pPrev = new_node;
list->head = new_node;
}
list->size++;
}
void insert(List* list, unsigned int index, int data)
{
if (index > list->size) return;
if (index == 0)
{
push_front(list, data);
return;
}
if (index == list->size)
{
push_back(list, data);
return;
}
Node* current = list->head;
for (unsigned int i = 0; i < index - 1; i++)
{
current = current->pNext;
}
Node* new_node = (Node*) malloc(sizeof(Node));
if (new_node == NULL) return;
new_node->data = data;
new_node->pNext = current->pNext;
new_node->pPrev = current;
current->pNext->pPrev = new_node;
current->pNext = new_node;
list->size++;
}
void deleteAt(List* list, unsigned int index)
{
if (list->head == NULL) return;
Node* current = list->head;
unsigned int counter = 0;
while (counter <= index)
{
if (counter >= list->size) return;
if (counter == index)
{
if (current->pPrev != NULL)
{
current->pPrev->pNext = current->pNext;
}
else
{
list->head = current->pNext;
}
if (current->pNext != NULL)
{
current->pNext->pPrev = current->pPrev;
}
else
{
list->tail = current->pPrev;
}
free(current);
list->size--;
break;
}
current = current->pNext;
counter++;
}
}
void deleteList(List* list)
{
Node* current = list->head;
while (current != NULL)
{
Node* next = current->pNext;
free(current);
current = next;
}
}
Объяснение:
В main: (приклад)
List name;
init(&name);
push_back(&name);
З тебе краща відповідь



Здравствуйте! Я могу помочь вам с созданием двусвязных списков на языке программирования C с функцией `main`.
Двусвязный список - это структура данных, состоящая из узлов, где каждый узел содержит элемент данных и два указателя: на предыдущий и следующий узлы. Вот пример программы, реализующей указанные вами функции:
```c
#include
// Определение узла списка typedef struct Node { int data; struct Node* prev; struct Node* next; } Node;
// Функция для создания нового узла Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->prev = NULL; newNode->next = NULL; return newNode; }
// Функция для добавления узла в начало списка void addFirst(Node** head, int data) { Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; } else { newNode->next = *head; (*head)->prev = newNode; *head = newNode; } }
// Функция для добавления узла в конец списка void addLast(Node** head, int data) { Node* newNode = createNode(data); Node* temp = *head; if (*head == NULL) { *head = newNode; } else { while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; newNode->prev = temp; } }
// Функция для добавления узла в n-ую позицию void addAtPosition(Node** head, int data, int position) { Node* newNode = createNode(data); Node* temp = *head; int i; if (*head == NULL && position == 0) { *head = newNode; } else if (*head == NULL && position != 0) { printf("Ошибка: список пуст\n"); } else { for (i = 0; i < position - 1; i++) { if (temp->next != NULL) { temp = temp->next; } else { printf("Ошибка: позиция превышает длину списка\n"); return; } } newNode->prev = temp; newNode->next = temp->next; temp->next = newNode; if (newNode->next != NULL) { newNode->next->prev = newNode; } } }
// Функция для очистки всего списка void clearList(Node** head) { Node* current = *head; while (current != NULL) { Node* temp = current->next; free(current); current = temp; } *head = NULL; }
// Функция для очистки n-ого элемента в списке void clearAtPosition(Node** head, int position) { Node* temp = *head; int i; if (*head == NULL) { printf("Ошибка: список пуст\n"); return; } if (position == 0) { *head = temp->next; free(temp); return; } for (i = 0; i < position; i++) { if (temp->next != NULL) { temp = temp->next; } else { printf("Ошибка: позиция превышает длину списка\n"); return; } } temp->prev->next = temp->next; if (temp->next != NULL) { temp->next->prev = temp->prev; } free(temp); }
// Функция для вывода списка на экран void printList(Node* head) { Node* temp = head; printf("Список: "); while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); }
// Функция main для демонстрации работы функций int main() { Node* head = NULL; addFirst(&head, 3); // Добавляем элемент 3 в начало списка addFirst(&head, 1); // Добавляем элемент 1 в начало списка addLast(&head, 5); // Добавляем элемент 5 в конец списка addAtPosition(&head, 2, 1); // Добавляем элемент 2 в позицию 1 printList(head); // Выводим список: 1 2 3 5 clearList(&head); // Очищаем список printList(head); // Выводим пустой список return 0; } ```
В этой программе сначала определяется структура узла списка, включающая данные и указатели на следующий и предыдущий узлы. Затем есть функции для создания нового узла, добавления элемента в начало, конец и на заданную позицию списка, очистки всего списка и очистки узла по указанной позиции.
В функции `main` приведен пример использования этих функций для создания, изменения и вывода списка.
Надеюсь, эта информация помогла вам! Если у вас есть еще вопросы, не стесняйтесь задавать.


Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili