//------------------------------------------------------------------------------ // destroi um vertice static void destroi_vertice(vertice v){ destroi_lista(v->adjacencias_saida, (int (*)(void *)) destroi_vizinho); destroi_lista(v->adjacencias_entrada, (int (*)(void *)) destroi_vizinho); v->grau_saida = 0; v->grau_entrada = 0; free(v->nome); free(v); v = NULL; }
int sao_isomorfos(grafo g, grafo f) { int i = 0; int j, k; int iso = 0; int tam = g.n_vertices; int *tmp = (int*) malloc(sizeof(int)); int v[tam], t_perm = 0; lista *perm; perm = constroi_lista(); for(i=0; i < tam; i++) { v[i] = i; } if((g.n_vertices != f.n_vertices) || (g.arestas != f.arestas) || (!iguais(g, f))) return iso; perm = nova_permuta(perm, v, 0, tam); t_perm = tamanho_lista(perm); for(i=0; i < t_perm; i++) { tmp = (int*) remove_lista(perm); //mostre(tmp, tam); iso = 1; for(j=0; j < tam; j++) { for(k=0; k < tam; k++) { if(g.matriz[j][k] != f.matriz[tmp[j]][tmp[k]]) { iso = 0; /*printf("Nao e isomorfo - "); mostre(tmp, tam);*/ break; } } if(!iso) break; } if(iso) { /*printf("E isomorfo - "); mostre(tmp, tam);*/ destroi_lista(perm); return 1; } } destroi_lista(perm); return 0; }
static int destroi_vertice( void *ptr ){ struct vertice *v = ptr; if( v ){ free(v->nome); int e = destroi_lista( v->arestas_entrada, destroi_aresta ); int s = destroi_lista( v->arestas_saida, destroi_aresta ); if( e && s ) { free( v ); return 1; } } return 0; }
void main(void) { char resp; char texto[20]; no_tipo *L_pilha ; /* variavel local a main ==> na PILHA */ printf (" \n Criando uma lista + pointer na PILHA.... (nao na HEAP) "); L_pilha = NULL; /* inicializa o ponteiro .... */ // printf ("\n Conteudo:: %x Onde estah:: %x. Conteudo Indireto:: ", L_pilha, &L_pilha); do { printf("\n DIGITE NOME: "); scanf("%s", texto ); ins_lst(texto, & L_pilha ); fflush(stdin); printf("\n Mais alguem (s ou S): "); resp = (char)toupper(getche()); printf("\n........................."); } while(resp == 'S'); imp_lista( L_pilha ); destroi_lista( & L_pilha ); printf ("\n Apos a exclusao\n\n"); imp_lista( L_pilha ); puts("\n..... SUCESSO......"); }
grafo escreve_grafo(FILE *output, grafo g) { if(!(g && output)) return NULL; vertice v; aresta a; no nv, na; fprintf( output, "strict %sgraph \"%s\" {\n\n", g->direcionado ? "di" : "", g->nome ); // Imprime vertices for( nv = primeiro_no(g->vertices); nv; nv = proximo_no(nv) ){ v = conteudo(nv); fprintf( output, " \"%s\"\n", v->nome ); } fprintf( output, "\n" ); // Imprime arestas lista la = arestas(g); const char *dir = g->direcionado ? "->" : "--"; for( na = primeiro_no(la); na; na = proximo_no(na) ){ a = conteudo(na); fprintf( output, " \"%s\" %s \"%s\"", nome_vertice(a->origem), dir, nome_vertice(a->destino) ); if( g->ponderado ) fprintf( output, " [peso=%ld]", a->peso ); fprintf( output, "\n" ); } fprintf( output, "}\n" ); destroi_lista(la, NULL); return g; }
//------------------------------------------------------------------------------ static Agraph_t *mostra_grafo(Agraph_t *g) { if ( ! g ) return NULL; direcionado = agisdirected(g); n_vertices = agnnodes(g); n_arestas = agnedges(g); lista_arestas = constroi_lista(); printf("strict %sgraph \"%s\" {\n\n", agisdirected(g) ? "di" : "", agnameof(g) ); mostra_vertices(g); printf("\n"); mostra_arestas(); printf("}\n"); destroi_lista(lista_arestas, NULL); return g; }
grafo emparelhamento_maximo(grafo g){ if( !g ) return NULL; lista lv; while((lv = caminho_aumentante(g)) != NULL) { xor(lv); destroi_lista(lv, NULL); } return grafo_emparelhamento(g); }
int destroi_grafo(void *g) { struct grafo *r = g; if( r ) { free( r->nome ); if( destroi_lista( r->vertices, destroi_vertice ) ){ free( g ); return 1; } } return 0; }
//------------------------------------------------------------------------------ // static lista caminho_aumentante(grafo g) { if( !g ) return NULL; lista l; for( no n = primeiro_no(g->vertices); n; n = proximo_no(n) ){ vertice v = conteudo(n); if( !v->coberto ) { v->visitado = 1; l = constroi_lista(); if( busca_caminho(v, l, 1) ) { return l; } else { printf("busca deu errado\n"); desvisita_vertices(g); destroi_lista(l, NULL); } } } desvisita_vertices(g); return NULL; }
int main(void){ ListaEnc *lista; TipoInfo *info, *aux; int escolha = -1; char valor1[30]; char valor2[30]; int valor3 = -1000; int pos = -1; int flag=0; while ((escolha = menu())!= 0){ switch (escolha){ case 1: flag++; lista = criaLista(); break; case 2: valor3 = estah_vazia(lista); system("clear"); if(valor3 == 1) printf("A lista esta vazia\n"); else printf("A lista nao esta vazia\n"); printf("\nObs: Quando a lista encadeada esta vazia, adicionar registro no fim\ne no inicio corresponde a uma mesma operacao.\n"); break; case 3: system("clear"); printf("Informe o nome do usuario: "); scanf("%s", valor1); printf("Informe o curso do usuario: "); scanf("%s", valor2); printf("Informe a fase em que se encontra o usuario: "); scanf("%d", &valor3); system("clear"); info = criaInfo(valor1, valor2, valor3); adicionaNoInicio(lista, info); break; case 4: system("clear"); printf("Informe o nome do usuario: "); scanf("%s", valor1); printf("Informe o curso do usuario: "); scanf("%s", valor2); printf("Informe a fase em que se encontra o usuario: "); scanf("%d", &valor3); system("clear"); if(lista->tamanho > 1){ imprime_lista(lista); do{ printf("Podera inserir registros entre o 1o e o ultimo registro inclusive\n"); printf("Informe a posicao que desejas inserir este registro: "); scanf("%d", &pos); }while(pos <= 0 || pos >= lista->tamanho); info = criaInfo(valor1, valor2, valor3); adicionaNaPosicao(lista, info, pos); }else if(lista->tamanho <= 1 ){ info = criaInfo(valor1, valor2, valor3); adicionaNoInicio(lista, info); } break; case 5: system("clear"); printf("Informe o nome do usuario: "); scanf("%s", valor1); printf("Informe o curso do usuario: "); scanf("%s", valor2); printf("Informe a fase em que se encontra o usuario: "); scanf("%d", &valor3); system("clear"); info = criaInfo(valor1, valor2, valor3); adicionaNoFim(lista, info); break; case 6: aux = retiraDoInicio(lista); system("clear"); printf("Registro retirado\n\nNome de usuario: %s\nCurso do usuario: %s\nFase em que o usuario se encontra: %d", aux->nome, aux->curso, aux->fase); break; case 7: aux = retiraDoFim(lista); system("clear"); printf("Registro retirado\n\nNome de usuario: %s\nCurso do usuario: %s\nFase em que o usuario se encontra: %d", aux->nome, aux->curso, aux->fase); break; case 8: imprime_lista(lista); break; case 9: if(flag == 1){ flag--; destroi_lista(lista); }else printf("Nao ha lista para destruir\n"); } } if(flag == 1){ destroi_lista(lista); } return 0; }
//------------------------------------------------------------------------------ int main(void) { struct grafo *g, *d, *c; struct vertice *v; struct no *n; lista l; g = le_grafo(stdin); escreve_grafo(stdout, g); if((l = ordena(g)) != NULL) { for(n = primeiro_no(l); n != NULL; n = proximo_no(n)) { v = (struct vertice *) conteudo(n); fprintf(stdout, "%s\n", nome_vertice(v)); } destroi_lista(l, nao_destroi_nos); } if((l = componentes(g)) != NULL) { for(n = primeiro_no(l); n != NULL; n = proximo_no(n)) { c = (struct grafo *) conteudo(n); escreve_grafo(stdout, c); } destroi_lista(l, destroi_grafo); } d = arvore_geradora_minima(g); if(d != NULL) { escreve_grafo(stdout, d); destroi_grafo(d); } /* d = arborescencia_caminhos_minimos(g, v); if(d != NULL) { escreve_grafo(stdout, d); destroi_grafo(d); } */ d = distancias(g); if(d != NULL) { escreve_grafo(stdout, d); destroi_grafo(d); } fprintf(stdout, "Diametro = %ld\n", diametro(g)); if(conexo(g)) { fprintf(stdout, "Conexo!\n"); } else { fprintf(stdout, "Não é conexo!\n"); } if(fortemente_conexo(g)) { fprintf(stdout, "Fortemente conexo!\n"); } else { fprintf(stdout, "Não é fortemente conexo!\n"); } /*if((l_blocos = blocos(g)) != NULL) { fprintf(stderr, "\n--Blocos criados:\n" ); for(n = primeiro_no(l); n != NULL; n = proximo_no(n)) { c = (struct grafo *) conteudo(n); escreve_grafo(stdout, c); } destroi_lista(l_blocos, destroi_grafo); }*/ destroi_grafo(g); return 0; }