моё решение падает,ругаясь на переполнение,хотя я вроде очищаю память.
Очищаешь память это как, оператором free, функцией VirtualFree и т.д?
Это не то, переполнение - это когда ты выходишь за границы массива. Так вот, когда у тебя, допустим, от 0 до 9 элементов, то я догадываюсь, что ты перезаписываешь "10-й" элемент, который лежит на странице памяти недоступной для записи?
Делай проверку на 0-й и последний элемент массива, ведь у последнего элемента номера i не должно быть соседа с номером i+1....
P.S. Код не смотрел, ибо смысла нету - есть отладчик. Он и покажет где ошибка, на какой строчке переполнение происходит.