Удаление элемента из односвязного списка - 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.
Данный код не является полным, так как не содержит инструкций для удаления элемента из списка. Если вам необходимо удалить элемент из списка, то код может выглядеть следующим образом:
- Создаем указатель
nodeна голову списка. - Проверяем, что список не пустой.
- Если список пустой, то возвращаем NULL.
- Если указатель
nodeуказывает на элемент, который нужно удалить, то изменяем указательnodeна следующий элемент списка. - Если указатель
nodeуказывает на последний элемент списка, то изменяем указательnodeна предыдущий элемент списка и удаляем его. - Если указатель
nodeуказывает на элемент, который не является последним и не является первым, то изменяем указательnodeна предыдущий элемент списка и удаляем текущий элемент. - Возвращаем измененный указатель
node.