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.