Programar em C/Listas encadeadas: diferenças entre revisões

Origem: Wikilivros, livros abertos por um mundo aberto.
[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
m ortografia; cat
Maxtremus (discussão | contribs)
Sem resumo de edição
Linha 104: Linha 104:
</source>
</source>


==Exibição==

===Do fim para a raiz===

<source lang="C">
void mostrarDoFimParaRaiz(struct No *pRaiz){
if(pRaiz == NULL) printf("\nLista vazia");
else{
struct No *pAuxCorredor, *pAuxFim;
pAuxCorredor = pRaiz;
pAuxFim = pRaiz;
while(pAuxFim->pProx != NULL){ //ir para o ultimo elemento
pAuxFim = pAuxFim->pProx;
}
while(pAuxCorredor != pAuxFim){
if(pAuxCorredor->pProx == pAuxFim){
printf(" <- %s", pAuxFim->pString);
pAuxFim = pAuxCorredor;
pAuxCorredor = pRaiz;
}
pAuxCorredor = pAuxCorredor->pProx;
}
printf(" <- %s", pAuxFim->pString);
}
}
</source>

===Da raiz para o fim===
<source lang="C">
void mostrarDaRaizParaFim(struct No *pRaiz){
if(pRaiz == NULL) printf("\nLista vazia");
else{
struct No *pAux;
pAux = pRaiz;
while(pAux != NULL){
printf("%s", pAux->pString);
pAux = pAux->pProx;
}
}
}
</source>
[[Categoria:Programar em C|{{SUBPAGENAME}}]]
[[Categoria:Programar em C|{{SUBPAGENAME}}]]

Revisão das 19h59min de 12 de março de 2009

Listas encadeadas são estruturas de dados lineares e dinâmicas, a grande vantagem que elas possuem em relação ao uso de vetor é o fato de terem tamanho máximo relativamente infinito (o tamanho máximo é o da memória do computador), ao mesmo tempo que podem ter o tamanho mínimo de 1 elemento evitando o desperdício de memória.

Struct

Cada nó de uma lista encadeada irá possuir guardar o valor do nó e o endereço do próximo nó.

struct No{
    char *pString;
    struct No *pProx;
};

Iniciar uma lista

A função abaixo demonstra como iniciar uma lista criando o espaço da raiz na memória.

void criarLista(struct No **pRaiz){
    *pRaiz = NULL;
}

Inserção

Existem 2 tipos de inserção numa lista, pode-se inserir no começo ou no final da lista.

Inserção no início

void inserirNoInicio(struct No **pRaiz, char *pString){
    struct No *pNovo;
    pNovo = (struct No *) malloc(sizeof(struct No));
    pNovo->pString = pString;
   
    if(*pRaiz == NULL){
        *pRaiz = pNovo;
        pNovo->pProx = NULL;
    }else{
        pNovo->pProx = *pRaiz;
        *pRaiz = pNovo;
    }
}

Inserção no fim

void inserirNoFim(struct No **pRaiz, char *pString){
    struct No *pNovo;
    pNovo = (struct No *) malloc(sizeof(struct No));
    pNovo->pString = pString;
    pNovo->pProx = NULL;
    
    if(*pRaiz == NULL){
        *pRaiz = pNovo;
    }else{
        struct No *pAux;
        pAux = *pRaiz;
        
        while(pAux->pProx != NULL){
            pAux = pAux->pProx;
        }
        pAux->pProx = pNovo;
    }
}

Remoção

Assim como na inserção também existem 2 tipos de remoção, no início e no fim da lista.

Remoção no início

void removerNoInicio(struct No **pRaiz){
    if(*pRaiz == NULL) printf("\nA lista ja esta vazia");
    else{
        struct No *pAux;
        pAux = *pRaiz;
         
        *pRaiz = (*pRaiz)->pProx;
        free(pAux);
    }
}

Remoção no fim

void removerNoFim(struct No **pRaiz){
    if(*pRaiz == NULL) printf("\nA lista ja esta vazia");
    else{
        struct No *pAuxFrente, *pAuxTras;
        pAuxFrente = *pRaiz;
        while(pAuxFrente->pProx != NULL){
            pAuxTras = pAuxFrente;
            pAuxFrente = pAuxFrente->pProx;
        }
        pAuxTras->pProx = NULL;
        free(pAuxFrente);
    }
}

Exibição

Do fim para a raiz

void mostrarDoFimParaRaiz(struct No *pRaiz){
    if(pRaiz == NULL) printf("\nLista vazia");
    else{
        struct No *pAuxCorredor, *pAuxFim;
        pAuxCorredor = pRaiz;
        pAuxFim = pRaiz;
        while(pAuxFim->pProx != NULL){ //ir para o ultimo elemento
            pAuxFim = pAuxFim->pProx;
        }
        while(pAuxCorredor != pAuxFim){
            if(pAuxCorredor->pProx == pAuxFim){
                printf(" <- %s", pAuxFim->pString);
                pAuxFim = pAuxCorredor;
                pAuxCorredor = pRaiz;
            }
            pAuxCorredor = pAuxCorredor->pProx;
        }
        printf(" <- %s", pAuxFim->pString);
    }
}

Da raiz para o fim

void mostrarDaRaizParaFim(struct No *pRaiz){
    if(pRaiz == NULL) printf("\nLista vazia");
    else{
        struct No *pAux;
        pAux = pRaiz;
        while(pAux != NULL){
            printf("%s", pAux->pString);
            pAux = pAux->pProx;
        }
    }
}