Oi, eu estava implementando o quicksort alterando somente os ponteiros e surgiu a seguinte dúvida: implementei e vi que deu uma falha de segmentação. Daí, comecei a simular e percebi que qndo termino o 1o. separa, ele deveria passar como parâmetro o endereço do primeiro da lista. Fiz para a seguinte lista:
7,0 -> 7,6 -> 5,8 -> 2,7 -> 8,4 -> 8,0 -> 5,7 -> 8,1 -> 5,1 -> 3,4
Ele foi trocando, trocando, até que a lista ficou assim:
8,1 -> 7,6 -> 8,0 -> 8,4 -> 2,7 -> 5,8 -> 5,7 -> 7,0 -> 5,1 -> 3,4
Daí, terminaria a 1a. iteração, devolve o endereço do 8,4 e ele deveria recomeçar fazendo o quicksort pelo 8,1 e pelo 8,4. Mas vi que ele estava fazendo com o 7,0! Dai ele fez td errado. Sendo assim, eu devo usar ponteiro de ponteiro no método? Por que ele pegou o valor antigo? Usei ponteiro "simples", ou seja, algo do tipo: quicksort(Filme *esquerda, Filme *direita).
Dai e fiz a chamda no main assim: quicksort(lista->inicio, lista->fim).
PS: Tenho certeza que não há problemas com os ponteiros pq fiquei imprimindo a lista e não havia nenhum problema...
Passa na monitoria algum dia desses. Seu programa deve ter ou algum erro lógico ou algum ponteiro que está sendo perdido.
Abraços!
Abraços!
Hum... Acho q descobri o erro... Eu deveria ter feito atribuições do tipo *ponteiro1 = *ponteiro2? Se eu o fizer, eu vou estar copiando todo o conteúdo do ponteiro ou altero o endereço apontado por eles?
Se ponteiro1 e ponteiro2 são dois ponteiros, *ponteiro1 = *ponteiro2 faz com que o valor apontado por ponteiro1 seja o mesmo apontado por ponteiro2. Não há alteração da memória, mas sim dos valores associados aos ponteiros.
Abraços
Abraços
Qndo vc diz todo conteúdo, no caso dos filmes, isso inclui tb os ponteiros que ele tem, neh?
Oi, tentei mudar para ponteiro de ponteiro mas não consigo implementar. Eu tentei fazer esse exemplo:
void muda1(Filme *a, Filme *b){
Filme *aux;
aux = (Filme*)malloc(sizeof(Filme));
/*Neste caso nao serve pq eu estaria alocando um novo espaço na memória e não é isso que deveria ser feito no bônus...*/
*aux = *a;
*a=*b;
*b=*aux;
}
void muda2(Filme **a, Filme **b){
Filme **aux;
aux=a;
a=b;
b=aux;
}
void muda3(Filme *a, Filme *b){
Filme *aux;
aux=a;
a=b;
b=aux;
}
int main(){
Filme **p, **q, *a, *b;
a = (Filme*)malloc(sizeof(Filme));
a->nota=-1;
b=(Filme*)malloc(sizeof(Filme));
b->nota=-2;
p = &a;
q = &b;
/*muda3(*q, *w);
muda2(q,w);*/
muda1(*q, *w);
}
Eu esperava que no método troca, as variáveis tivessem nota trocada. Apenas em muda1 isso aconteceu, mas não dessa forma q devemos fazer... Não consegui mudar fazendo pelo muda2 e pelo muda3... O q fiz de errado?
PS: Onde encontro algum livro ou site q explique ponteiro de ponteiro sem q seja uma matriz? Soh encontro isso...
void muda1(Filme *a, Filme *b){
Filme *aux;
aux = (Filme*)malloc(sizeof(Filme));
/*Neste caso nao serve pq eu estaria alocando um novo espaço na memória e não é isso que deveria ser feito no bônus...*/
*aux = *a;
*a=*b;
*b=*aux;
}
void muda2(Filme **a, Filme **b){
Filme **aux;
aux=a;
a=b;
b=aux;
}
void muda3(Filme *a, Filme *b){
Filme *aux;
aux=a;
a=b;
b=aux;
}
int main(){
Filme **p, **q, *a, *b;
a = (Filme*)malloc(sizeof(Filme));
a->nota=-1;
b=(Filme*)malloc(sizeof(Filme));
b->nota=-2;
p = &a;
q = &b;
/*muda3(*q, *w);
muda2(q,w);*/
muda1(*q, *w);
}
Eu esperava que no método troca, as variáveis tivessem nota trocada. Apenas em muda1 isso aconteceu, mas não dessa forma q devemos fazer... Não consegui mudar fazendo pelo muda2 e pelo muda3... O q fiz de errado?
PS: Onde encontro algum livro ou site q explique ponteiro de ponteiro sem q seja uma matriz? Soh encontro isso...
Karina, mude isso no seu muda2:
*aux = *a;
*a = *b;
*b = *aux;
Veja se funciona.
Abraços!
*aux = *a;
*a = *b;
*b = *aux;
Veja se funciona.
Abraços!