В вашем распределении памяти есть серьезная ошибка. stackp
- это автоматический (стек) массив, который означает, что его время жизни заканчивается, как только вставка возвращается. Вы должны использовать другой метод распределения. Вы можете сделать так, чтобы вызывающая сторона выделяла новый массив и передавала оба указателя, или вы можете сделать это самостоятельно с помощью malloc
(не забудьте освободить).
Тем не менее, все остальное выглядит хорошо. Это в значительной степени единственный алгоритм для вставки не на месте. Возможно, вам удастся сделать это немного быстрее, используя специальные приемы (например, копирование двух целых раз). memmove
и memcopy
могут использовать такие оптимизации на некоторых архитектурах.
Кроме того, многие алгоритмы пишут stackp[index]
, когда позиция найдена, а не в конце. Но основной алгоритм в основном тот же.
Альтернативой может быть вставка на месте (смещение только элементов после позиции вставки), а не использование нового массива. Вы часто расширяете с помощью realloc
. Это было бы предпочтительным во многих ситуациях, так как это экономит время копирования и позволяет избежать malloc
нового места в памяти (которое также может фрагментировать кучу).
Наконец, альтернативная структура данных полностью представляет собой связанный список. Это полностью исключает необходимость копирования элементов, но использует больше памяти и предотвращает произвольный доступ.