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