Galera estou aqui com mais um problema, mas antes queria agradecer principalmente ao maligno por me ajjudar ate agora....
Bem... O problema dessa vez é o seguinte
eu tenho uma lista encadeada simples e quero mudar dois elemnetos da lista de lugar...
Eu fiz da seguinte maneira(Vale ressaltar que pos2 = pos1-1 não coloquei ai mas é bom citar
Figura *troca(Figura *fig, int pos1, int pos2){
Figura *temp1;
Figura *temp2;
Figura *temp3;
Figura *temp4;
if(pos1<0 || pos2<0){
printf("Error\nO programa sera encerrado Cod 01\n");
system("pause");
exit(0);
}
temp1 = percorrer(fig, pos1-1); //devolve o elemento figura da posicao pos1-1
temp2 = percorrer(fig, pos1);
temp3 = percorrer(fig, pos2);
temp4 = percorrer(fig, pos2+1);
temp1->next = temp3;
temp3->next = temp2;
temp2->next = temp4;
return fig;
}
pois é.... estou tendo problemas ai... pois ele não troca e ainda por cima parece que cria um loop infinito...
Se quizer ver eis o codigo fonte completo
Estruturas.h
int comprimento(Figura *fig);
float retorneArea(Figura *fig);
Figura *percorrer(Figura *fig, int i);
Figura *troca(Figura *fig, int pos1, int pos2);
Figura *BubbleSort(Figura *fig);
Funcoes.c
#include "Estruturas.h"
#include "Funcoes.h"
#include <windef.h>
int comprimento(Figura *fig){
int tamanho;
tamanho = 0;
while(fig != NULL){
tamanho++;
fig = fig->next;
}
return tamanho;
}
float retorneArea(Figura *fig){
if(fig->circulo != NULL){
return fig->circulo->area;
}
if(fig->quadrado != NULL){
return fig->quadrado->area;
}
if(fig->triangulo != NULL){
return fig->triangulo->area;
}
return 0.0;
}
Figura *percorrer(Figura *fig, int i){
int j;
for(j = 0; j<i; j++){
if(fig != NULL){
fig = fig->next;
}
else{
printf("Error\nO programa sera encerrado Cod 02\n");
system("pause");
exit(0);
}
}
return fig;
}
Figura *troca(Figura *fig, int pos1, int pos2){
Figura *temp1;
Figura *temp2;
Figura *temp3;
Figura *temp4;
if(pos1<0 || pos2<0){
printf("Error\nO programa sera encerrado Cod 01\n");
system("pause");
exit(0);
}
temp1 = percorrer(fig, pos1-1);
temp2 = percorrer(fig, pos1);
temp3 = percorrer(fig, pos2);
temp4 = percorrer(fig, pos2+1);
temp1->next = temp3;
temp3->next = temp2;
temp2->next = temp4;
return fig;
}
Figura *BubbleSort(Figura *fig){
int lenght;
int i;
int j;
float areaI;
float areaJ;
Figura *atual;
lenght = comprimento(fig)-1;
for(i = 0; i<lenght; i++){
for(j = lenght; j>=i+1; j--){
atual = percorrer(fig, j);
areaJ = retorneArea(atual);
atual = percorrer(fig, j-1);
areaI = retorneArea(atual);
if(areaJ<areaI){
fig = troca(fig, j-1, j);
}
}}
return fig;
}
Pergunta
Josefran
Galera estou aqui com mais um problema, mas antes queria agradecer principalmente ao maligno por me ajjudar ate agora....
Bem... O problema dessa vez é o seguinte
eu tenho uma lista encadeada simples e quero mudar dois elemnetos da lista de lugar...
Eu fiz da seguinte maneira(Vale ressaltar que pos2 = pos1-1 não coloquei ai mas é bom citar
Figura *troca(Figura *fig, int pos1, int pos2){ Figura *temp1; Figura *temp2; Figura *temp3; Figura *temp4; if(pos1<0 || pos2<0){ printf("Error\nO programa sera encerrado Cod 01\n"); system("pause"); exit(0); } temp1 = percorrer(fig, pos1-1); //devolve o elemento figura da posicao pos1-1 temp2 = percorrer(fig, pos1); temp3 = percorrer(fig, pos2); temp4 = percorrer(fig, pos2+1); temp1->next = temp3; temp3->next = temp2; temp2->next = temp4; return fig; }pois é.... estou tendo problemas ai... pois ele não troca e ainda por cima parece que cria um loop infinito... Se quizer ver eis o codigo fonte completo Estruturas.htypedef struct Circulos{ char nome[20]; char cor[10]; float area; float raio; } Circulo; typedef struct Triangulos{ char nome[20]; char cor[10]; float area; float base; float altura; } Triangulo; typedef struct Quadrados{ char nome[20]; char cor[10]; float area; float lado; } Quadrado; typedef struct Figuras{ Circulo *circulo; Quadrado *quadrado; Triangulo *triangulo; struct Figuras *next; } Figura;/*Estrutura usada para controle da figura*/Funcoes.h Funcoes.c#include "Estruturas.h" #include "Funcoes.h" #include <windef.h> int comprimento(Figura *fig){ int tamanho; tamanho = 0; while(fig != NULL){ tamanho++; fig = fig->next; } return tamanho; } float retorneArea(Figura *fig){ if(fig->circulo != NULL){ return fig->circulo->area; } if(fig->quadrado != NULL){ return fig->quadrado->area; } if(fig->triangulo != NULL){ return fig->triangulo->area; } return 0.0; } Figura *percorrer(Figura *fig, int i){ int j; for(j = 0; j<i; j++){ if(fig != NULL){ fig = fig->next; } else{ printf("Error\nO programa sera encerrado Cod 02\n"); system("pause"); exit(0); } } return fig; } Figura *troca(Figura *fig, int pos1, int pos2){ Figura *temp1; Figura *temp2; Figura *temp3; Figura *temp4; if(pos1<0 || pos2<0){ printf("Error\nO programa sera encerrado Cod 01\n"); system("pause"); exit(0); } temp1 = percorrer(fig, pos1-1); temp2 = percorrer(fig, pos1); temp3 = percorrer(fig, pos2); temp4 = percorrer(fig, pos2+1); temp1->next = temp3; temp3->next = temp2; temp2->next = temp4; return fig; } Figura *BubbleSort(Figura *fig){ int lenght; int i; int j; float areaI; float areaJ; Figura *atual; lenght = comprimento(fig)-1; for(i = 0; i<lenght; i++){ for(j = lenght; j>=i+1; j--){ atual = percorrer(fig, j); areaJ = retorneArea(atual); atual = percorrer(fig, j-1); areaI = retorneArea(atual); if(areaJ<areaI){ fig = troca(fig, j-1, j); } }} return fig; }teste.c#include "Estruturas.h" #include <String.h> #include <stdio.h> #include "Funcoes.h" void static proximo(int i){ i = i+1; } main(void){ Circulo *c, *c1; int i; Quadrado *q; Triangulo *t; Figura *p, *r; c = malloc(sizeof(Circulo)); q = malloc(sizeof(Quadrado)); t = malloc(sizeof(Triangulo)); p = malloc(sizeof(Figura)); strcpy(c->cor,"Preto"); c->area = 12.0; strcpy(c->nome,"Circulo"); c->raio = 3.0; strcpy(q->cor,"Branco"); p->circulo = c; p->quadrado = NULL; p->triangulo = NULL; r= malloc(sizeof(Figura)); p->next = r; q->area = 15.0; strcpy(q->nome,"Quadrado"); q->lado = 3.0; r->circulo = NULL; r->quadrado = q; r->triangulo = NULL; r = r->next; r= malloc(sizeof(Figura)); t->altura = 3.0; t->base = 2.0; t->area = 3.0; strcpy(t->cor, "Rosa"); strcpy(t->nome, "Triangulo"); r->circulo = NULL; r->quadrado = NULL; r->triangulo = t; p->next->next = r; r->next = NULL; for(i = 0; i<10; i++){} printf("%d\n", i); system("pause"); proximo(i); r = p; printf("%d\n", i); while(r != NULL){ if(r->circulo!=NULL){ printf("%s %.2f \n", r->circulo->nome, r->circulo->area); } if(r->quadrado!=NULL){ printf("%s %.2f \n", r->quadrado->nome, r->quadrado->area); } if(r->triangulo!=NULL){ printf("%s %.2f \n", r->triangulo->nome, r->triangulo->area); } r = r->next; } system("pause"); p = BubbleSort(p); system("pause"); while(p != NULL){ if(p->circulo!=NULL){ printf("%s %.2f \n", p->circulo->nome, p->circulo->area); } if(p->quadrado!=NULL){ printf("%s %.2f \n", p->quadrado->nome, p->quadrado->area); } if(p->triangulo!=NULL){ printf("%s %.2f \n", p->triangulo->nome, p->triangulo->area); } p = p->next; } system("pause"); }P.S Sei que é uma boa prática de programação comentar, mas eu esqueci rs vou colocar ainda
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.