Исключить из списка все элементы, равные 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