Покажите пример, как удалить определенный элемент в структуре - 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для удаления вектора.