giiff / livro_algoritmos_e_estruturas_de_dados

Livro Algoritmos e Estruturas de Dados para Tecnólogos
Creative Commons Attribution Share Alike 4.0 International
13 stars 0 forks source link

Exe07 - Fila com Lista Encadeada #12

Closed waldeyr closed 5 years ago

4ven commented 5 years ago
// Samuel Sergio Garcia Espinosa

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Define o tipo No contendo
typedef struct No{
    int dado;
    struct No *prox;
} No;

void printFormat01(No* ponteiroNo);
void printFormat02(No* ponteiroNo);
//Define o ultimo No da lista
No* ponteiroFinal = NULL;

//Funcao que adiciona dados
void adicionarDado(int dado) {
    No* ponteiroNo;
    ponteiroNo = (No *) malloc(sizeof (ponteiroNo));
    ponteiroNo->dado = dado;
    ponteiroNo->prox = NULL;
    if (ponteiroFinal == NULL)
        ponteiroFinal = ponteiroNo;
    else {
        ponteiroNo->prox = ponteiroFinal;
        ponteiroFinal = ponteiroNo;
    }
}

//Funcao que imprime a lista
void imprimirLista() {
    No* ponteiroNo;
    if (ponteiroFinal == NULL) {
        printf("Lista vazia.\n");
        return;
    }
    ponteiroNo = ponteiroFinal;
    while (ponteiroNo != NULL) {
        if (ponteiroNo->prox !=NULL){
            printFormat01(ponteiroNo);
        }else{
            printFormat02(ponteiroNo);
        }
        ponteiroNo = ponteiroNo->prox;
    }

}

void printFormat01(No* ponteiroNo){
    printf("[%d(%p)|%p]\n", ponteiroNo->dado, ponteiroNo, ponteiroNo->prox);
    printf("                  |\n");
    printf("                  V\n");
    printf("      -------------\n");
    printf("      |\n");
    printf("      V\n");
}
void printFormat02(No* ponteiroNo){
    printf("[%d(%p)|%p]\n", ponteiroNo->dado, ponteiroNo, ponteiroNo->prox);
    printf("                  |\n");
    printf("                  V\n");
    printf("                 NULL\n");
}

void buscarDado(int dado){
    No* ponteiroNo;
    if (ponteiroFinal == NULL) {
        printf("Lista vazia.\n");
        return;
    }
    ponteiroNo = ponteiroFinal;
    while (ponteiroNo != NULL) {
        if (ponteiroNo->dado == dado)
            printf("[%d(%p)]\n", ponteiroNo->dado, ponteiroNo);
        ponteiroNo = ponteiroNo->prox;
    }
}

void removerDado(int dado) {
    No *ponteiroNo, *ponteiroAnterior;
    if (ponteiroFinal == NULL) {// lista vazia
        return; 
    } else { // lista NAO vazia
        ponteiroNo = ponteiroFinal;
        ponteiroAnterior = ponteiroFinal;
        while (ponteiroNo != NULL) {
            if (ponteiroNo->dado == dado){
                if (ponteiroNo == ponteiroFinal){// removendo o primeiro
                    ponteiroFinal = ponteiroFinal->prox;
                    free(ponteiroNo);// libera memoria
                    return;
                } 
                else{ // removendo do meio
                    ponteiroAnterior->prox = ponteiroNo->prox;//refaz links
                    free(ponteiroNo);// libera memoria
                    return;
                }
            } 
            else{ // continua procurando na lista
                ponteiroAnterior = ponteiroNo;
                ponteiroNo = ponteiroNo->prox;
            }
        }
        return;
    }
}

