Biblioteca de tipos abstratos

Publicado por José Lopes 07/03/2006

[ Hits: 5.930 ]

Homepage: https://lopes.id

Download libabstype.h




Esta biblioteca implementa os tipos abstratos de dados Lista, Fila e Pilha, através da utilização de ponteiros. Ela é totalmente baseada no livro de Nívio Ziviani, "Projeto de Algortimos".

  



Esconder código-fonte

/**********************************************************************************
   NOME: libabstype.h
   
   DESCRIÇÂO
   Biblioteca que implementa os tipos abstratos de dados Lista, Pilha e Fila, a-
      través da utilização de ponteiros.
   
   REQUISITOS
   Para se utilizar esta biblioteca, deve-se alterar o tipo definido Item, para a
      aplicação específica.
   
   OBSERVAÇÃO
   TODOS os tipos aqui implementados fazem uso de uma célula cabeça que, no caso
      da Lista, é a apontada por first, no caso da Pilha é a apontada por top e,
      no caso da Fila, é a apontada por front. É importante que, caso sejam imple-
      mentadas novas funções para manipular estas estruturas, estas células cabeça
      sejam preservadas ou ignoradas, em caso de listagem da estrutura.
   
   AUTOR
   José Lopes de Oliveira Júnior, baseado no livro "Projeto de algoritmos" de
      Nívio Ziviani.
   
   CONTATO
   jlojunior@gmail.com
***********************************************************************************/

/* Licença
Este programa é um software de livre distribuição, que pode ser copiado e
distribuído sob os termos da Licença Geral GNU, conforme publicada pela
Free Software Foundation, versão 2 da licença, ou (a critério do autor)
qualquer versão posterior.
Este programa é distribuído na expectativa de ser útil aos seus usuários,
porém NÃO POSSUI NENHUMA GARANTIA, EXPLÍCITA OU IMPLÍCITA, COMERCIAL OU
DE ATENDIMENTO A UMA DETERMINADA FINALIDADE.
Consulte a Licença Pública Geral GNU. */

/* Biblioteca necessaria para se utilizar o NULL */
#include <stdlib.h>

/* Definindo as estruturas mais basicas, comuns aos tres tipos */

/* Definicoes do tipo Item, que podem ser alteradas segundo a
      necessidade da aplicacao.                               */
/* Definindo a estrutura dos itens a serem armazenados */
typedef struct {
   int indice;      /* Identificador */
   char nome[ 50 ], /* Armazena nomes */
      tel[ 12 ];    /* Armazena o telefone */
} Item;
/* Fim das definicoes do tipo Item */

/* Definindo o tipo Pointer, que serah o apontador utilizado */
typedef struct TCell *Pointer;

/* Definindo a estrutura das celulas - dois campos :
      um para armazenar um item e outro um ponteiro-
      estrutura simplesmente encadeada.              */
typedef struct TCell {
   Item item;
   Pointer next;
} Cell;
/* Fim das definicoes basicas */

/* Definindo as estruturas Lista, Pilha e Fila */

/* Estrutura de Listas */
typedef struct {
   Pointer first, last;
} List;

/* Estrutura de Pilhas */
typedef struct {
   Pointer top, bottom;
} Stack;

/* Estrutura de Filas */
typedef struct {
   Pointer front, back;
} Queue;
/* Fim das definicoes dos tipos abstratos */

/* Inicia-se agora a definicao das operacoes mais basicas que podem ser realizadas
      com cada um dos tipos abstratos de dados.                                   */

/* Inicio das operacoes basicas sobre Listas */
/**********************************************************************************
   NOME: newList()
   
   DESCRIÇÃO
   Cria uma lista vazia, ou torna uma lista existente, vazia.
   
   PARÂMETROS
   List *list : Um ponteiro para uma lista.
   
   RETORNO
   Retorna 0, indicando sucesso. Retorna na região de memória apontada por *list,
      a lista criada.
**********************************************************************************/
int newList ( List *list )
{
   /* Alocando espaco em memoria e atribuindo-o ao
         primeiro elemento da Lista.               */
   list -> first = ( Pointer ) malloc( sizeof( Cell ) );
   
   /* Fazendo que o ultimo elemento aponte para o
         mesmo local que o primeiro - Lista Vazia */
   list -> last = list -> first;
   
   /* Fazendo com que o proximo elemento apos o
         primeiro, seja o NULO.                 */
   list -> first -> next = NULL;
   
   return 0; /* Retorno com sucesso */
} /* newList */

