Jump to content

Recommended Posts

Posted

Boas pessoal,

Preciso de inserir um determinado numero (n) numa determinada posição de uma pilha(idx) a contar do topo da pilha, sendo que o elemento do topo da pilha é o elemento de posição 0. E no caso de o idx ser mais que a dimensao da pilha este novo elemento deverá se colocado no fim da mesma.

Obs: A pilha apenas tem um ponteiro para o topo da mesma e capacidade de guardar um inteiro (dados) em cada nó.

O código que eu tenho é este:


int CPilhaInteiros::especial(int n, int idx){

CNoPilha *current = topo;
CNoPilha *previous = NULL;
CNoPilha *novo = new CNoPilha;
novo->dados = n;
novo->proximo = NULL;

int no_idx = 0; //conta o indice do no
while (current != NULL){
if (no_idx == idx){
previous = current;
current = novo;
current->proximo = previous;
return;
}
current = current->proximo;
no_idx++;
}
//Se nao encontrou o idx é porque ele é maior que a dimensao da pilha, logo coloca no fim.
current->proximo = novo;
}

mas isto não está a funcionar , e eu nao entendo porque. se alguem me conseguir ajudar...

Posted

vou colocar isto como highlight de C porque de C++ ...

int CPilhaInteiros::especial(int n, int idx){
 // ...
 while (current != NULL){
// ...
 }

 // aqui "current" é NULL por ter saido do ciclo
 current->proximo = novo;  // <-------- segmentation fault
}

Mas mesmo que eu retire essa instrução continua a dar segmentation fault 😞

Posted (edited)

Boas,

Antes de mais recomendo te a identar o código, pois facilita a interpretação do mesmo, o que nos ajuda a ajudar-te. Estou a achar um pouco estranho o que tens dentro do if. Não quererás dizer:

previous = current;
current = novo;
current->proximo = previous->proximo;
previous->proximo = current;

Outro conselho, convém seres consistente na linguagem que usas, ou seja, usa ou inglês ou português para os nomes que dás às coisas. Torna-se uma má pratica misturar as coisas.

Edited by Greemax
Posted (edited)
void /*change*/ CPilhaInteiros::especial(int n, int idx){

  if(idx <= 0){ // new
       std::cout << "Out of Range" << endl;
       return;
       }

  CNoPilha *novo = new CNoPilha;

  if(!topo){ //new
         topo = novo;
  }

  CNoPilha *current = topo;
  CNoPilha *previous = NULL;

  int no_idx = 0;

  while(1){ //new 
  while (current != NULL){

     previous = current //new
     if (no_idx == idx - 1){ //change
     //previous = current; 'delete'
     novo->dados = n;
     current = novo;
     current->proximo = previous;

     return;
     }
  current = current->proximo;
  no_idx++;
  }

  previous->proximo = novo; //change
  }
}

Construtor do CNoPilha:

CNoPilha::CNoPilha()
{
  proximo = Null;
  dados = 0;
  //...
}
Edited by seuqram
  • Vote 1
Posted

solução simplificada:

CPilhaInteiros &
CPilhaInteiros::especial(int dados, size_t pos) {
   CNoPilha * novo = new CNoPilha(dados); // <-- construtor apropriado

   if (!topo || !pos) {
       novo->next = topo;
       topo = novo;
   } else {
       CNoPilha * it = topo;
       size_t it_pos = 0;
       while (it->next != nullptr && it_pos != pos - 1)
           it = it->next;
       novo->next = it->next;
       it->next = novo;
   }

   return * this;
}
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p

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.