int remove_no(struct lista *l, struct no *rno, int destroi(void *)) { int r = 1; if (l->primeiro == rno) { l->primeiro = rno->proximo; if (destroi != NULL) { r = destroi(conteudo(rno)); } free(rno); l->tamanho--; return r; } for (no n = primeiro_no(l); n->proximo; n = proximo_no(n)) { if (n->proximo == rno) { n->proximo = rno->proximo; if (destroi != NULL) { r = destroi(conteudo(rno)); } free(rno); l->tamanho--; return r; } } return 0; }
void destroi(Rota *t) { if(t == NULL) return; destroi(t->prox); t->prox = livre; livre = t; }
int destroi_lista(lista l, int destroi(void *)) { no p; int ok = 1; while ( (p = primeiro_no(l)) ) { l->primeiro = proximo_no(p); if ( destroi ) ok &= destroi(conteudo(p)); free(p); } free(l); return ok; }
//------------------------------------------------------------------------------ int destroi_lista(lista l, int destroi(void *)) { if ( !l ) return 0; no prox; for (no n=primeiro_no(l); n; n=prox) { prox = proximo_no(n); if (destroi) destroi(conteudo(n)); free(n); } free(l); return 1; }
//Nome: MatrizAdjacenciaBuscaProfund //Função: Realiza uma busca em profundidade em um grafo a partir de um nó, para descobrir se é conexo //Entrada: Ponteiro para a estrutura de um grafo, nó inicial //Saída: Retorna TRUE se o grafo é conexo e FALSE caso contrário int MatrizAdjacenciaBuscaProfund(GrafoAdj *grafo, int valor){ int marca = 1; int i, no; int compConex = FALSE; Pilha *p = cria(); visitados = (int*) malloc(sizeof(int) * grafo->vertices); for (i = 0; i < grafo->vertices; i++) visitados[i] = 0; visitados[valor-1] = marca; empilha(p, valor-1); //while (compConex == TRUE){ while (!vazia(p)){ no = desempilha(p); visitados[no] = marca; for (i = 0; i < grafo->vertices; i++){ if (grafo->matrizAdj[no][i] != 0){ if(visitados[i] == 0) empilha(p, i); } } } compConex = TRUE; //marca++; for (i = 0; i < grafo->vertices; i++){ if (visitados[i] == 0) { compConex = FALSE; break; } } //if (compConex == TRUE) empilha(p, i); //} free(visitados); destroi(p); return compConex; }
int main() { int casos, h; int m; int i, j; int o, d; int sai, demora, chega; char buf[40]; Rota *r; int novo, espera; scanf(" %d", &casos); inicializa(); for(h = 1; h <= casos; h++){ n = 0; scanf(" %d", &m); while(m--){ scanf(" %s", buf); i = acha(buf); if(i == n){ strcpy(cidade[i].nome, buf); cidade[i].visitado = 0; cidade[i].min = INFI; cidade[i].prox = NULL; n++; } scanf(" %s", buf); j = acha(buf); if(j == n){ strcpy(cidade[j].nome, buf); cidade[j].visitado = 0; cidade[j].min = INFI; cidade[j].prox = NULL; n++; } scanf(" %d %d", &sai, &demora); chega = (sai + demora) % 24; if((6 <= sai && sai < 18) || demora > 12 ||(6 < chega && chega <= 18)) continue; r = aloca(); r->d = j; r->sai = sai % 24; r->demora = demora; r->prox = cidade[i].prox; cidade[i].prox = r; } /* for(i = 0; i< n; i++){ printf("%s | ", cidade[i].nome); for(r = cidade[i].prox; r != NULL; r = r->prox){ printf("%s ", cidade[r->d].nome); } printf("\n"); } */ scanf(" %s", buf); o = acha(buf); scanf(" %s", buf); d = acha(buf); cidade[o].min = 18; while(1){ i = minimo(); if(i == n || i == d) break; cidade[i].visitado = 1; for(r = cidade[i].prox; r != NULL; r = r->prox){ espera = r->sai - (cidade[i].min % 24); if(espera < 0) espera += 24; espera %= 24; novo = cidade[i].min + espera + r->demora; if(novo < cidade[r->d].min) cidade[r->d].min = novo; } } /* for(i = 0; i< n; i++) printf("%s - %d\n", cidade[i].nome, cidade[i].min); printf("\n"); */ printf("Test Case %d.\n", h); if(cidade[d].min == INFI) printf("There is no route Vladimir can take.\n"); else printf("Vladimir needs %d litre(s) of blood.\n", (cidade[d].min - 12)/24); for(i = 0 ; i < n; i++) destroi(cidade[i].prox); } return 0; }
int main() { Lista *L1; int cc = 0, i = 0, dado, posicao; L1 = inicializacao(); while (cc != 7) { printf("\n ****************************************************** \n"); printf("\n Menu de Opcoes \n"); printf("\n ****************************************************** \n"); printf("\n 1 - Insere no inicio da lista"); printf("\n 2 - Insere no fim da lista"); printf("\n 3 - Insere em qualquer parte da lista"); printf("\n 4 - Retira do inicio da lista"); printf("\n 5 - Retira de qualquer parte da lista"); printf("\n 6 - Exibe a lista na tela"); printf("\n 7 - Para sair"); printf("\n\n Escolha uma opcao: "); scanf("%d", &cc); switch (cc) { case 1: printf("\n Digite o numero a ser inserido na lista: "); scanf("%d", &dado); if (i == 0) { L1 = insere_lista_vazia(L1, dado); i++; }else L1 = insere_no_inicio_da_lista(L1, dado); printf("\n Inserido com sucesso\n"); system("pause"); system("cls"); break; case 2: printf("\n Digite o numero a ser inserido na lista: "); scanf("%d", &dado); if (i == 0) { L1 = insere_lista_vazia(L1, dado); i++; }else L1 = insere_no_fim_da_lista(L1, dado); printf("\n Inserido com sucesso\n"); system("pause"); system("cls"); break; case 3: printf("\n Digite o numero a ser inserido na lista: "); scanf("%d", &dado); printf("\n Digite a posicao da lista: "); scanf("%d", &posicao); L1 = insere_na_lista(L1, dado, posicao); printf("\n Inserido com sucesso\n"); system("pause"); system("cls"); break; case 4: L1 = retira_no_inicio(L1); printf("\n Retirado com sucesso\n"); system("pause"); system("cls"); break; case 5: printf("\n Digite o numero a ser retirado da lista: "); scanf("%d", &dado); printf("\n Digite a posicao da lista: "); scanf("%d", &posicao); L1 = retira_da_lista(L1, dado, posicao); printf("\n Retirado com sucesso\n"); system("pause"); system("cls"); break; case 6: printf("\n Lista : \n"); exibe(L1); printf("\n"); system("pause"); system("cls"); break; case 7: cc = 7; break; default: printf("\n Opcao invalida!\n Escolha uma das opcoes acima!"); system("pause"); system("cls"); } } destroi(L1); return 0; }
int main() { Dl_Lista *L1; int cc = 0, i = 0, dado, posicao; L1 = inicializa(); while (cc != 8) { printf("\n ****************************************************** \n"); printf("\n Menu de Opcoes \n"); printf("\n ****************************************************** \n"); printf("\n 1 - Insere no inicio da lista"); printf("\n 2 - Insere no fim da lista"); printf("\n 3 - Insere antes de uma posicao na lista"); printf("\n 4 - Insere depois de uma posicao na lista"); printf("\n 5 - Retira de qualquer parte da lista"); printf("\n 6 - Exibe a lista na tela avancando"); printf("\n 7 - Exibe a lista na tela recuando"); printf("\n 8 - Para sair"); printf("\n\n Escolha uma opcao: "); scanf("%d", &cc); switch (cc) { case 1: printf("\n Digite o numero a ser inserido na lista: "); scanf("%d", &dado); if (i == 0) { L1 = insere_lista_vazia(L1, dado); i++; }else L1 = insere_no_inicio(L1, dado); printf("\n Inserido com sucesso\n"); system("pause"); system("cls"); break; case 2: printf("\n Digite o numero a ser inserido na lista: "); scanf("%d", &dado); if (i == 0) { L1 = insere_lista_vazia(L1, dado); i++; }else L1 = insere_no_fim(L1, dado); printf("\n Inserido com sucesso\n"); system("pause"); system("cls"); break; case 3: printf("\n Digite o numero a ser inserido na lista: "); scanf("%d", &dado); printf("\n Digite a posicao da lista: "); scanf("%d", &posicao); L1 = insere_antes(L1, dado, posicao); printf("\n Inserido com sucesso\n"); system("pause"); system("cls"); break; case 4: printf("\n Digite o numero a ser inserido na lista: "); scanf("%d", &dado); printf("\n Digite a posicao da lista: "); scanf("%d", &posicao); L1 = insere_depois(L1, dado, posicao); printf("\n Inserido com sucesso\n"); system("pause"); system("cls"); break; case 5: printf("\n Digite a posicao da lista: "); scanf("%d", &posicao); L1 = remove_da_lista(L1, posicao); printf("\n Retirado com sucesso\n"); system("pause"); system("cls"); break; case 6: printf("\n Lista avancando: \n"); exibe_av(L1); printf("\n"); system("pause"); system("cls"); break; case 7: printf("\n Lista recuando: \n"); exibe_rec(L1); printf("\n"); system("pause"); system("cls"); break; case 8: cc = 8; break; default: printf("\n Opcao invalida!\n Escolha uma das opcoes acima!"); system("pause"); system("cls"); } } destroi(L1); return 0; }