/**********************************************************************************
   NOME: listEmpty()
   
   DESCRIÇÃO
   Verifica se uma lista está vazia.
   
   PARÂMETROS
   List *list : Um ponteiro para uma lista.
   
   RETORNO
   Retorna 0, no caso de a lista estar vazia, ou um valor diferente em caso con-
      trário.
**********************************************************************************/
int listEmpty ( List *list )
{
   return ( list -> first == list -> last );
} /* listEmpty */

/**********************************************************************************
   NOME: insert()
   
   DESCRIÇÃO
   Insere um item no final de uma lista.
   
   PARÂMETROS
   List *list : Um ponteiro para uma lista.
   Item *item : O item a ser inserido.
   
   RETORNO
   Retorna 0, no caso de a inserção ter sido feita com sucesso, ou um valor dife-
      rente em caso contrário.
**********************************************************************************/
int insert ( List *list, Item *item )
{
   /* Alocando espaco em memoria e atribuindo-o ao
         proximo elemento apos o ultimo da Lista.  */
   list -> last -> next = ( Pointer ) malloc( sizeof( Cell ) );
   
   /* O ultimo item passa a ser aquele que foi criado */
   list -> last = list -> last -> next;
   
   /* O campo item da ultima celula recebe o
         item passado como parametro.        */
   list -> last -> item = *item;
   
   /* O proximo elemento apos o ultimo eh NULO */
   list -> last -> next = NULL;
   
   /* Operacao realizada com exito */
   return 0;
} /* insert */

/**********************************************************************************
   NOME: delete()
   
   DESCRIÇÃO
   Remove um elemento da Lista - o item a ser removido é o seguinte ao apontado
      pelo ponteiro p.
   
   PARÂMETROS
   List *list : Um ponteiro para uma lista.
   Item *item : Retorna o campo item da célula excluida.
   Pointer p : Um ponteiro para o item a ser excluido.
   
   RETORNO
   Retorna 0, caso a exlusao tenha sido feita com sucesso;
           1, caso a lista esteja vazia ou a posição não exista.
**********************************************************************************/
int delete ( List *list, Item *item, Pointer p )
{
   /* Verificando se a Lista estah vazia e se a posicao existe */
   if ( ( listEmpty( list ) ) || ( p == NULL ) ||
      ( p -> next == NULL ) )
      return 1; /* Lista vazia ou posicao inexistente */
   
   else {
      /* A Lista nao estah vazia e a posicao existe */
      
      /* Um ponteiro auxiliar que aponta para o
            proximo elemento a p.               */
      Pointer aux = p -> next;
      
      /* Pegando o item do elemento a ser excluido */
      *item = aux -> item;
      
      /* Ajustando o ponteiro da celula que p aponta */
      p -> next = aux -> next;
      
      /* Verificando se o elemento a ser excluido
            eh o ultimo da lista.                 */
      if ( p -> next == NULL )
         list -> last = p;
      
      /* Liberando espaco em memoria 
            - excluindo o item       */
      free( aux );
   } /* else */
   
   /* Operacao realizada com exito */
   return 0;
} /* delete */

/**********************************************************************************
   NOME: first()
   
   DESCRIÇÃO
   Obtém o primeiro elemento de uma lista.
   
   PARÂMETROS
   List *list : Um ponteiro para uma lista.
   Item *item : O item a ser retornado.
   
   RETORNO
   Retorna um ponteiro para o primeiro elemento da lista, ou NULL, se a lista es-
      tiver vazia. Retorna em *item, o conteúdo do primeiro elemento da lista.
**********************************************************************************/
Pointer first ( List *list, Item *item )
{
   /* Verificando se a lista estah vazia */
   if ( listEmpty( list ) )
      /* Lista vazia - retorna um ponteiro nulo */
      return NULL;
   
   /* A lista NAO estah vazia */
   else {
      *item = list -> first -> next -> item; /* Pegando o conteudo do item */
      return ( list -> first -> next ); /* Retornando o ponteiro */
   } /* else */
} /* first */

