Исключить из списка все элементы, равные x - C (СИ)

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

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

1) Создать список из целых чисел. Исключить из списка все элементы, равные x. 2) Создать список чисел. Расположить их в порядке убывания.

Решение задачи: «Исключить из списка все элементы, равные x»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4.  
  5. typedef struct _stack {
  6.     struct _stack* next;
  7.     int val;
  8. } stack;
  9.  
  10. int  stack_empty(const stack* st) { return (st == NULL); }
  11. int  stack_top(const stack* st) { return st->val; }
  12. int  stack_push(stack** st, int val);
  13. void stack_pop(stack** st);
  14. void stack_resort(stack** st);
  15. void stack_remove(stack** st, int x);
  16.  
  17.  
  18. int main(void){
  19.     int    i, x;
  20.     stack* st = NULL;
  21.  
  22.     for(i = 0; i < 16; ++i){
  23.         if(! stack_push(&st, rand() % 5))
  24.             puts("error");
  25.     }
  26.     x = 3;
  27.     stack_remove(&st, x);
  28.  
  29.     stack_resort(&st);
  30.  
  31.     while(! stack_empty(st)){
  32.         printf("%d ", stack_top(st));
  33.         stack_pop(&st);
  34.     }
  35.     return 0;
  36. }
  37.  
  38. //Пузырьковая сортировка по убыванию
  39. void stack_resort(stack** st){
  40.     int    g;
  41.     stack* t, *m, *a, *b;
  42.     if(*st == NULL)
  43.         return;
  44.  
  45.     for(g = 1; g; ){
  46.         g = 0;
  47.         a = t = *st;
  48.         b = (*st)->next;
  49.  
  50.         while(b != NULL){
  51.             if(a->val < b->val){
  52.                 if(t == a)
  53.                     *st = t = b;
  54.                 else
  55.                     t->next = b;
  56.  
  57.                 a->next = b->next;
  58.                 b->next = a;
  59.  
  60.                 m = a, a = b, b = m;
  61.                 g = 1;
  62.             }
  63.             t = a;
  64.             a = a->next;
  65.             b = b->next;
  66.         }
  67.     }
  68. }
  69.  
  70. //удаление все x
  71. void stack_remove(stack** st, int x){
  72.     stack* q, *p = *st, *t = *st;
  73.     while(p != NULL){
  74.         if(p->val == x){
  75.  
  76.             q = p->next;
  77.             if(p == *st)
  78.                 t = *st = (*st)->next;
  79.             else
  80.                 t->next = p->next;
  81.  
  82.             free(p);
  83.             p = q;
  84.             continue;
  85.         }
  86.         t = p;
  87.         p = p->next;
  88.     }
  89. }
  90.  
  91. //вставка
  92. int stack_push(stack** st, int val){
  93.     stack* p = (stack*)malloc(sizeof(stack));
  94.     if(p != NULL){
  95.         p->val  = val;
  96.         p->next = *st;
  97.         *st = p;
  98.     }
  99.     return (p != NULL);
  100. }
  101.  
  102. //удаление
  103. void stack_pop(stack** st){
  104.     stack* t;
  105.     if(*st != NULL){
  106.         t   = *st;
  107.         *st = (*st)->next;
  108.         free(t);
  109.     }
  110. }

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

В данном коде реализована работа со связанным списком (stack) в языке C. Список содержит элементы типа stack, которые включают в себя указатель на следующий элемент списка (next) и значение (val). Функции stack_empty, stack_top, stack_push, stack_pop, stack_resort, stack_remove реализуют основные операции со списком: проверка пустоты списка, получение значения верхнего элемента, добавление элемента в список, удаление последнего добавленного элемента и сортировка списка по убыванию. В функции main создается список из 16 элементов с помощью функции stack_push. Затем в список добавляется элемент с индексом 3 с помощью функции stack_insert. После этого список сортируется с помощью функции stack_resort. Затем элементы списка выводятся на экран с помощью цикла while и функции stack_top. В конце программы список освобождается с помощью функции stack_clear. Пример вывода на экран: 15 14 13 12 11 10 9 8 7 6 5 4 3 0 Функция stack_remove удаляет все элементы списка, равные x. Для этого в цикле while проверяется каждый элемент списка. Если значение элемента равно x, то элемент удаляется из списка с помощью функции stack_pop. Пример вывода на экран после удаления всех элементов, равных 3: 15 14 13 12 11 10 9 8 7 6 5 4 0

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


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

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

12   голосов , оценка 4 из 5

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

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

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