//o item a ser retirado é seguinte ao apontado por p // retorna o tamanho do chunk retirado; int Retira(Lista *lista, Apontador p) { if (ListaVazia(lista) || p == NULL || p->prox == NULL) { printf("Erro ao retirar da lista! :(\n"); if (ListaVazia(lista)) printf(" lista vazia!\n\n"); else if (p == NULL) printf(" p == NULL!\n\n"); else if (p->prox == NULL) printf(" p->prox == NULL\n\n"); else printf(" ???\n\n"); exit(EXIT_FAILURE); } Apontador q = p->prox; p->prox = q->prox; if (p->prox == NULL) lista->ultimo = p; int freed_size = q->chunk_size; free(q); return freed_size; }
void FreeLista(Lista *lista) { Apontador aux = lista->primeiro; while (!ListaVazia(lista)) { Retira(lista, aux); } free(lista->primeiro); free(lista); }
void ImprimeGrafo(TipoGrafo *Grafo) { short i; for (i = 0; i <= Grafo->NumVertices - 1; i++) { printf("Vertice %d: ", i); if (!ListaVazia(Grafo->Adj[i])) ImprimeLista(Grafo->Adj[i]); putchar('\n'); } }
//FUNÇÃO PARA IRMPRIMIR O GRAFO GERADO. NÃO UTILIZADO NESTE PROGRAMA void ImprimeGrafo(TipoGrafo *Grafo){ int i; for (i = 0; i <= Grafo->NumVertices - 1; i++){ printf("\nVertice %2d: ", i); if (!ListaVazia(Grafo->Adj[i])){ ImprimeLista(Grafo->Adj[i]); } } printf("\n"); }
// Coloca o item seguinte ao apontado por p na primeira // posição da lista void SendToFirstPosition(Lista *lista, Apontador p) { if (ListaVazia(lista) || p == NULL || p->prox == NULL) { printf("Erro ao anviar para o topo da lista!\n"); if (ListaVazia(lista)) printf(" lista vazia!\n\n"); else if (p == NULL) printf(" p == NULL!\n\n"); else if (p->prox == NULL) printf(" p->prox == NULL\n\n"); else printf(" ???\n\n"); return; } if (p != lista->primeiro) { Apontador aux = p->prox; p->prox = aux->prox; aux->prox = lista->primeiro->prox; lista->primeiro->prox = aux; if (lista->ultimo == aux) lista->ultimo = p; } }
// Retira o último item da lista int RetiraUltimo(Lista *lista) { if (!ListaVazia(lista)) { Apontador aux = lista->primeiro; while (aux->prox->prox != NULL) { aux = aux->prox; } return Retira(lista, aux); } return 0; }
int InserirLista(List * Lista, char * Info){ // Validade dos Argumentos if (Lista == NULL || Info == NULL) return ArgumentoInvalido; // Auxiliares NoLista * L; L = (NoLista*) malloc(sizeof(NoLista)); L->Info = (char *) malloc(sizeof(char) * strlen(Info)); strcpy(L->Info, Info); L->Proximo = NULL; // Insere como primeira se vazia if (ListaVazia(Lista)){ Lista->Primeiro = L; return Sucesso; } // Insere no início L->Proximo = Lista->Primeiro; Lista->Primeiro = L; return Sucesso; }