Manipulação de lista dinâmica em C

0 respostas
claudneto

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:

//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);
}

Aqui as definições:

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

typedef struct
{
        NO *inicioA;
        NO *inicioB;
} RESPOSTA;

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

Criado 24 de abril de 2011
Respostas 0
Participantes 1