Skip to content

Instantly share code, notes, and snippets.

@Pharaoh00
Created November 14, 2019 00:03
Show Gist options
  • Save Pharaoh00/4d4b17bc70ec60d24c316f307bca2c15 to your computer and use it in GitHub Desktop.
Save Pharaoh00/4d4b17bc70ec60d24c316f307bca2c15 to your computer and use it in GitHub Desktop.
void inserirPassageiro(pListaPassageiro lista, pPassageiro item) {
//printf("TEST - func call\n");
pCelulaPassageiro q = lista->primeiro->proximo;
//printf("TEST - alloc q\n");
pCelulaPassageiro anterior = lista->primeiro;
//printf("TEST - alloc anterior\n");
pCelulaPassageiro novaCelula = criaCelulaPassageiro(item);
//printf("TEST - alloc nova celula\n");
if (!listaVaziaPassageiro(*lista)) {
//printf("TEST - lista cheia\n");
while (q != NULL) {
// OPÇÃO CASO FOR O ULTIMO
// HÁ À NECESSIDADE DESSA OPÇÃO SER A PRIMEIRA.
// TERÁ QUE VERIFICAR SE O q->proximo É NULL ou lista->ultimo == q
// SABE-SE QUE O q EM QUESTÃO É O ULTIMO ITEM DA LISTA E SE FOR NECESSARIO A INSERCÃO DEPOIS DO q,
// A LISTA TEM QUE SER ATUALIZA.
if (q->proximo == NULL && strcmp(novaCelula->item->nome, q->item->nome) == 1) {
printf("ultimo\n");
// TODO:
// QUER DIZER QUE O item SERA INSERIDO NO ULTIMO aka lista->ultimo
// lista->ultimo TEM QUE SER ATUALIZADO COM O item
novaCelula->proximo = q->proximo; // == NULL
q->proximo = novaCelula;
lista->ultimo = novaCelula; // ultimo atualizado.
break; // pare de procurar.
}
// OPÇÃO PARA INSERIR ANTES DO q E DEPOIS DO anterior.
//
// NÃO TEM QUE CHECAR SE REALMENTE É DEPOIS DO ANTERIOR.
else if (strcmp(novaCelula->item->nome, q->item->nome) == -1) {
//else if(strcmp(novaCelula->item->nome, anterior->item->nome) == 1) {
printf("strcmp == -1\n");
anterior->proximo = novaCelula;
novaCelula->proximo = q;
break; // pare de procurar.
}
// OPÇÃO PARA INSERIR DEPOIS DO q (SENDO q->proximo != NULL)
// TEM QUE GARANTIR QUE O item FIQUE ANTES DO q->proximo.
// NO CASO É: Se somente se, q->item der 1 (inserir depois do q) e q->proximo der -1 (inserir antes)
else if (strcmp(novaCelula->item->nome, q->item->nome) == 1 &&
strcmp(novaCelula->item->nome, q->proximo->item->nome) == -1) {
printf("strcmp == 1\n");
// SEGUIR A SEQUENCIA. Primeiro falar q nova celula aponta para q->proximo
novaCelula->proximo = q->proximo;
q->proximo = novaCelula;
break; // pare de procurar.
} else {
q = q->proximo; // continue procurando.
}
}
} else {
// CASO A LISTA ESTIVER VAZIA, O ITEM SERÁ INSERIDO POR ULTIMO DE QUALQUER FORMA.
// SOMENTE PARA INSERIR UM ITEM COM A LISTA VAZIA,
// POIS EM NENHUMA DAS OPÇÕES A CIMA GARANTE ISSO.
lista->ultimo->proximo = novaCelula;
lista->ultimo = novaCelula;
return;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment