Удаление отрицательных элементов из списка - C (СИ)
Формулировка задачи:
Решение задачи: «Удаление отрицательных элементов из списка»
- #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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д