Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

ruisousa27

Adicionar Elemento a PILHA

Mensagens Recomendadas

ruisousa27    0
ruisousa27

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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo    1151
HappyHippyHippo

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
}

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruisousa27    0
ruisousa27

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 :(

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Greemax    2
Greemax

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.

Editado por Greemax

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram    8
seuqram

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;
  //...
}

Editado por seuqram
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo    1151
HappyHippyHippo

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;
}

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.