Prévia do material em texto
Análise Detalhada Função por Função - grafo.c Função: criar_grafo() Função: criar_grafo() ---------------------- Esta função aloca dinamicamente memória para um novo grafo e inicializa seus campos. Código e Explicação: 1. Grafo* g = (Grafo*)malloc(sizeof(Grafo)); -> Aloca memória para um objeto do tipo Grafo. 2. if (!g) return NULL; -> Verifica se a alocação falhou; retorna NULL em caso de erro. 3. g->lista_vertices = NULL; -> Inicializa o ponteiro de lista de vértices como NULL (grafo vazio). 4. return g; -> Retorna o ponteiro para o novo grafo criado. Função: buscar_vertice() Função: buscar_vertice() ------------------------- Busca um vértice na lista de vértices com base no seu id. 1. if (!g || !id) return NULL; -> Verifica se o grafo ou o ID são inválidos. 2. Vertice* atual = g->lista_vertices; -> Inicializa um ponteiro para percorrer a lista. 3. while (atual) { if (strcmp(atual->id, id) == 0) return atual; atual = atual->prox; } -> Percorre a lista de vértices e compara os IDs. -> Retorna o vértice correspondente, se encontrado. 4. return NULL; -> Se não encontrar, retorna NULL. Função: adicionar_vertice() Função: adicionar_vertice() ---------------------------- Adiciona um novo vértice ao grafo se ainda não existir. 1. if (!g || !id || buscar_vertice(g, id)) return NULL; -> Verifica validade do grafo e do ID, e se o vértice já existe. 2. Vertice* novo = (Vertice*)malloc(sizeof(Vertice)); -> Aloca memória para o novo vértice. 3. if (!novo) return NULL; -> Verifica erro de alocação. 4. strcpy(novo->id, id); -> Copia o ID para o campo do vértice. 5. novo->lista_adj = NULL; -> Inicializa lista de adjacência. 6. novo->prox = g->lista_vertices; -> Insere o vértice no início da lista de vértices. 7. g->lista_vertices = novo; -> Atualiza o ponteiro principal do grafo. 8. return novo; -> Retorna o novo vértice criado. Função: adicionar_aresta() Função: adicionar_aresta() ---------------------------- Adiciona uma aresta entre dois vértices. 1. if (!g || !origem || !destino || !conteudo) return 0; -> Validação de parâmetros. 2. Vertice* v_origem = buscar_vertice(g, origem); -> Busca o vértice de origem. 3. if (!v_origem) v_origem = adicionar_vertice(g, origem); -> Cria o vértice se não existir. 4. Aresta* a = v_origem->lista_adj; -> Inicia a verificação de arestas já existentes. 5. while (a) { if (strcmp(a->destino, destino) == 0) return 0; a = a->prox; } -> Evita duplicação de arestas. 6. Aresta* nova = (Aresta*)malloc(sizeof(Aresta)); -> Aloca nova aresta. 7. strcpy(nova->destino, destino); -> Define destino da aresta. 8. strcpy(nova->conteudo, conteudo); -> Define o conteúdo. 9. nova->prox = v_origem->lista_adj; -> Insere a aresta no início da lista. 10. v_origem->lista_adj = nova; -> Atualiza o ponteiro do vértice. 11. return 1; -> Sucesso.