Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com Ponteiros


Josefran

Pergunta

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

Até agora não há respostas para essa pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...