Исключить из списка все элементы, равные 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д