Ir para conteúdo
Fórum Script Brasil
  • 0

Lista encadeada


Carol Alves

Pergunta

Olá pessoal, tudo bem?

Preciso de uma ajuda para descobrir o erro, se puderem também aceito material de estudo, o que acontece é que eu já rodei esse código de cima a baixo e ele continua dando problema na função:

Buscar: mesmo quando não existe o valor ele retorna uma posição;

Excluir: ele não exclui o valor quando ele está na primeira posição;

Excluir tudo: após usar quando peço para imprimir o programa dá erro

 

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

//criação da lista - recebe um inteiro e tem um ponteiro
//*ini é o ponteiro inicial (um ponteiro que aponta para outro ponteiro)

struct No{
    int dado;
    struct No *prox;
} *ini=NULL;

void inserir_ini(int num){
    struct No *novo; // nova estrutura com características de No
    novo = malloc(sizeof(No())); //pegar um espaço de memoria
    novo->dado=num; //informação de novo agora é num
    novo->prox=ini; //ponteiro de novo aponta para ini (primeiro da lista) último da lista
    ini=novo; // ponteiro de ini aponta para novo
    }

void inserir_fim(int num){
    struct No *aux =ini, *novo; // novo ponteiro e nova estrutura com características de No
    novo = malloc(sizeof(No())); //pegar um espaço de memoria
    novo->dado=num; //informação de novo agora é num
    novo->prox=NULL; //ponteiro de novo aponta para NULL

    if(aux==NULL){
        ini=novo; //se não tinha nada na lista, ini apontava para null, logo aux aponta para null, nesse caso ini vai apontar para o primeiro da lista
    }
    else{
        while(aux->prox !=NULL){
            aux=aux->prox;
        }
        aux->prox=novo; //procura o último da lista e conecta o novo nele
    }
}


void imprimir(){

    struct No*novo; //criou um ponteiro igual ao no

     if (ini == NULL)
  {
    printf("--- fim da lista ---\n\n");
    return;
  }

  novo = ini;
  while (novo !=NULL) {
     printf("Info = %d\n",novo->dado);
     novo = novo->prox;
  }
  printf("--- fim da lista ---\n\n");
}

void buscar (int busca, struct No*ini){

    int contador=1;
    struct No *q;
    q = ini;


    while (q != NULL && q->dado != busca) {
        q = q->prox;
        contador=contador+1;
    }

    printf("O valor inserido está na posição %d",contador);

}

void alterar(int alvo, int alvo2, struct No*ini){

    struct No *q;
    q = ini;

    while (q != NULL && q->dado != alvo) {
        q = q->prox;
    }
    if (q != NULL) {
        q->dado=alvo2;
    }
}

void excluir(int alvo, struct No*ini){

    struct No *p,*q;
    p=ini;
    q=ini->prox;

    if (q->dado==alvo)

    while (q != NULL && q->dado != alvo) {
        p = q;
        q = q->prox;
    }

    if (q != NULL) {
        p->prox = q->prox;
        free (q);
    }
}

void excluirtudo(struct No*ini){

    struct No *aux;

    while (ini!= NULL) {
        aux = ini;
        ini=aux->prox;
        free(aux);
    }

    ini->prox=NULL;
}


int main(){
    int op=1, num, num2,busca;

    while (op!=0){

    printf("\n\nMenu \n1-Insere no inicio; \n2-Insere no fim; \n3-Imprime; \n4-Buscar \n5-Alterar \n6-Excluir um \n7-Excluir tudo \n0-Finaliza \n\n Digite a opcao: ");
    scanf("%d", &op);

        switch(op){
        case 1:
            printf("\nInsira um numero: ");
            scanf("%d",&num);
            inserir_ini(num);
            break;

        case 2:
            printf("\nInsira um numero: ");
            scanf("%d",&num);
            inserir_fim(num);
            break;

        case 3:
            imprimir();
            break;

        case 4:
            printf("Insira o numero que deseja buscar:");
            scanf("%d",&busca);
            buscar(busca,ini);
            break;

        case 5:
            printf("\nInsira o numero que deseja substituir: ");
            scanf("%d",&num);

            printf("\nInsira o novo numero: ");
            scanf("%d",&num2);

            alterar(num,num2, ini);
            break;

        case 6:
            printf("\nInsira o numero que deseja excluir: ");
            scanf("%d",&num);
            excluir(num, ini);
            break;

        case 7:
            excluirtudo(ini);
            printf("\nLista deletada.");
            break;

        }
    }
}
 

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...