Удаление элемента из односвязного списка - C (СИ) (155619)

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

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

Есть односвязный список из 50 целых случайных неуникальных чисел, допустим от 1 до 1000 вида:
typedef struct st {
        int item;
        struct st *next;
} STACK;
Необходимо определить количество элементов, находящихся между минимальным и максимальным элементами, и удалить их. Пытаюсь сделать функцию, которая всё посчитает и отдаст список с удалёнными элементами. Проблем много. Это и то, что список неуникальный (и минимальные и максимальные элементы могут быть продублированы); и то, что ко входу может быть ближе, как минимальный, так и максимальный элемент. Ну и собственно, жутко туплю, с непосредственным удалением. Вроде всё должно быть просто:
STACK* pop(STACK *top) {
        STACK *q;
        if(top) {
                q=top;
                top=top->next;
                free(q);
        }
        else
                return NULL;
        return top;
}
ставим указатель на след. элемент, а потом "подчищаем" за собой память. Но, что-то ничего не выходит. Ну и собственно, моя попытка реализации функции:
STACK* get_count(STACK *top) {
int c_min=1000, c_max=1, c=0, pos_min=0, pos_max=0,i=0, k=0;
       STACK *p;
       STACK *key_min, *key_max;
       p=(STACK*)malloc(sizeof(STACK));
        for(p=top; p; p=p->next){
        c=p->item;
 
            i++;    
            if (c < c_min){
                c_min=c;
                pos_min=i;
                key_min=p;  

            }
                
            if (c > c_max){
                c_max=c;
                pos_max=i;
                key_max=p; 
            
            }

        }
 
printf(Rus("Значение минимального элемента: %d\nЗначение максимального элемента: %d\nПозиция минимального элемента: %d\nПозиция максимального элемента: %d\n"),c_min,c_max,pos_min,pos_max);
c=0;
if (pos_min<pos_max){
c=pos_max-pos_min-1;
printf(Rus("Необходимо удалить %d элементов, а конкретно с %d по %d\n"), c, pos_min+1, pos_max-1);
 
}
else
{
c=pos_min-pos_max-1;
printf(Rus("Необходимо удалить %d элементов, а конкретно с %d по %d\n"), c, pos_max+1, pos_min-1);
}
 
return top;
}

Решение задачи: «Удаление элемента из односвязного списка»

textual
Листинг программы
pos_min<=pos_max?pos_min:pos_max

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

В данном коде выполняется проверка условия: pos_min <= pos_max. Если данное условие истинно, то выполняется присваивание переменной pos значения pos_min, иначе переменной pos присваивается значение pos_max. Данный код не является полным, так как не содержит инструкций для удаления элемента из списка. Если вам необходимо удалить элемент из списка, то код может выглядеть следующим образом:

  1. Создаем указатель node на голову списка.
  2. Проверяем, что список не пустой.
  3. Если список пустой, то возвращаем NULL.
  4. Если указатель node указывает на элемент, который нужно удалить, то изменяем указатель node на следующий элемент списка.
  5. Если указатель node указывает на последний элемент списка, то изменяем указатель node на предыдущий элемент списка и удаляем его.
  6. Если указатель node указывает на элемент, который не является последним и не является первым, то изменяем указатель node на предыдущий элемент списка и удаляем текущий элемент.
  7. Возвращаем измененный указатель node.

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


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

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

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