PedroHMM

LISTALIGADAESTATICA

Apr 4th, 2012
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. #define MAX 5
  6.  
  7. typedef struct{
  8.     int ch;
  9.     int prox;
  10.  
  11.  
  12. }REGISTRO;
  13.  
  14. typedef struct{
  15.     REGISTRO A[MAX];
  16.     int inicio;
  17.     int dispo;
  18. }LISTA;
  19.  
  20. void inicializar(LISTA *l){
  21.      l->inicio = -1;
  22.      l->dispo = 0;
  23.      int i;
  24.      for(i=0;i<MAX-1;i++){
  25.          l->A[i].prox = i+1;
  26.      }
  27.      l->A[MAX-1].prox = -1; //última posição aponta para o fim do vetor (-1)
  28. }
  29.  
  30. // Obter nó disponível - a lista é alterada  
  31. int obterNo(LISTA *l)  
  32. {
  33.     int result = l->dispo;
  34.     if(l->dispo > -1) {
  35.                 l->dispo = l->A[l->dispo].prox;
  36.     }
  37.     return(result);
  38. }
  39.  
  40. // Devolver nó p/ dispo – a lista é alterada  
  41. void devolverNo(LISTA *l, int j)  
  42. {
  43.   l->A[j].prox= l->dispo;
  44.   l->dispo = j;
  45. }
  46.  
  47.  
  48. int busca(LISTA l, int ch, int *ant)
  49. {
  50.     int i = l.inicio;
  51.     while(i != -1){
  52.         if(l.A[i].ch == ch) return i;
  53.  
  54.         *ant = i;
  55.         i = l.A[i].prox;
  56.     }
  57.     return -1;
  58. }
  59.  
  60. bool anexar(LISTA *l, int ch)  
  61. {
  62.      int ant, i;    
  63.      i = busca(*l, ch, &ant);
  64.      if((l->dispo < 0) || (i != -1)) return(false);
  65.      
  66.      i = obterNo(l);
  67.      l->A[i].ch = ch;
  68.      
  69.      if(l->inicio<0)  
  70.      {
  71.         // inserção do primeiro elemento de lista vazia
  72.             l->inicio = i;  
  73.             l->A[i].prox = -1;
  74.      }
  75.      else  
  76.      {
  77.             if(ant < 0)  
  78.             {  
  79.               // inserção no início de lista já existente
  80.                  l->A[i].prox = l->inicio;    
  81.                  l->inicio = i;
  82.             }
  83.             else  
  84.             {
  85.                   // inserção entre dois elementos
  86.                   l->A[i].prox = l->A[ant].prox;  
  87.                   l->A[ant].prox = i;
  88.             }
  89.     }
  90.       return(true);
  91. }
  92.  
  93. int size(LISTA *l){
  94.     int i = l->inicio;
  95.     int cont;
  96.     while(i != -1){
  97.         cont++;    
  98.         i = l->A[i].prox;
  99.     }
  100.     return cont;
  101. }
  102.  
  103. bool inserir(LISTA *l, int pos, int ch)
  104. {
  105.      int ant;
  106.      int i;
  107.      i = busca(*l, ch, &ant);
  108.      if(pos<0 || pos>=MAX || pos > size(l) ||i != -1) return false;
  109.      i = obterNo(l);
  110.      l->A[i].ch = ch;
  111.      if(pos == 0)
  112.      {
  113.            l->A[pos].prox =  l->inicio;
  114.            l->inicio = pos;
  115.            return true;
  116.      }
  117.      int cont = l->inicio;
  118.      while(cont != -1)
  119.      {
  120.                 if(cont  == pos-1)
  121.                 {
  122.                      if(l->A[l->A[pos].prox].prox != -1)
  123.                      {
  124.                         l->A[pos].prox = l->A[cont].prox;              
  125.                         l->A[cont].prox = pos;
  126.                         return true;
  127.                      }
  128.                      else
  129.                      {
  130.                                 l->A[pos].prox = -1;              
  131.                                 l->A[cont].prox = pos;          
  132.                                 return true;
  133.                      }
  134.                 }
  135.                 else
  136.                 {
  137.                        ant =  cont;
  138.                        cont = l->A[cont].prox;
  139.                 }
  140.              
  141.      }    
  142. }
  143.  
  144. bool excluir(LISTA *l, int ch){
  145.     int ant;
  146.     int posicao = busca(*l,ch,&ant);
  147.     if(posicao == -1) return false;
  148.     if(ant == -1) l->inicio = l->A[posicao].prox;
  149.     else l->A[ant].prox = l->A[posicao].prox;
  150.     devolverNo(l,posicao);
  151.     return true;
  152. }
  153.  
  154.  
  155. void exibir(LISTA l){
  156.     int i = l.inicio;
  157.     while(i != -1){
  158.         printf("%i\n", l.A[i].ch);
  159.  
  160.         i = l.A[i].prox;
  161.     }
  162. }
  163.  
  164.  
  165.  
  166. void exibirVazia(LISTA l){
  167.     int i = l.dispo;
  168.     while(i != -1){
  169.         printf("%i\n", i);
  170.  
  171.         i = l.A[i].prox;
  172.     }
  173. }
  174.  
  175. main(){
  176.     LISTA l;
  177.     inicializar(&l);
  178.     anexar(&l, 10);  
  179.     anexar(&l, 11);
  180.     anexar(&l, 12);
  181.     excluir(&l, 11);
  182.     inserir(&l, 1, 5);
  183.     exibir(l);
  184.     inserir(&l, 4, 6); /// olha aqui o problema a lista acaba no indice 2 e eu to querendo inserir no indice 4
  185.     exibir(l);
  186.     getch();
  187. }
Advertisement
Add Comment
Please, Sign In to add comment