void removerDadoFila(int dado)
{
    No *ponteiroNo, *ponteiroAnterior;
    No *ponteiroPrimeiro;

    int dadoRemovido = 0;
    int existe = 0;

    if (ponteiroFinal == NULL) // lista vazia
        return; 
    else // lista NAO vazia
    {
        ponteiroNo = ponteiroFinal;
        ponteiroAnterior = ponteiroFinal;

        // While para conferir se o dado existe
        while(ponteiroNo != NULL && existe == 0)
        {
            if(ponteiroNo->dado == dado )
                existe = 1;
            else
                ponteiroNo = ponteiroNo->prox;
        }

        if(existe == 1)
        {
            ponteiroNo = ponteiroFinal;

            // While para salvar o primeiro e o segundo ponteiro
            while( ponteiroNo != NULL )
            {
                if( ponteiroNo->prox == NULL )
                    ponteiroPrimeiro = ponteiroNo;
                else
                {
                    ponteiroNo = ponteiroNo->prox;
                    ponteiroAnterior = ponteiroNo;
                }
            }

            // While para apagar os dados ate achar o NO onde contem o dado procurado
            while(dadoRemovido == 0)
            {
                if( ponteiroPrimeiro->dado == dado )
                {
                    free(ponteiroPrimeiro);
                    dadoRemovido = 1;
                }
                else
                {
                    free(ponteiroPrimeiro);
                    ponteiroPrimeiro = ponteiroAnterior;
                    ponteiroPrimeiro->prox == NULL;

                    ponteiroNo = ponteiroFinal;

                    // While para determinar o novo SEGUNDO ponteiro
                    while( ponteiroNo != ponteiroPrimeiro )
                    {
                        ponteiroNo = ponteiroNo->prox;
                        ponteiroAnterior = ponteiroNo;
                    }
                }
            }
        }
        return;
    }   
}

void removerDadoPilha(int dado)
{
    No *ponteiroNo, *ponteiroARemover;

    int dadoRemovido = 0;
    int existe = 0;

    if (ponteiroFinal == NULL) // lista vazia
        return; 
    else
    { 
        ponteiroNo = ponteiroFinal;

        // While para conferir se o dado existe
        while(ponteiroNo != NULL && existe == 0)
        {
            if(ponteiroNo->dado == dado )
                existe = 1;
            else
                ponteiroNo = ponteiroNo->prox;
        }

        if(existe == 1)
        {
            ponteiroNo = ponteiroFinal;

            while( dadoRemovido == 0 )
            {
                if( ponteiroNo->dado == dado )
                {
                    free(ponteiroNo);
                    dadoRemovido = 1;
                }
                else
                {
                    ponteiroARemover = ponteiroNo;
                    ponteiroNo = ponteiroNo->prox;
                    free(ponteiroARemover);
                }
            }
        }
        return;
    }
}

void main() {
    // Insere na lista os numeros de 1 a 3
    for (int i = 1; i <= 4; i++)
        adicionarDado(i);
    imprimirLista();
    removerDado(2);
    printf("--------------\n");
    imprimirLista();
    buscarDado(3);
}
Vanderson11 commented 5 years ago

Vanderson Leite Campos

include

include

include

typedef struct No{ int dado; struct No *prox; } No;

void printFormat01(No ponteiroNo); void printFormat02(No ponteiroNo);

No* ponteiroFinal = NULL;

void adicionarDado(int dado) {

No ponteiroNo; ponteiroNo = (No ) malloc(sizeof (ponteiroNo)); ponteiroNo->dado = dado; ponteiroNo->prox = NULL; if (ponteiroFinal == NULL) ponteiroFinal = ponteiroNo; else { ponteiroNo->prox = ponteiroFinal; ponteiroFinal = ponteiroNo; }

}

void imprimirLista() {

No* ponteiroNo; if (ponteiroFinal == NULL) { printf("Lista vazia.\n"); return; } ponteiroNo = ponteiroFinal; while (ponteiroNo != NULL) { if (ponteiroNo->prox !=NULL){ printFormat01(ponteiroNo); }else{ printFormat02(ponteiroNo); } ponteiroNo = ponteiroNo->prox; }

}

void printFormat01(No* ponteiroNo){

printf("[%d(%p)|%p]\n", ponteiroNo->dado, ponteiroNo, ponteiroNo->prox); printf(" |\n"); printf(" V\n"); printf(" -------------\n"); printf(" |\n"); printf(" V\n");

} void printFormat02(No* ponteiroNo){

printf("[%d(%p)|%p]\n", ponteiroNo->dado, ponteiroNo, ponteiroNo->prox); printf(" |\n"); printf(" V\n"); printf(" NULL\n");

}

void buscarDado(int dado){

No* ponteiroNo; if (ponteiroFinal == NULL) { printf("Lista vazia.\n"); return; } ponteiroNo = ponteiroFinal; while (ponteiroNo != NULL) { if (ponteiroNo->dado == dado) printf("[%d(%p)]\n", ponteiroNo->dado, ponteiroNo); ponteiroNo = ponteiroNo->prox; }

}