/**********************************************************************************
   NOME: last()
   
   DESCRIÇÃO
   Obtém o último elemento de uma lista.
   
   PARÂMETROS
   List *list : Um ponteiro para uma lista.
   Item *item : O item a ser retornado.
   
   RETORNO
   Retorna um ponteiro para o último elemento da lista, ou NULL, se a lista es-
      tiver vazia. Retorna em *item, o conteúdo do último elemento da lista.
**********************************************************************************/
Pointer last ( List *list, Item *item )
{
   /* Verificando se a lista estah vazia */
   if ( listEmpty( list ) )
      /* Lista vazia - retorna um ponteiro nulo */
      return NULL;
   
   /* A lista NAO estah vazia */
   else {
      *item = list -> last -> item; /* Pegando o conteudo do item */
      return ( list -> last ); /* Retornando o ponteiro */
   } /* else */
} /* last */

/**********************************************************************************
   NOME: printList()
   
   DESCRIÇÃO
   Imprime o conteúdo de uma lista na tela - a impressão depende dos campos da
      lista.
   
   PARÂMETROS
   List *list : Um ponteiro para uma lista.
   
   RETORNO
   Retorna 0, caso a operação tenha sido realizada com sucesso;
           1, no caso de a lista estar vazia.
**********************************************************************************/
int printList ( List *list )
{
   /* Verificando se a Lista estah vazia */
   if ( listEmpty( list ) )
      return 1; /* Lista vazia */
   
   else {
      /* A Lista nao estah vazia */
      
      /* Um ponteiro auxiliar para varrer a Lista */
      Pointer aux = list -> first -> next;
      
      /* Imprime enquanto nao chegar ao fim da Lista */
      while ( aux != NULL ) {
         /* Imprimindo... */
         printf( "%2d%10s\n", aux -> item.indice, aux -> item.nome );
         
         /* Atualizando a variavel aux */
         aux = aux -> next;
      } /* while */
   } /* else */
   
   /* Operacao realizada com exito */
   return 0;
} /* printList */
/* Fim das operacoes basicas sobre Listas    */

/* Inicio das operacoes basicas sobre Pilhas */
/**********************************************************************************
   NOME: newStack()
   
   DESCRIÇÃO
   Cria uma pilha vazia, ou torna uma pilha existente, vazia.
   
   PARÂMETROS
   Stack *stack : Um ponteiro para uma pilha.
   
   RETORNO
   Retorna 0, indicando sucesso. Retorna na região de memória apontada por *stack,
      a pilha criada.
**********************************************************************************/
int newStack ( Stack *stack )
{
   /* Alocando espaco em memoria e atribuindo-o ao
         elemento do topo da Pilha.                */
   stack -> top = ( Pointer ) malloc( sizeof( Cell ) );
   
   /* Fazendo que o elemento do fundo aponte para o
         mesmo local que o do topo - Pilha Vazia    */
   stack -> bottom = stack -> top;
   
   /* Fazendo com que o proximo elemento apos o
         do topo, seja o NULO.                  */
   stack -> top -> next = NULL;
   
   return 0; /* Retorno com sucesso */
} /* newStack */

/**********************************************************************************
   NOME: emptyStack()
   
   DESCRIÇÃO
   Verifica se uma Pilha está vazia.
   
   PARÂMETROS
   Stack *stack : Um ponteiro para uma pilha.
   
   RETORNO
   Retorna 0, no caso de a pilha estar vazia, ou um valor diferente em caso con-
      trário.
**********************************************************************************/
char stackEmpty ( Stack *stack )
{
   return ( stack -> top == stack -> bottom );
} /* stackEmpty */

/**********************************************************************************
   NOME: push()
   
   DESCRIÇÃO
   Insere um item no topo de uma pilha.
   
   PARÂMETROS
   Stack *stack : Um ponteiro para uma pilha.
   Item *item : O item a ser inserido.
   
   RETORNO
   Retorna 0, no caso de a inserção ter sido feita com sucesso, ou um valor dife-
      rente em caso contrário.
**********************************************************************************/
int push ( Stack *stack, Item *item )
{
   /* Definindo um ponteiro auxiliar e atribuindo
         a ele o endereco de memoria alocado.     */
   Pointer aux = ( Pointer ) malloc( sizeof( Cell ) );
   
   /* Adicionando o elemento no topo da pilha */
   stack -> top -> item = *item;
   
   /* Fazendo com que o proximo elemento de aux
         aponte para o mesmo lugar que o topo.  */
   aux -> next = stack -> top;
   
   /* Fazendo com que aux seja o novo
         topo da pilha.               */
   stack -> top = aux;
   
   /* Operacao realizada com exito */
   return 0;
} /* push */

/**********************************************************************************
   NOME: pop()
   
   DESCRIÇÃO
   Remove um item do topo da pilha.
   
   PARÂMETROS
   Stack *stack : Um ponteiro para uma pilha.
   Item *item : Retorna o campo item da célula excluida.
   
   RETORNO
   Retorna 0, caso a exlusao tenha sido feita com sucesso;
           1, caso a lista esteja vazia ou a posicao nao exista.
**********************************************************************************/
int pop ( Stack *stack, Item *item )
{
   /* Verificando se a pilha estah vazia */
   if ( stackEmpty( stack ) )
      return 1; /* Pilha vazia */
   
   else {
      /* A pilha nao estah vazia */
      
      /* Definindo um ponteiro auxiliar e fazendo com que ele aponte
             para o topo da pilha.                                   */
      Pointer aux = stack -> top;
      
      /* Fazendo com que o topo da pilha seja
            o proximo item a aux.             */
      stack -> top = aux -> next;
      
      /* Atribuindo a item, o item que serah
            excluido.                        */
      *item = aux -> next -> item;
      
      /* Liberando espaco em memoria - excluindo */
      free( aux );
   } /* else */
   
   /* Operacao realizada com exito */
   return 0;
} /* pop */

/**********************************************************************************
   NOME: top()
   
   DESCRIÇÃO
   Obtém o elemento do topo de uma pilha.
   
   PARÂMETROS
   Stack *stack : Um ponteiro para uma pilha.
   Item *item : O item a ser retornado.
   
   RETORNO
   Retorna um ponteiro para o elemento do topo da pilha, ou NULL, se a pilha es-
      tiver vazia. Retorna em *item, o conteúdo elemento do topo da pilha.
**********************************************************************************/
Pointer top ( Stack *stack, Item *item )
{
   /* Verificando se a pilha estah vazia */
   if ( stackEmpty( stack ) )
      /* Pilha vazia - retorna um ponteiro nulo */
      return NULL;
   
   /* A pilha NAO estah vazia */
   else {
      *item = stack -> top -> next -> item; /* Pegando o conteudo do item */
      return ( stack -> top -> next ); /* Retornando o ponteiro */
   } /* else */
} /* top */

/**********************************************************************************
   NOME: bottom()
   
   DESCRIÇÃO
   Obtém o elemento do fundo de uma pilha.
   
   PARÂMETROS
   Stack *stack : Um ponteiro para uma pilha.
   Item *item : O item a ser retornado.
   
   RETORNO
   Retorna um ponteiro para o elemento do fundo da pilha, ou NULL, se a pilha es-
      tiver vazia. Retorna em *item, o conteúdo elemento do fundo da pilha.
**********************************************************************************/
Pointer bottom ( Stack *stack, Item *item )
{
   /* Verificando se a pilha estah vazia */
   if ( stackEmpty( stack ) )
      /* Pilha vazia - retorna um ponteiro nulo */
      return NULL;
   
   /* A pilha NAO estah vazia */
   else {
      *item = stack -> bottom -> item; /* Pegando o conteudo do item */
      return ( stack -> bottom ); /* Retornando o ponteiro */
   } /* else */
} /* bottom */

