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

Объяснение кода листинга программы

  1. В коде используется структура данных node для представления элементов вектора. Каждый элемент содержит целочисленное значение data1 и указатель на следующий элемент next.
  2. Функция vector_delete удаляет все элементы вектора, начиная с заданного узла. Она использует цикл while для перебора всех элементов и вызова функции free для каждого из них.
  3. Функция do_exeption генерирует исключение в случае ошибки. Она выводит сообщение об ошибке в стандартный поток ошибок и, если флаг выхода установлен в 1, вызывает функцию vector_delete для удаления вектора.
  4. Функция delete_item удаляет элемент вектора по заданному номеру. Если номер меньше 0 или больше количества элементов в векторе, генерируется исключение. В противном случае, функция находит элемент вектора, соответствующий заданному номеру, и удаляет его.
  5. Функция add_item добавляет новый элемент в вектор. Она выделяет память для нового элемента, инициализирует его поля и добавляет его в вектор.
  6. Функция dump_vector выводит содержимое вектора на экран. Она использует цикл while для перебора всех элементов и выводит их значения в стандартный поток вывода.
  7. В функции main создается вектор из 5 элементов с целочисленными значениями от 0 до 4. Затем с помощью функций delete_item и add_item в цикле удаляются и добавляются элементы вектора. После каждого изменения вектора, его содержимое выводится на экран с помощью функции dump_vector.
  8. В конце программы вызывается функция vector_delete для удаления вектора.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.583 из 5
Похожие ответы