Покажите пример, как удалить определенный элемент в структуре - C (СИ)
Формулировка задачи:
количество элементов не задано
с помощью функции free и указателей
Решение задачи: «Покажите пример, как удалить определенный элемент в структуре»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> typedef struct node { int data1; struct node* next; } stype_t; /* удалить вектор */ void vector_delete(stype_t* head) { stype_t* t; while (head) { t = head->next; free(head); head = t; } } /* говноисключение */ void do_exeption(stype_t** head, const char* msg, int exit_flag) { fprintf (stderr, "%s\n", msg); if (exit_flag){ vector_delete (*head); exit(EXIT_FAILURE); } } /* удалить звено по номеру. Нулевое звено считается как первое */ void delete_item(stype_t** head, int num) { stype_t* t1, *t2; if ( !num ) { t1 = (*head)->next; free(*head); *head = t1; } else if( num < 0) do_exeption(head, "number less than zero!", 0); else { t1 = *head; while (num > 1 && t1) { t1 = t1->next; --num; } if (t1) { t2 = t1->next; t1->next = t2->next; free(t2); } else do_exeption(head, "number is big!", 0); } } /* добавить звено */ int add_item( stype_t** head, stype_t **item, size_t s) { stype_t *t = malloc(s); if (!t) { do_exeption(head, strerror(errno), 1); return 0; } t->next = (stype_t*)NULL; if (!(*head)) { *head = t; *item = *head; } else { (*item)->next = t; *item = (*item)->next; } return 1; } /* распечатать вектор */ void dump_vector(stype_t* head) { stype_t* t = head; fputs("vetor are: ", stdout); while (t) { fprintf(stdout, "%3i", t->data1); t = t->next; } putchar('\n'); } int main() { int i = 0, ret; stype_t* head = NULL, *current = NULL; for (; i < 5; ++i){ ret = add_item(&head, ¤t, sizeof(stype_t) ); if ( !ret ){ /* vector_delete(head) NOTE: called in do_exeption() TODO */ return 1; } current->data1 = i; } dump_vector(head); delete_item(&head, 4); dump_vector(head); delete_item(&head, 1); dump_vector(head); delete_item(&head, 4); dump_vector(head); delete_item(&head, -2); dump_vector(head); delete_item(&head, 0); dump_vector(head); vector_delete(head); return 0; }
Объяснение кода листинга программы
- В коде используется структура данных
node
для представления элементов вектора. Каждый элемент содержит целочисленное значениеdata1
и указатель на следующий элементnext
. - Функция
vector_delete
удаляет все элементы вектора, начиная с заданного узла. Она использует циклwhile
для перебора всех элементов и вызова функцииfree
для каждого из них. - Функция
do_exeption
генерирует исключение в случае ошибки. Она выводит сообщение об ошибке в стандартный поток ошибок и, если флаг выхода установлен в 1, вызывает функциюvector_delete
для удаления вектора. - Функция
delete_item
удаляет элемент вектора по заданному номеру. Если номер меньше 0 или больше количества элементов в векторе, генерируется исключение. В противном случае, функция находит элемент вектора, соответствующий заданному номеру, и удаляет его. - Функция
add_item
добавляет новый элемент в вектор. Она выделяет память для нового элемента, инициализирует его поля и добавляет его в вектор. - Функция
dump_vector
выводит содержимое вектора на экран. Она использует циклwhile
для перебора всех элементов и выводит их значения в стандартный поток вывода. - В функции
main
создается вектор из 5 элементов с целочисленными значениями от 0 до 4. Затем с помощью функцийdelete_item
иadd_item
в цикле удаляются и добавляются элементы вектора. После каждого изменения вектора, его содержимое выводится на экран с помощью функцииdump_vector
. - В конце программы вызывается функция
vector_delete
для удаления вектора.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д