/**********************************************************************************
   NOME: printStack()
   
   DESCRIÇÃO
   Imprime o conteúdo de uma pilha na tela - a impressão depende dos campos da pi-
      lha.
   
   PARÂMETROS
   Stack *stack : Um ponteiro para uma pilha.
   
   RETORNO
   Retorna 0, caso a operação tenha sido realizada com sucesso;
           1, no caso de a lista estar vazia.
**********************************************************************************/
int printStack ( Stack *stack )
{
   /* Verificando se a Pilha estah vazia */
   if ( stackEmpty( stack ) )
      return 1; /* Pilha vazia */
   
   else {
      /* A Pilha nao estah vazia */
      
      /* Um ponteiro auxiliar para varrer a Pilha */
      Pointer aux = stack -> top -> next;
      
      /* Imprime enquanto nao chegar ao fim da Pilha */
      while ( aux != NULL ) {
         /* Imprimindo... */
         printf( "%2d%10s\n", aux -> item.indice, aux -> item.nome );
         
         /* Atualizando a variavel aux */
         aux = aux -> next;
      } /* while */
   } /* else */
   
   /* Operacao realizada com exito */
   return 0;
} /* printStack */
/* Fim das operacoes basicas sobre Pilhas    */

/* Inicio das operacoes basicas sobre Filas  */
/**********************************************************************************
   NOME: newQueue()
   
   DESCRIÇÃO
   Cria uma fila vazia, ou torna uma fila existente, vazia.
   
   PARÂMETROS
   Queue *queue : Um ponteiro para uma fila.
   
   RETORNO
   Retorna 0, indicando sucesso. Retorna na região de memória apontada por *queue,
      a fila criada.
**********************************************************************************/
int newQueue ( Queue *queue )
{
   /* Alocando espaco em memoria e atribuindo-o ao
         elemento do inicio da Fila.               */
   queue -> front = ( Pointer ) malloc( sizeof( Cell ) );
   
   /* Fazendo que o elemento do fim aponte para o
         mesmo local que o do inicio - Fila Vazia */
   queue -> back = queue -> front;
   
   /* Fazendo com que o proximo elemento apos o
         do inicio, seja o NULO.                */
   queue -> front -> next = NULL;
   
   return 0; /* Retorno com sucesso */
} /* newQueue */

/**********************************************************************************
   NOME: queueEmpty()
   
   DESCRIÇÃO
   Verifica se uma fila está vazia.
   
   PARÂMETROS
   Queue *queue : Um ponteiro para uma fila.
   
   RETORNO
   Retorna 0, no caso de a fila estar vazia, ou um valor diferente em caso con-
      trário.
**********************************************************************************/
int queueEmpty ( Queue *queue )
{
   return ( queue -> front == queue -> back );
} /* queueEmpty */

/**********************************************************************************
   NOME: enqueue()
   
   DESCRIÇÃO
   Insere um item no fim de uma fila.
   
   PARÂMETROS
   Queue *queue : Um ponteiro para uma fila.
   Item *item : O item a ser inserido.
   
   RETORNO
   Retorna 0, no caso de a inserção ter sido feita com sucesso, ou um valor dife-
      rente em caso contrário.
**********************************************************************************/
int enqueue ( Queue *queue, Item *item )
{
   /* Atribuindo ao proximo elemento, apos o ultimo,
         o endereco de memoria alocado.              */
   queue -> back -> next = ( Pointer ) malloc( sizeof( Cell ) );
   
   /* Fazendo com que o novo fim da Fila seja o
         elemento recem criado.                 */
   queue -> back = queue -> back -> next;
   
   /* Atribuindo ao novo elemento,
         o item a ser inserido.    */
   queue -> back -> item = *item;
   
   /* Fazendo com que o proximo elemento apos o
         do fim, seja o NULO.                   */
   queue -> back -> next = NULL;
   
   /* Operacao realizada com exito */
   return 0;
} /* enqueue */

