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

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

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

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

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

textual
Листинг программы
#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

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


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

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

12   голосов , оценка 4 из 5
Похожие ответы