void removerDadoFila(int dado) {

No ponteiroNo,ponteiroF;

if (ponteiroFinal == NULL) { return;

} else { ponteiroNo = ponteiroFinal; ponteiroF = ponteiroFinal;

while (ponteiroNo != NULL) {
    if (ponteiroNo->dado == dado){
        ponteiroF->prox = NULL;
        free(ponteiroNo);
        return;
    } 
    else{               
        ponteiroF = ponteiroNo;
        ponteiroNo = ponteiroNo->prox;
    }
}
return;

}

}

void main() {

for (int i = 1; i <= 10; i++) adicionarDado(i);

imprimirLista();
removerDadoFila(6);
printf("--------------\n\n");

imprimirLista();

}

Samuel-Amaro commented 5 years ago

/*EXEMPLO DE CODIGO DO PROFESSOR,DEMOSTRANDO COMO FUNCIONA UMA LISTA SIMPLES ENCADEADA , Estrutura de Dados*/
/*Implementa uma fila na função remove no*/
//Aluno: Samuel Amaro do Nascimento
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// Define o tipo No contendo
typedef struct No{
    int dado;
    struct No *prox;
} No;

void printFormat01(No* ponteiroNo);
void printFormat02(No* ponteiroNo);
//Define o ultimo No da lista
No* ponteiroFinal = NULL;

//Funcao que adiciona dados cria um primeiro no e aloca um novo no sempre que e criado
void adicionarDado(int dado) {
    No* ponteiroNo;
    ponteiroNo = (No *) malloc(sizeof (ponteiroNo));
    ponteiroNo->dado = dado;
    ponteiroNo->prox = NULL;
    if (ponteiroFinal == NULL)
        ponteiroFinal = ponteiroNo;
    else {
        ponteiroNo->prox = ponteiroFinal;
        ponteiroFinal = ponteiroNo;
    }

}

//Funcao que imprime a lista
void imprimirLista() {
    No* ponteiroNo;
    if (ponteiroFinal == NULL) {
        printf("Lista vazia.\n");
        return;
    }
    ponteiroNo = ponteiroFinal;
    while (ponteiroNo != NULL) {
        if (ponteiroNo->prox !=NULL){
            printFormat01(ponteiroNo);
        }else{
            printFormat02(ponteiroNo);
        }
        ponteiroNo = ponteiroNo->prox;
    }

}

void printFormat01(No* ponteiroNo){
    printf("[%d(%p)|%p]\n", ponteiroNo->dado, ponteiroNo, ponteiroNo->prox);
    printf("                  |\n");
    printf("                  V\n");
    printf("      -------------\n");
    printf("      |\n");
    printf("      V\n");
}
void printFormat02(No* ponteiroNo){
    printf("[%d(%p)|%p]\n", ponteiroNo->dado, ponteiroNo, ponteiroNo->prox);
    printf("                  |\n");
    printf("                  V\n");
    printf("                 NULL\n");
}

void buscarDado(int dado){
    No* ponteiroNo;
    if (ponteiroFinal == NULL) {
        printf("Lista vazia.\n"); //signifca que a lista esta vazia não tem nenhum no criado
        return;
    }
    ponteiroNo = ponteiroFinal;
    while (ponteiroNo != NULL) {
        if (ponteiroNo->dado == dado)
            printf("[%d(%p)]\n", ponteiroNo->dado, ponteiroNo);
        ponteiroNo = ponteiroNo->prox;
    }
}

