Jump to content
thinkabout

Inserir um elemento n no posição y da lista | Apagar um elemento n no posição y da lista

Recommended Posts

thinkabout

Boas, já consigo inserir o elemento o meu problema está depois em ligar esse novo elemento ao número que está a frente.

Actualmente com este código ele insere e estoira, já tentei de outra forma e que me acontece é aparecer 1,2,3,3,3,3,3,3,3....(loop).

A asneira deverá andar por aqui.

Sei que depois tenho que tornar a função mais genérica, mas para já estava só a tentar que ela funcionasse nesse exemplo.

   novo->prox=aux->prox->prox;  // !?? aqui queria ligar o novo bloco ao bloco da frente (chcek NOT OK)

pno inserposx(pno lista) // Inserir na posição X para exemplo vamos inserir o 3 no meio 1,2,4,5
{
   int posactual=0;
   int pos=1;
   pno aux;
   pno novo;    
   aux=lista; // Igual á cabeça da lista

   if ((novo=(pno)malloc(sizeof(no)))==NULL) 
   {
       printf("erro na alocacao de memoria"); 
   } 

   printf("Novo Paciente\nNome:");
   fgets(novo->nome,ST_TAM,stdin);

   while (posactual != pos) // Meto o aux no 2, quero inserir o nr 3 neste caso 1,2,4,5
   {
       aux=aux->prox;
       posactual++;
   }
   aux->prox=novo; // Ligo o prox do aux onde estou ao novo bloco de memória onde estou. (check ok)
   novo->prox=aux->prox->prox;  // !?? aqui queria ligar o novo bloco ao bloco da frente (chcek NOT OK)


   printf("A posicao onde estou a inserir é nr %s", aux->prox);

   return lista;

}

Edited by thinkabout

Share this post


Link to post
Share on other sites
HappyHippyHippo

aux->prox = novo;              // qual o valor de novo ?
                              // qual o valor de aux-prox depois da atribuição ?
novo->prox = aux->prox->prox;  // qual o valor de aux->prox ?
                              // qual o valor de aux->prox->prox ?
                              // qual o valor de novo->prox depois da atribuição ?

por amor de Deus, pensa antes de responder !!!

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thinkabout

No código anterior depois da atribuição ficavam a apontar para a lua.

pno inserposx(pno lista) // Vamos inserir o 3 no meio 1,2,4,5
{
   int posactual=0;
   int pos;
   pno aux;
   pno novo;    
   aux=lista; // Igual á cabeça da lista

   if ((novo=(pno)malloc(sizeof(no)))==NULL) 
   {
       printf("erro na alocacao de memoria"); 
   } 

   printf("Novo Paciente\nNome:");
   fgets(novo->nome,ST_TAM,stdin);
   puts("Em que posicao queres inseir:");
   scanf("%d", &pos);

   while (posactual != pos) // Meto o aux no 2, quero inserir o nr 3 neste caso 1,2,4,5
   {
       aux=aux->prox;
       posactual++;
   }
   novo->prox=aux->prox; // Ligo o a posição tres à posição quarto
   aux->prox=novo;  // Ligo a posição dois a posição numero três.                          

   printf("A posicao onde estou a inserir é nr %s", aux->prox);

   return lista;
}

Agora faltava afinar para se quiser meter o elemento na cabeça da lista.

Edited by thinkabout

Share this post


Link to post
Share on other sites
thinkabout

Segue a função apagar.

Se existirem sugestões.

edited...ups tenho bug nisto.

Se apagar a posição 0 ele apaga o número 1

Se apagar a posição 1 ele apaga-me o número 3

pno apagaposx(pno lista) // Ex: 1,2,3,4,5
{
   int posactual=0;
   int pos;
   pno aux=NULL;
   pno lixo=NULL;
   aux=lista; // Igual á cabeça da lista

   puts("Qual e a posicao que queres libertar:");
   scanf("%d", &pos);

   if (lista==NULL)
   {
    printf("A lista esta vazia");
   }

   if (posactual == pos)
   {
       aux=lista->prox; // A cabeça da lista anda uma posição para a frente.
       free(lista); // Liberto a antiga cabeça.
       return aux; // Retorno a lista.
   }
   else {
           while (posactual != pos)
           {
               aux=aux->prox;
               posactual++;
           }

           lixo=aux->prox; // Como vou apagar este e ficar sem apontador para ele tenho que lá meter um apontador auxilar para depois fazer o free.
           // printf("lixo esta com o valor %s", lixo); 
           aux->prox=aux->prox->prox; // Ligo o a posição dois à posição quarto. // No caso de ser 1,2,3,4 e passar a ser 1,2,4.
           free(lixo); // Liberto o número que ficou soltou no meio no caso seria o 3n.
       }
   return lista;
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
thinkabout

Já verifica.

Primeiro/ elemento N / Último / Lista Vazia

Aceitam-se sugestões.

pno apagaposx(pno lista) // Vamos inserir o 3 no meio 1,2,4,5
{
   int posactual=0;
   int pos;
   int totaldelementos=0;
   pno aux;
   pno lixo=NULL;
   aux=lista; // Igual á cabeça da lista

   if (lista==NULL)
   {
       printf("A lista esta vazia");
       return NULL;
   }

   while(aux != NULL)
   {
       aux=aux->prox;
       totaldelementos++;
   }
   totaldelementos=totaldelementos-1; // Para bater certo com a posição e depois entrar no segundo if
   printf("O ultimo elemento tem como indice %d\n", totaldelementos);

   aux=lista; // Volto a por o ponteiro no no começo, porque tive a usa-lo para contar o nr de elementos.

   puts("Qual e a posicao que queres libertar:");
   scanf("%d", &pos);

   //Liberta o primeiro elemento
   if (posactual == pos)
   {
       aux=lista->prox; // A cabeça da lista anda uma posição para a frente.
       free(lista); // Liberto a antiga cabeça.
       return aux; // Retorno a lista.
   }


   //Liberta o ultimo elemento
   if (totaldelementos == pos)
   {
       while (aux->prox->prox != NULL) // <------------- pesquisar pelo penúltimo elemento, para teres a referência do último
       {  
           aux = aux->prox; // Andar como aux para a frente
       }
       printf("neste momento vou libertar a posicao que tem o nome %s", aux->prox->nome);
       free(aux->prox); // <---------------------------- tratar da libertação de memória !!! nunca esquecer !!!
       aux->prox = NULL; // <--------------------------- limpar o "agora" lixo do ponteiro
       return lista; // Retorno a lista.    
   }

   else  // Liberta os restantes
   {
       posactual=1; // Como o primeiro IF e o segundo IF não aconceram meto-me na posição indice 1.
       while (posactual != pos)
       {
           aux=aux->prox;
           posactual++;
       }

       lixo=aux->prox; // Como vou apagar este e ficar sem apontador para ele tenho que lá meter um apontador auxilar para depois fazer o free.
       // printf("lixo esta com o valor %s", lixo);
       aux->prox=aux->prox->prox; // Ligo o a posição dois à posição quarto. // No caso de ser 1,2,3,4 e passar a ser 1,2,4.
       free(lixo); // Liberto o número que ficou soltou no meio no caso seria o 3n.
           return lista;

   }        


}

Edited by thinkabout

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.