Atps - estrutura de dados - blocos

Disponível somente no TrabalhosFeitos
  • Páginas : 8 (1966 palavras )
  • Download(s) : 0
  • Publicado : 15 de outubro de 2011
Ler documento completo
Amostra do texto
Etapas 3, 4 e 5
Descrição das principais funções
Função CriaLista

A função recebe um ponteiro para TBloco chamado bloco e um int t que é o tamanho da lista. É alocada memória através do malloc. Essa função chama a função CriaListaVazia e depois a função LInsere para inserir na lista o valor cada elemento com a posição em que ele está.

//Criação da lista.
void CriaLista(TBloco* bloco,int t)
{
int i ;
bloco->tam = t ; // t corresponde ao tamanho da lista
bloco->lista = (TLista*)malloc(sizeof(TLista)*t); //Aloca memória para a lista com o tamanho t
for ( i =0; i<t; i++)
{
FLVazia(&(bloco->lista[i])); //Cria a lista vazia .
LInsere(&(bloco->lista[i]), i);
}
}
Função FLVazia

A função recebe umponteiro para TLista.[1] e aloca na memória. O ponteiro para a ultima posição passa a apontar para o da primeira posição e o da primeira passa a apontar para NULL, para indicar que não há nenhum elemento na lista.

//Inicializa uma lista vazia
void FLVazia(TLista* pLista )
{
pLista->pPrimeiro = (Apontador) malloc ( sizeof (TipoCelula)) ; // Alocação na memóriapLista->pUltimo = pLista->pPrimeiro ; //Faz o ultimo apontar o primeiro
pLista->pPrimeiro->pProx = NULL; //Faz o ponteiro para o proximo apontar para NULL
}

Função MoveAacimaB
A função recebe um ponteiro para o tipo TBloco chamado bloco e dois inteiros (a e b). Comparamos se os blocos procurados não são os mesmos e chamamos a função ProcuraBloco que retorna para pA e pB os ponteirosreferentes aos blocos que desejamos movimentar. Verificamos se os blocos não estão na mesma lista, e se estiverem não é feita modificação. Verifica se há algum bloco em cima do que vai ser movimentado, caso haja retornamos os blocos para suas posições originais e o próximo apontar para NULL. Manipulando os ponteiros colocamos o bloco A em cima do bloco B.
//Move o bloco a para cima do bloco bretornando eventuais blocos que já estiverem sobre a ou b para as suas posições originais.
void MoveAacimaB(TBloco* bloco , int a , int b)
{
Apontador pA, pB, pAntA , pAntB;
int listaA ;
int listaB ;
if(a != b) //Compara se os blocos são diferentes
{
//Procura os blocos
pA = ProcuraBloco(bloco, &pAntA, &listaA, a);
pB =ProcuraBloco(bloco ,&pAntB, &listaB, b);
if(listaA != listaB) //Compara se os blocos já não estão na mesma lista
{
if(pA != NULL && pB != NULL && pB->pProx != pA) //Compara se há algum bloco em cima da mesa
{
if(pA->pProx != NULL) //Compara se há algum bloco em cima do que vai sermovimentado
{
Original(bloco, pA->pProx); //Retorna o bloco a posição original
pA->pProx = NULL; //Faz o ultimo apontar para NULL
}
if(pB->pProx != NULL) //Compara se há algum bloco em cima do que vai ser movimentado{
Original(bloco, pB->pProx); //Retorna o bloco a posição original
pB->pProx = NULL; //Faz o ultimo apontar para NULL
}
pB->pProx = pA; //Coloca o bloco A em cima do bloco B
(pAntA)->pProx = NULL; //Faz a mesa naposição correpondente ao bloco A apontar para NULL
bloco->lista[listaA].pUltimo = NULL; //Faz o ultimo da lista vazia apontar para NULL
bloco->lista[listaB].pUltimo = pA; //Faz o ultimo da lista B receber o novo ultimo da lista
}
}
}
}
Função MoveAtopoB
A função recebe um ponteiro para o tipo...
tracking img