Я думаю, что основной проблемой является размер временного массива при попытке использовать fscanf.
while((fscanf(fpt, "%s ", temp)) == 1)
Когда длина одной строки больше MAX, возникает ошибка сегментации.
Вы можете изменить свой код следующим образом
#define SCANF_LEN2(x) #x
#define SCANF_LEN(x) SCANF_LEN2(x)
//...
//your original code
//...
while((fscanf(fpt, "%"SCANF_LEN(MAX)"s ", temp)) == 1)
Кстати, вы должны проверить
(1) предупреждение о компиляции типа
char* removePunc(struct words* ch)
должно быть char* removePunc(char *ch)
if(temp == ' ')
должно быть if(temp[0] == ' ')
if(temp == '\n')
должно быть if(temp[0] == '\n')
(2) размер malloc
pCounter = (struct words*)malloc(sizeof(char));
долженбыть pCounter = (struct words*)malloc(sizeof(struct words));
(3) помнить бесплатно после использования malloc