Мне кажется, я вижу одну проблему, и это std :: list.erase (). erase () делает недействительным удаленный итератор only - все итераторы для других частей действительны. После того, как вы удалили его, вы продолжаете использовать его для выражения «elements_iter! = Num_list.end ()».
Для решения этой проблемы вы можете использовать тот факт, что erase () возвращает итератор, следующий после стертого, или конец, если стертый оратор был последним. Так что замените строку:
num_list.erase (elements_iter);
от
elements_iter = num_list.erase (elements_iter);
Если у вас все еще есть проблема, я советую вам отладить ваш алгоритм под Visual Studio - он имеет разностную версию STL, поэтому в случае ошибки отладчик остановится на линии, вызывая проблему.