/**********************************************************************************
   NOME: dequeue()
   
   DESCRIÇÃO
   Remove um item do início da fila.
   
   PARÂMETROS
   Queue *queue : Um ponteiro para uma fila.
   Item *item : Retorna o campo item da célula excluida.
   
   RETORNO
   Retorna 0, caso a exlusao tenha sido feita com sucesso;
           1, caso a lista esteja vazia ou a posicao nao exista.
**********************************************************************************/
int dequeue ( Queue *queue, Item *item )
{
   /* Verificando se a Fila estah vazia */
   if ( queueEmpty( queue ) )
      return 1; /* Fila vazia */
   
   else {
      /* A Fila nao estah vazia */
      
      /* Definindo um ponteiro auxiliar e apontando-o
            para o inicio da Fila.                    */
      Pointer aux = queue -> front;
      
      /* Fazendo com que o elemento do inicio da Fila
            seja o segundo elemento da Fila.          */
      queue -> front = queue -> front -> next;
      
      /* Atribuindo a item, o item que serah
            excluido.                        */
      *item = queue -> front -> item;
      
      /* Liberando espaco em memoria - excluindo */
      free( aux );
   } /* else */
   
   /* Operacao realizada com exito */
   return 0;
} /* dequeue */

/**********************************************************************************
   NOME: printQueue()
   
   DESCRIÇÃO
   Imprime o conteúdo de uma fila na tela - a impressão depende dos campos da fi-
      la.
   
   PARÂMETROS
   Queue *queue : Um ponteiro para uma fila.
   
   RETORNO
   Retorna 0, caso a operação tenha sido realizada com sucesso;
           1, no caso de a lista estar vazia.
**********************************************************************************/
int printQueue ( Queue *queue )
{
   /* Verificando se a Fila estah vazia */
   if ( queueEmpty( queue ) )
      return 1; /* Fila vazia */
   
   else {
      /* A Fila nao estah vazia */
      
      /* Um ponteiro auxiliar para varrer a Fila */
      Pointer aux = queue -> front -> next;
      
      /* Imprime enquanto nao chegar ao fim da Fila */
      while ( aux != NULL ) {
         /* Imprimindo... */
         printf( "< %25d ; %32s ; %4s >\n",
            aux -> item.indice, aux -> item.nome, aux -> item.tel );
         
         /* Atualizando a variavel aux */
         aux = aux -> next;
      } /* while */
   } /* else */
   
   /* Operacao realizada com exito */
   return 0;
} /* printQueue */

/**********************************************************************************
   NOME: selectionSort()
   
   DESCRIÇÃO
   Ordena uma fila pelo campo item.value, utilizando o método de ordenação por se-
      leção.
   
   PARÂMETROS
   Queue *queue : Um ponteiro para uma fila.
   
   RETORNO
   Retorna 0, caso a operação tenha sido realizada com sucesso;
           1, no caso de a lista estar vazia.
**********************************************************************************/
int selectionSort ( Queue *queue )
{
   /* Verificando se a fila estah vazia */
   if ( queueEmpty( queue ) )
      return 1; /* Fila vazia */
   
   /* A fila NAO estah vazia */
   else {
      /* Ponteiros para varrer a fila */
      Pointer i = queue -> front -> next,
              j, min;
      
      Item x; /* Armazena um item */
      
      /* Roda com i, do inicio, ateh o final da fila */
      while ( i != NULL ) {
         min = i;
         
         /* Roda com j, a partir da posicao apos i, ateh o final da fila */
         j = i -> next;
         while ( j != NULL ) {
            /* Testando se o valor que j aponta eh menor que o menor valor. Caso
                  seja, trocam-se os valores deles.                              */
            if ( j -> item.indice < min -> item.indice )
               min = j;
            
            j = j -> next; /* Atualizando j */
         } /* while */
         
         /* Aqui, efetivamente, sao trocados os valores dos itens */
         x = min -> item;
         min -> item = i -> item;
         i -> item = x;
         
         i = i -> next; /* Atualizando i */
      } /* while */
   } /* else */
   
   /* Retornando sucesso */
   return 0;
} /* selectionSort */
/* Fim das operacoes basicas sobre Filas     */
/* Fim da definicao das operacoes basicas sobre os tipos abstratos de dados.      */

Scripts recomendados

[C] Listas Duplamente Encadeadas

1o. joguinho Labirinto (com graficos).c

Simulador de Escalonamento de Processos

Converter arquivos Bitmap para ASCII-art

Entendendo a função fork()


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts