Удаление отрицательных элементов из списка - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Описать функцию,которая удаляет из списка все числа меньше 0, до и после вывести так же на экран

Решение задачи: «Удаление отрицательных элементов из списка»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
typedef struct node {
    struct node* next;
    int val;
} snode;
 
typedef struct {
    snode* head;
    snode* tail;
} slist;
 
void slist_init(slist* lst);
int  slist_add(slist* lst, int val);
void slist_clear(slist* lst);
void slist_print(FILE* _out, const slist* lst);
void slist_remove(slist* lst, int (*pfcmp)(int));
 
static int fcmp(int val) { return (val < 0); }
 
int main(void){
    int   i;
    slist lst;
    slist_init(&lst);
    for(i = 0; i < 20; ++i)
        slist_add(&lst, -9 + rand() % 19);
 
    slist_print(stdout, &lst);
    slist_remove(&lst, &fcmp);
    slist_print(stdout, &lst);
    slist_clear(&lst);
    return 0;
}
 
//удаление
void slist_remove(slist* lst, int (*pfcmp)(int)){
    snode* t, *i, *p = lst->head;
    for(i = lst->head; i != NULL; ){
        if((*pfcmp)(i->val)){
            t = i;
            if(i == lst->head)
                p = i = lst->head = lst->head->next;
            else {
                if(i == lst->tail)
                    lst->tail = p;
                i = p->next = i->next;
            }
            free(t);
            continue;
        }
        p = i;
        i = i->next;
    }
 
    if(lst->head == NULL)
        lst->tail = NULL;
}
 
//инициализация
void slist_init(slist* lst){
    lst->head = lst->tail = NULL;
}
 
//вставка
int slist_add(slist* lst, int val){
    snode* p = (snode*)malloc(sizeof(snode));
    if(p != NULL){
        p->val  = val;
        p->next = NULL;
 
        if(lst->head == NULL)
            lst->head = lst->tail = p;
        else {
            lst->tail->next = p;
            lst->tail = p;
        }
    }
    return (p != NULL);
}
 
//удаление всех
void slist_clear(slist* lst){
    snode* t;
    while(lst->head != NULL){
        t = lst->head;
        lst->head = lst->head->next;
        free(t);
    }
    lst->tail = NULL;
}
 
//печать списка
void slist_print(FILE* _out, const slist* lst){
    const snode* p;
    for(p = lst->head; p != NULL; p = p->next)
        fprintf(_out, "%d ", p->val);
    fputc('\n', _out);
}

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

Код представляет собой реализацию односвязного списка в языке C. Структура данных состоит из двух указателей: head и tail, которые указывают на начало и конец списка соответственно. Каждый элемент списка представлен структурой snode, которая содержит указатель на следующий элемент (next) и значение (val). Функция slist_init инициализирует список, устанавливая head и tail в NULL. Функция slist_add добавляет новый элемент в список. Если выделенный массив не равен NULL, то в нем устанавливается значение элемента, а затем он добавляется в список, становясь последним элементом. Если список пуст, то новый элемент становится и первым, и последним. Функция slist_clear удаляет все элементы из списка, начиная с первого, и освобождает память, выделенную под каждый элемент. Функция slist_print выводит все элементы списка на экран, разделяя их пробелами. Функция slist_remove удаляет из списка все элементы, значение которых меньше нуля. Для этого используется функция сравнения fcmp, которая возвращает ненулевой результат, если значение меньше нуля. В цикле проходят по всем элементам списка. Если значение текущего элемента меньше нуля, то его удаляют из списка, освобождают память и продолжают проход по списку с нового места. Если после удаления всех элементов список оказывается пустым, то head и tail устанавливаются в NULL.

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


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

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

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