ruisousa27 Posted June 18, 2016 at 04:56 PM Report #597254 Posted June 18, 2016 at 04:56 PM 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...
HappyHippyHippo Posted June 18, 2016 at 07:53 PM Report #597256 Posted June 18, 2016 at 07:53 PM 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 } 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
ruisousa27 Posted June 19, 2016 at 09:04 AM Author Report #597266 Posted June 19, 2016 at 09:04 AM 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 😞
Greemax Posted June 19, 2016 at 12:26 PM Report #597269 Posted June 19, 2016 at 12:26 PM (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 June 19, 2016 at 12:29 PM by Greemax
seuqram Posted June 19, 2016 at 01:21 PM Report #597272 Posted June 19, 2016 at 01:21 PM (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 June 19, 2016 at 01:44 PM by seuqram 1 Report
ruisousa27 Posted June 19, 2016 at 04:15 PM Author Report #597275 Posted June 19, 2016 at 04:15 PM Obrigado a todos pela ajuda, fiquei esclarecido...
HappyHippyHippo Posted June 19, 2016 at 06:34 PM Report #597278 Posted June 19, 2016 at 06:34 PM 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; } 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now