Manipulação de lista dinâmica em C

Galera…preciso fazer um esquema assim:

Dada uma lista dinâmica (sem vetor), preciso pegar a segunda metade da lista e inverter.

Tá aqui o que eu já fiz:

[code]//Método que retorna o tamanho da lista
int tamanhoLista (NO *inicio) {
int cont = 0;
NO *p = inicio;

while (p) {
      cont++;
      p = p->prox;
      }
return (cont);

}

//Método de inversão da lista
void inverterLista (NO *origem) {
NO *p = origem;
NO *aux;

 int numElementosParaTrocar = tamanhoLista(origem);
 int numTrocas = numElementosParaTrocar - 1;
      
 while (numElementosParaTrocar >= 0) {
       while (numTrocas >= 0) {
             //Realizando a troca do elemento atual com o próximo
             aux = p;
             p = p->prox;
             p->prox = aux;
             
             //Atualizando a variável de contagem de trocas restantes em cada elemento
             numTrocas--;
       }
       
       //Atualizando a variável de contagem de elementos que ainda faltam para ser trocados
       numElementosParaTrocar--;
 }

}

// O EP CONSISTE EM IMPLEMENTAR ESTA FUNCAO (e funcoes auxiliares, se necessario)
RESPOSTA dividir(NO *original)
{
RESPOSTA resp;
resp.inicioA = NULL; // inicio da lista A
resp.inicioB = NULL; // inicio da lista B

 //inicioA sempre receberá o primeiro NO da lista como início    
 resp.inicioA = original;
 
 NO *p = original;
     
 int tamanhoA, tamanhoB;
 
 //Caso a lista seja par...
 if (tamanhoLista (original) % 2 == 0) {
       tamanhoA = tamanhoLista (original) / 2;
       tamanhoB = tamanhoA;
       
       int i = 0;
       
       //Percorre a lista até chegar no primeiro elemento da segunda metade da lista (inicioB)
       while (i <= tamanhoA) {
             p = p->prox;
       }
       
       resp.inicioB = p;             
 }         
 
 //Caso a lista seja ímpar...
 else {
       tamanhoA = tamanhoLista (original) / 2 + 1;
       tamanhoB = tamanhoA - 1;
       
       int i = 0;
       
       //Percorre a lista até chegar no primeiro elemento da segunda metade da lista (inicioB)
       while (i < tamanhoA) {
             p = p->prox;
       }
       
       resp.inicioB = p;
 }
 
 //Inverter a segunda metade da lista (a partir do inicioB)
 inverterLista(resp.inicioB);
 
 return (resp);

}[/code]

Aqui as definições:

[code]// elemento da lista
typedef struct estr
{
int num;
estr *prox;
} NO;

typedef struct
{
NO *inicioA;
NO *inicioB;
} RESPOSTA;[/code]

Quando eu rodo esse projeto, ele da erro no cmd e fecha.