• Jueves 19 de Abril de 2018, 13:52

Autor Tema:  [resuelto] Problema con violacion de segmento  (Leído 177 veces)

Miguel Ruiz

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
[resuelto] Problema con violacion de segmento
« en: Sábado 31 de Marzo de 2018, 08:56 »
0
Hola a todos. Lo que pasa es que estoy trabajando con listas ligadas, el programa que estoy haciendo ya realiza algunas funciones, pero en la que me marca el error de violacion de segmento es cuando doy la opcion de realizar un recorrido del grafo y no se porque, las funciones que utilizo son unas que hice llamadas void recorrido() y void visitado(). en esa parte supongo que debe estar el error, una disculpa por poner el codigo completo pero es por si lo quieren correr. El error esta en la linea 344 en adelante que es donde hago mi funcion recorrido()
pd. El codigo esta sin terminar porque me atore en esta parte
    Modifico el post ya que ya corregi el problema que tenia, el fallo estaba en que hacia operaciones con direcciones invalidas(Si alguien quiere el codigo me lo puede decir)




    //
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define FALSO 0

    typedef struct grafo{
       struct grafo *vertice;
       struct vertad *verticead;
       char nombre[10];
            int vis;
    }elemento_grafo;

    typedef struct vertad{
       struct vertad *verticead;
       char nombre[10];
            int vis;
    }elemento_vert;

    typedef struct pilas{
            struct pilas *sig;
            char nombre[10];
    }pila;

    void menu(int *op);
    elemento_grafo *Crearnodo();
    elemento_grafo Creararco();
    elemento_grafo *Agregarvertice(elemento_grafo *cabeza);
    elemento_grafo *buscar(elemento_grafo *cabeza,char nom[10]);
    void Mostrargrafo(elemento_grafo *cabeza);
    void Calculargrado(elemento_grafo *cabeza);
    elemento_grafo  *Eliminarvertice(elemento_grafo *cabeza, char nom[10]);
    void Recorrido(elemento_grafo *cabeza);
    void Limpiar(elemento_grafo *cabeza);
    void visitado(elemento_grafo *cabeza,char nom[10]);
    pila *empilar(pila *inicio, elemento_vert *tem , char nom[10]);
    pila *desempilar(pila *inicio, char nom[10]);

    FILE *arch;
    int cont=0;
    int main(){
      elemento_grafo *cabeza;
      int op;
      char nom[10];
      arch = fopen("datos.txt","r+b");
      cabeza = NULL;
      if(arch != NULL){
      printf("\n Programa de grafos con listas de adyacencia");
      do{
        menu(&op);
        getchar();
        printf("\n\n");
        switch(op){
          case 1:
            cabeza = Agregarvertice(cabeza);
            cont++;
            break;
          case 2:
            Creararco(cabeza);
            break;
          case 3:
            if(cabeza != NULL){
              Mostrargrafo(cabeza);
            }
            else{
              printf("\n Grafo no existe");
            }
            break;
          case 4:
            if(cabeza == NULL)
         printf("\n No hay grafo que evaluar");
       else
         Calculargrado(cabeza);
       break;
          case 5:
            if(cabeza != NULL){
              printf("\n Si");
              printf("\n Ingrese el vertice que quiere eliminar:\t");
              scanf("%s",nom);
              cabeza = Eliminarvertice(cabeza,nom);
            }
            else
         printf("\n No existe grafo");
       break;
          case 6:
            if(cabeza == NULL)
              printf("\n Grafo vacio");
            else
              Recorrido(cabeza);
       break;
          default:
       break;
        }
       }while(op!=9);
      }
      fclose(arch);
    }

    void menu(int *op){
        char    local;
        printf("\n1> Ingresar vertice");
        printf("\n2> Ingresar arco");
        printf("\n3> Mostrar grafo");
        printf("\n4> Mostrar grado de grafo");
        printf("\n5> Eliminar vertice");
        printf("\n6> Mostrar recorrido del grafo");
        printf("\n7> Mostrar arbol de expansion minima");
        printf("\n8> Mostrar arbol de camino mas corto");
        printf("\n9> Salir");
        printf("\n   Seleccione una opcion:\t");
        do {
            local = getchar ();
            if ((isdigit (local) == FALSO) && (local != '\n')){
                printf ("\nIngrese una opcion valida.\n");
                printf("\n1> Ingresar vertice");
                printf("\n2> Ingresar arco");
                printf("\n3> Mostrar grafo");
                printf("\n4> Mostrar grado de grafo");
           printf("\n5> Eliminar vertice");
                printf("\n6> Mostrar recorrido del grafo");
                printf("\n7> Mostrar arbol de expansion minima");
                printf("\n8> Mostrar arbol de camino mas corto");
                printf("\n9> Salir");
                printf("\n   Seleccione una opcion:\t");
                //printf("\t");
            }
        } while (isdigit ((unsigned char) local) == FALSO);
            *op = (int) local - '0';
    }

    elemento_grafo *Crearnodo(){
      elemento_grafo *nuevo;
      char nom[10];
      printf("\n Ingrese el nombre del vertice:\t");
      //getchar();
      scanf("%s",nom);
      nuevo = (struct grafo*)malloc(sizeof(elemento_grafo));
      nuevo->vertice = NULL;
      nuevo->verticead = NULL;
      nuevo->vis = 0;
      strcpy(nuevo->nombre,nom);
      return nuevo;
    }


    elemento_grafo *Agregarvertice(elemento_grafo *cabeza){
      elemento_grafo *nuevo,*i;
      if (cabeza == NULL){
        nuevo = Crearnodo();
        fputs(nuevo->nombre,arch);
        return nuevo;
      }
      else{
        nuevo = Crearnodo();
        for (i = cabeza; i->vertice != NULL; i=i->vertice);
        i->vertice = nuevo;
        fputs(nuevo->nombre,arch);
        return cabeza;
      }
    }

    elemento_grafo *buscar(elemento_grafo *cabeza, char nom[10]){
      elemento_grafo *aux,*temp;
      //char nom[10];
      int f=0;
      //printf("\n Ingrese los nodos:\n    ");
      //getchar();
      //fgets(nom,10,stdin);
      //printf("\n %s",nom);
      temp= NULL;
      aux = cabeza;
      while(f==0){
        if(strcmp(aux->nombre,nom)==0){
          //printf("/ Vertice encontrado");
          temp = aux;
          f = 1;
        }
        else
          aux= aux->vertice;
        if(aux == NULL)
          f = 1;
      }
      return temp;
    }

    elemento_grafo Creararco(elemento_grafo *cabeza){
      elemento_grafo *ori,*des;
      elemento_vert *nuevo1,*nuevo2,*i;
      char nom[10];
      int f=0;
      if(cabeza != NULL){
        printf("\n Ingrese el nodo origen:\t");
        scanf("%s",nom);
        ori = buscar(cabeza,nom);
        //printf("\n Si");
        if(ori != NULL){
          printf("\n Ingrese el nodo destino:\t");
          scanf("%s",nom);
          des = buscar(cabeza,nom);
          if(des != NULL){
            nuevo1 = (struct vertad *)malloc(sizeof(elemento_vert));
       nuevo1->verticead = NULL;
            nuevo1->vis = 1;
       nuevo2 = (struct vertad *)malloc(sizeof(elemento_vert));
       nuevo2->verticead = NULL;
            nuevo2->vis = 1;
          strcpy(nuevo2->nombre,ori->nombre);
       strcpy(nuevo1->nombre,des->nombre);
       if(ori->verticead == NULL)
         ori->verticead = nuevo1;
       else{
         for(i = ori->verticead; i->verticead!= NULL; i=i->verticead);
         i->verticead = nuevo1;
       }
       if(des->verticead == NULL)
         des->verticead = nuevo2;
       else{
         for(i= des->verticead; i->verticead != NULL; i=i->verticead);
         i->verticead = nuevo2;
       }
          }
          else{
            printf("\n El nodo destino no existe");
          }
        }
        else{
          printf("El nodo origen no existe");
        }
      }
      else{
        printf("\n No hay suficientes vertices para crear arco");
      }
    }

    void Mostrargrafo(elemento_grafo *cabeza){
      elemento_grafo *i,*aux;
      elemento_vert  *j,*tem;
      aux = cabeza;
      int f=0,b=0;
      while(f==0){
        printf("%s",aux->nombre);
        tem = aux->verticead;
        while(tem != NULL){
          printf(" -> %s",tem->nombre);
          tem = tem->verticead;
        }
      aux = aux->vertice;
      if(aux == NULL)
        f=1;
      printf("\n");
      }
    }
    void Calculargrado(elemento_grafo *cabeza){
      elemento_grafo *aux, *i;
      elemento_vert  *tem;
      int f=0,cont=0,b=0,grado=0;
      aux = cabeza;
      while(f == 0){
        cont = 0;
        b=0;
        tem = aux->verticead;
        while(b == 0){
          if(tem == NULL){
            b=1;
          }
          else{
       cont++;
            tem = tem->verticead;
          }
        }
        aux = aux->vertice;
        if(cont>=grado){
         grado = cont;}
        if(aux == NULL){
          f=1;}
      }
      printf("\n El grado del grafo es:  %d",grado);
    }

    elemento_grafo *Eliminarvertice(elemento_grafo *cabeza, char nom[10]){
      elemento_grafo *pos,*aux,*i;
      elemento_vert  *tem,*j;
      int f=0,b=0;
      printf("\n %s",nom);
      pos = buscar(cabeza,nom);
      if(pos != NULL){
        aux = cabeza;
        if(pos == aux){
          aux =aux->vertice;
          cabeza = aux;
        }
        else
        if(pos->vertice == NULL){
          while(aux->vertice != pos)
            aux = aux->vertice;
        aux->vertice = NULL;
        }
        else{
          while(aux->vertice != pos)
            aux = aux->vertice;
          i = aux->vertice;
          i = i->vertice;
          aux->vertice = i;
          //return cabeza;
        }
      }
        aux = cabeza;
        while(aux != NULL){
          printf("\n Entra");
          b = 0;
          tem = aux->verticead;
          if(tem != NULL)
            while(tem != NULL){
              if(strcmp(tem->nombre,nom)== 0){
                if(tem->verticead == NULL && aux->verticead == tem)
                  aux->verticead = NULL;
                else
           if(tem->verticead == NULL){
             j= aux->verticead;
                  while(j->verticead != NULL)
          j = j->verticead;
                  j->verticead = NULL;
                }
                else
                if(aux->verticead == tem){
                  tem->verticead;
             aux->verticead = tem;
                }
                else
                if(tem->verticead == NULL){
                  j= aux->verticead;
                  while(j->verticead != tem)
          j = j->verticead;
                  tem = tem->verticead;
                  j->verticead = tem;
                }
              }
              tem = tem->verticead;
            }
          aux = aux->vertice;
        }
      return cabeza;
    }

    void Recorrido(elemento_grafo *cabeza){
      char nom[10];
      int nodos=cont;
      elemento_grafo *aux,*final;
      elemento_vert  *tem,*j,*i;
      pila *dir,*inicio=NULL;
      printf("\n Desde que nodo desea realizar el recorrido:\t");
      scanf("%s",nom);
      aux = buscar(cabeza,nom);
      if(aux == NULL){
        printf("\n El vertice dado no existe");}
      else{
        int f=0,b=0;
        printf("\n%d",cont);
        while(f == 0 ){
          if(nodos >= 0){
            printf("%s",aux->nombre);
            printf("->");}
          tem = aux->verticead;
          b = 0;
          while(b == 0){
            if(tem->vis == 1)
              tem = tem->verticead;
            else{
              j = tem;
              strcpy(nom,tem->nombre);
              while(j != NULL){
                if(strcmp(nom,j->nombre) > 0 && j->vis != 1){
                  printf("(%s)>(%s)",nom,j->nombre);
                  strcpy(nom,j->nombre);
                  i = j;
                  j = j->verticead;}
                else
                  j = j->verticead;
              }
               b=1;
            }
            //tem = tem->verticead;
            //if( tem->verticead == NULL || tem == NULL)
             //b = 1;
          }
          visitado(cabeza,nom);
          aux = buscar(cabeza,nom);
          nodos--;
          if(nodos == 0)
            f = 1;
        }
        printf("\n%d",nodos);
      }
    }


    pila *empilar(pila *inicio, elemento_vert *tem , char nom[10]){

    }

    pila *desempilar(pila *inicio, char nom[10]){
    }

    void visitado(elemento_grafo *cabeza, char nom[10]){
      elemento_grafo *aux;
      elemento_vert  *tem;
      int f=0,b=0;
      aux = cabeza;
      while( aux != NULL){
        if(strcmp(nom,aux->nombre) == 0){
          aux->vis = 1;
          aux = aux->vertice;}
        tem = aux->verticead;
        while( tem != NULL){
          if(strcmp(nom,tem->nombre) == 0){
            tem->vis = 1;
            tem = tem->verticead;}
          else
            tem = tem->verticead;
        }
        aux = aux->vertice;
      }
    }
« última modificación: Domingo 1 de Abril de 2018, 03:29 por Miguel Ruiz »