//função que remove um no, assumindo como base a remoção de uma lista do tipo fila
void removeNo(int dado);
void removeNo(int dado) {
 No *percorreLista,*noAnterior;
 percorreLista = ponteiroFinal;
 noAnterior = percorreLista;
 //verifica se a lista esta vazia
 if(ponteiroFinal == NULL) {
    printf("Lista Vazia Sem Nenhum No!");
 }
 //percorre a lista ate o primeiro no e sempre guarda seu antecessor
 while(percorreLista->prox != NULL) {
    //acha num respectivo no atraves de  um dado vindo por parametro, salva seu antecessor em caso se for o primeiro ou um no entre primeiro ou ultimo, no caso do ultimo so sai do while e não salva antecessor
    if(percorreLista->dado == dado) {
       break;
    }
    else {
        //guarda o antecessor do no atual avaliado
        noAnterior = percorreLista;
    }
    percorreLista = percorreLista->prox; //atualiza para o proximo no

 }
 //para remover o ultimo no, o while executou uma vez e trouxe de referncia o ultimo no da lista guardado no ponteiro controlador
 if(percorreLista == ponteiroFinal) { //se meu ponteiro controlador da lista e igual o ponteiro global de referencia da lista
    //vai apaga todos os nos da lista so que de cima para baixo
    while (percorreLista != NULL) {
           No *aux;
           aux = percorreLista;
           //serve para o ultimo caso quando chego ao pimeiro no ele e nullo, apaga se ele
           if(percorreLista->prox == NULL) {
             free(percorreLista);
             break;
          }
           percorreLista = percorreLista->prox; //atualiza a lista para ir para o proximo no
           free(aux); //apaga um no atual avaliado
    }
    ponteiroFinal = NULL; //atualiza o ponteiro final para mostrar que a lista esta vazia todos nos foram apagados
 }

 //remove um primeiro no da lista, o while inicial executa ate chegar o primeiro no e tras seu antecessor
 if(percorreLista->prox == NULL && percorreLista->dado == dado) {
         noAnterior->prox = NULL;
         No *aux;
         aux = percorreLista;
         free (aux);
         percorreLista = noAnterior;
    }
   else {
       //para remover um no qualquer entre o ultimo e primeiro, recebe o anterior desse no, faço o anterior do no atual ele apontar para null, e desaloco todos os nos sucessores desse no atual
       while(percorreLista != NULL) {
            No *aux;
            aux = percorreLista;
            percorreLista = percorreLista->prox;
            free(aux);
            noAnterior->prox = NULL;
       }
   }

}

void main() {
    // Insere na lista os numeros de 1 a 4
    for (int i = 1; i <= 4;i++)
         adicionarDado(i); //ao invez de chamar a função 4 vezes eu passo a variavel iteradora do for
    imprimirLista();
    removeNo(4);
    imprimirLista();
    buscarDado(4);
}
Judy-Ellen commented 5 years ago

/ File: main.c Author: Judy Ellen/

include

include

include

typedef struct No{ int dado; struct No *prox; } No;

void printFormatacaoA(No ponteiroNo); void printFormatacaoB(No ponteiroNo);

No* ponteiroFinal = NULL;

void adicionarDado(int dado) {

No ponteiroNo; ponteiroNo = (No ) malloc(sizeof (ponteiroNo)); ponteiroNo->dado = dado; ponteiroNo->prox = NULL; if (ponteiroFinal == NULL) ponteiroFinal = ponteiroNo; else { ponteiroNo->prox = ponteiroFinal; ponteiroFinal = ponteiroNo; }

}

void imprimirLista() {

No* ponteiroNo; if (ponteiroFinal == NULL) { printf("Lista vazia.\n"); return; } ponteiroNo = ponteiroFinal; while (ponteiroNo != NULL) { if (ponteiroNo->prox !=NULL){ printFormatacaoA(ponteiroNo); }else{ printFormatacaoB(ponteiroNo); } ponteiroNo = ponteiroNo->prox; }

}

void printFormatacaoA(No* ponteiroNo){

printf("[%d(%p)|%p]\n", ponteiroNo->dado, ponteiroNo, ponteiroNo->prox); printf(" |\n"); printf(" V\n"); printf(" -------------\n"); printf(" |\n"); printf(" V\n");

} void printFormatacaoBN(o* ponteiroNo){

printf("[%d(%p)|%p]\n", ponteiroNo->dado, ponteiroNo, ponteiroNo->prox); printf(" |\n"); printf(" V\n"); printf(" NULL\n");

}

void buscarDado(int dado){

No* ponteiroNo; if (ponteiroFinal == NULL) { printf("Lista vazia.\n"); return; } ponteiroNo = ponteiroFinal; while (ponteiroNo != NULL) { if (ponteiroNo->dado == dado) printf("[%d(%p)]\n", ponteiroNo->dado, ponteiroNo); ponteiroNo = ponteiroNo->prox; }

}

void removerDadoFila(int dado) {

No ponteiroNo,ponteiroF;

if (ponteiroFinal == NULL) { return;

} else { ponteiroNo = ponteiroFinal; ponteiroF = ponteiroFinal;

while (ponteiroNo != NULL) { if (ponteiroNo->dado == dado){ ponteiroF->prox = NULL; free(ponteiroNo); return; } else{
ponteiroF = ponteiroNo; ponteiroNo = ponteiroNo->prox; } } return; }

}

void main() {

for (int i = 1; i <= 10; i++) adicionarDado(i);

imprimirLista(); removerDadoFila(6); printf("--------------\n\n");i mprimirLista(); }