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

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

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

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

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4.  
  5. typedef struct node {
  6.     struct node* next;
  7.     int val;
  8. } snode;
  9.  
  10. typedef struct {
  11.     snode* head;
  12.     snode* tail;
  13. } slist;
  14.  
  15. void slist_init(slist* lst);
  16. int  slist_add(slist* lst, int val);
  17. void slist_clear(slist* lst);
  18. void slist_print(FILE* _out, const slist* lst);
  19. void slist_remove(slist* lst, int (*pfcmp)(int));
  20.  
  21. static int fcmp(int val) { return (val < 0); }
  22.  
  23. int main(void){
  24.     int   i;
  25.     slist lst;
  26.     slist_init(&lst);
  27.     for(i = 0; i < 20; ++i)
  28.         slist_add(&lst, -9 + rand() % 19);
  29.  
  30.     slist_print(stdout, &lst);
  31.     slist_remove(&lst, &fcmp);
  32.     slist_print(stdout, &lst);
  33.     slist_clear(&lst);
  34.     return 0;
  35. }
  36.  
  37. //удаление
  38. void slist_remove(slist* lst, int (*pfcmp)(int)){
  39.     snode* t, *i, *p = lst->head;
  40.     for(i = lst->head; i != NULL; ){
  41.         if((*pfcmp)(i->val)){
  42.             t = i;
  43.             if(i == lst->head)
  44.                 p = i = lst->head = lst->head->next;
  45.             else {
  46.                 if(i == lst->tail)
  47.                     lst->tail = p;
  48.                 i = p->next = i->next;
  49.             }
  50.             free(t);
  51.             continue;
  52.         }
  53.         p = i;
  54.         i = i->next;
  55.     }
  56.  
  57.     if(lst->head == NULL)
  58.         lst->tail = NULL;
  59. }
  60.  
  61. //инициализация
  62. void slist_init(slist* lst){
  63.     lst->head = lst->tail = NULL;
  64. }
  65.  
  66. //вставка
  67. int slist_add(slist* lst, int val){
  68.     snode* p = (snode*)malloc(sizeof(snode));
  69.     if(p != NULL){
  70.         p->val  = val;
  71.         p->next = NULL;
  72.  
  73.         if(lst->head == NULL)
  74.             lst->head = lst->tail = p;
  75.         else {
  76.             lst->tail->next = p;
  77.             lst->tail = p;
  78.         }
  79.     }
  80.     return (p != NULL);
  81. }
  82.  
  83. //удаление всех
  84. void slist_clear(slist* lst){
  85.     snode* t;
  86.     while(lst->head != NULL){
  87.         t = lst->head;
  88.         lst->head = lst->head->next;
  89.         free(t);
  90.     }
  91.     lst->tail = NULL;
  92. }
  93.  
  94. //печать списка
  95. void slist_print(FILE* _out, const slist* lst){
  96.     const snode* p;
  97.     for(p = lst->head; p != NULL; p = p->next)
  98.         fprintf(_out, "%d ", p->val);
  99.     fputc('\n', _out);
  100. }

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

Код представляет собой реализацию односвязного списка в языке 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы