Advertisement
Guest User

Lista #3

a guest
Nov 17th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. typedef int Dado;
  6.  
  7. class noh {
  8.     friend class lista;
  9.     private:
  10.         const Dado dado;
  11.         noh* proximo;
  12.     public:
  13.         noh(Dado d = 0);
  14. };
  15.  
  16. noh::noh(Dado d) : dado(d) {
  17.     proximo = NULL;
  18. }
  19.  
  20. class lista {
  21.     private:
  22.         noh* primeiro;
  23.         noh* ultimo;
  24.         int tamanho;
  25.     public:
  26.         lista();
  27.         ~lista();
  28.         void insere(Dado dado);
  29.         void insere(Dado dado, int pos);
  30.         void remove(int posicao);
  31.         int procura(Dado valor);
  32.         void imprime();
  33.         inline bool vazia();
  34. };
  35.  
  36. // constrói uma lista inicialmente vazia
  37. lista::lista() {
  38.     tamanho = 0;
  39.     primeiro = NULL;
  40.     ultimo = NULL;
  41. }
  42.  
  43. lista::~lista() {
  44.     noh* iter = primeiro;
  45.     noh* proximo = NULL;
  46.     while (iter != NULL) {
  47.         proximo = iter->proximo;
  48.         delete iter;
  49.         iter = proximo;
  50.     }
  51. }
  52.  
  53. // método básico que *percorre* a lista, imprimindo seus elementos
  54. void lista::imprime() {
  55.     noh* aux = primeiro;
  56.     while (aux != NULL) {
  57.         cout << aux->dado << " ";
  58.         aux = aux->proximo;
  59.     }
  60.     cout << endl;
  61. }
  62.  
  63. // insere por padrão no final da lista
  64. void lista::insere(Dado dado) {
  65.     noh *no = new noh(dado);
  66.     if (tamanho == 0) {
  67.         primeiro = no;
  68.         ultimo = no;
  69.     }
  70.     else {
  71.         ultimo->proximo = no;
  72.         ultimo = no;
  73.     }
  74.     tamanho++;
  75. }
  76.  
  77. // insere um dado em uma determinada posição da lista
  78. void lista::insere(Dado dado, int posicao) {
  79.     noh *no = new noh(dado);
  80.     if (posicao == 0) {
  81.         no->proximo = primeiro;
  82.         primeiro = no;
  83.         tamanho++;
  84.     }
  85.     else if (posicao == tamanho) {
  86.         ultimo->proximo = no;
  87.         ultimo = no;
  88.         tamanho++;
  89.     }
  90.     else if (posicao < tamanho)  {
  91.         noh *aux = primeiro;
  92.         int posAux = 0;
  93.         while (posAux < (posicao-1)) {
  94.             aux = aux->proximo;
  95.             posAux++;
  96.         }
  97.         no->proximo = aux->proximo;
  98.         aux->proximo = no;
  99.         tamanho++;
  100.     }
  101. }
  102.  
  103. // remove o item da posição passada por parâmetro
  104. // Atenção - o código deve tratar de posição inválidas
  105. void lista::remove(int posicao) {
  106.     if (tamanho > 0) {
  107.         if (posicao == 0) {
  108.             primeiro = primeiro->proximo;
  109.             tamanho--;
  110.         }
  111.         else if (posicao < tamanho and posicao > 0) {
  112.             noh *aux = primeiro;
  113.             for (int i = 0; i < posicao-1; i++) {
  114.                 aux = aux->proximo;
  115.             }
  116.             aux->proximo = aux->proximo->proximo;
  117.             tamanho--;
  118.         }
  119.     }
  120. }
  121.  
  122. // procura por um elemento e retorna a posição ou -1 se não encontrado
  123. int lista::procura(Dado valor) {
  124.     noh *aux = primeiro;
  125.     int pos = 0;
  126.     while (aux != NULL) {
  127.         if (aux->dado == valor)
  128.             return pos;
  129.         else {
  130.             aux = aux->proximo;
  131.             pos++;
  132.         }
  133.     }
  134.     return -1;
  135. }
  136.  
  137. // verifica se a lista está vazia
  138. inline bool lista::vazia() {
  139.     if (tamanho == 0)
  140.         return true;
  141.     return false;
  142. }
  143.  
  144. int main() { // NÃO MODIFIQUE!
  145.     lista minhaLista;
  146.     char opcao;
  147.     int valor, pos;
  148.     cin >> opcao;
  149.     while (opcao != 'Q') {
  150.         switch(opcao) {
  151.             case 'I':
  152.                 cin >> valor;
  153.                 minhaLista.insere(valor);
  154.                 break;
  155.             case 'W':
  156.                 cin >> valor;
  157.                 cin >> pos;
  158.                 minhaLista.insere(valor, pos);
  159.                 break;
  160.             case 'P':
  161.                 cin >> valor;
  162.                 cout << minhaLista.procura(valor) << endl;
  163.                 break;
  164.             case 'R':
  165.                 cin >> pos;
  166.                 minhaLista.remove(pos);
  167.                 break;
  168.             case 'V':
  169.                 cout << minhaLista.vazia() << endl;
  170.                 break;
  171.         }
  172.         cin >> opcao;
  173.     }
  174.     minhaLista.imprime();
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement