Исключить из списка все элементы, равные x - C (СИ)
Формулировка задачи:
Решение задачи: «Исключить из списка все элементы, равные x»
#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct _stack { struct _stack* next; int val; } stack; int stack_empty(const stack* st) { return (st == NULL); } int stack_top(const stack* st) { return st->val; } int stack_push(stack** st, int val); void stack_pop(stack** st); void stack_resort(stack** st); void stack_remove(stack** st, int x); int main(void){ int i, x; stack* st = NULL; for(i = 0; i < 16; ++i){ if(! stack_push(&st, rand() % 5)) puts("error"); } x = 3; stack_remove(&st, x); stack_resort(&st); while(! stack_empty(st)){ printf("%d ", stack_top(st)); stack_pop(&st); } return 0; } //Пузырьковая сортировка по убыванию void stack_resort(stack** st){ int g; stack* t, *m, *a, *b; if(*st == NULL) return; for(g = 1; g; ){ g = 0; a = t = *st; b = (*st)->next; while(b != NULL){ if(a->val < b->val){ if(t == a) *st = t = b; else t->next = b; a->next = b->next; b->next = a; m = a, a = b, b = m; g = 1; } t = a; a = a->next; b = b->next; } } } //удаление все x void stack_remove(stack** st, int x){ stack* q, *p = *st, *t = *st; while(p != NULL){ if(p->val == x){ q = p->next; if(p == *st) t = *st = (*st)->next; else t->next = p->next; free(p); p = q; continue; } t = p; p = p->next; } } //вставка int stack_push(stack** st, int val){ stack* p = (stack*)malloc(sizeof(stack)); if(p != NULL){ p->val = val; p->next = *st; *st = p; } return (p != NULL); } //удаление void stack_pop(stack** st){ stack* t; if(*st != NULL){ t = *st; *st = (*st)->next; free(t); } }
Объяснение кода листинга программы
В данном коде реализована работа со связанным списком (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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д