Вопрос задан 17.11.2023 в 21:50. Предмет Информатика. Спрашивает Вахитов Влад.

Нужна помощь! Даю максимальное количество баллов! Язык программирования си (с функцией main) . Надо

создать двусвязные списки. Функции: добавление элемента в начало, конец, в n-ую позицию. Очистка всего списка, очистка n-ого элемента в списке. Умоляю, помогите!!!! ​Если можно, то с объяснением, дам лучший ответ!!! ​
0 0
Перейти к ответам

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

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Коротков Никита.

Ответ:

#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);

З тебе краща відповідь

0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

Здравствуйте! Я могу помочь вам с созданием двусвязных списков на языке программирования C с функцией `main`.

Двусвязный список - это структура данных, состоящая из узлов, где каждый узел содержит элемент данных и два указателя: на предыдущий и следующий узлы. Вот пример программы, реализующей указанные вами функции:

```c #include #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` приведен пример использования этих функций для создания, изменения и вывода списка.

Надеюсь, эта информация помогла вам! Если у вас есть еще вопросы, не стесняйтесь задавать.

0 0

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос