Lista Dinâmica Duplamente Encadeada

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Lista Dinâmica Duplamente Encadeada

Mensagem  Renancr em Sex 15 Abr 2011 - 21:07

Lista Dinâmica Duplamente Encadeada

Código:

#include <iostream>
using namespace std;

struct tno
      {
        int info;
        tno *proximo;
        tno *anterior;
      };

typedef struct tno lista;


lista *inicializa();
int menu();
lista *insere(lista *l, lista *fim, int op);
lista *ordena(lista *l, lista *fim, lista *inicio, int op);
lista *busca(lista *inicio, int valorp, int cmp_maior_1_ou_nd_0);
void alteracao(lista *valor, lista *inicio);
lista *remocao(lista *inicio_ou_fim, lista *valor, int flag);
void imprime(lista *inicio, int td_nd);

void main()
{
  lista *l, *fim, *result;
  int op, valorp, op_insert;

  l=inicializa();//Inicializa a lista dinamica
  fim=inicializa();

  do{
      op=menu();

      if(op == 1)
      {
        do{
        system("cls");
      cout<< "\n\tPara iniserir no inicio 1, para inserir no fim 2\n\t";
      cin>> op_insert;
      if(op_insert < 1 || op_insert > 2)
      {
         system("cls");
         cout<< "\n\n\n\tO valor deve ser 1 ou 2\n\n\n";
         system("pause");
      }
        }while(op_insert < 1 || op_insert > 2);
      if(op_insert == 1)
      {
         if(l != NULL)
            l=insere(l, fim, op_insert);
         else
         {
            fim=insere(l, fim, op_insert);
            l=fim;
         }
      }
      else
         if(op_insert == 2)
         {
            if(l != NULL)
               fim=insere(l, fim, op_insert);
            else
            {
               l=insere(l, fim, op_insert);
               fim=l;
            }
         }
        system("pause");
      }
      else
        if(op == 2)
        {
            system("cls");
         if(l != NULL)
            imprime(l, 0);
         else
            cout<< "\n\n\n\tNem um valor incerido na lista\n\n\n";
            system("pause");
        }
      else
         if(op == 3)
         {
            system("cls");
            if(l != NULL)
            {
               cout<< "\n\tDigite o valor a ser procurado\n\t";
               cin>> valorp;
               result=busca(l, valorp, 0);
               if(result != NULL)
               {
                  system("cls");
                  imprime(result, 1);
               }
               else
               {
                  system("cls");
                  cout<< "\n\n\n\tValor nao encontrado\n\n\n";
               }
            }
            else
               cout<< "\n\n\n\tNem um valor incerido na lista\n\n\n";
            system("pause");
         }
         else
            if(op == 4)
            {
               system("cls");
               if(l != NULL)
               {
                  cout<< "\n\tDigite o valor a ser alterado\n\t";
                  cin>> valorp;
                  result=busca(l, valorp, 0);
                  if(result != NULL)
                  {
                     alteracao(result, l);
                  }
                  else
                  {
                     system("cls");
                     cout<< "\n\n\n\tValor nao encontrado\n\n\n";
                  }
               }
               else
               {
                  system("cls");
                  cout<< "\n\n\nNem um elemento na lita\n\n\n";
               }
               system("pause");
            }
            else
               if(op == 5)
               {
                  system("cls");
                  if(l != NULL)
                  {
                     cout<< "\n\n\tDigite o valor a ser removido\n\t";
                     cin>> valorp;
                     result=busca(l, valorp, 0);
                     if(result != NULL)
                     {
                        if(result != fim || result == l)
                           l=remocao(l, result, 0);
                        else
                           fim=remocao(fim, result, 1);
                     }
                     else
                     {
                        system("cls");
                        cout<< "\n\n\nValor nao encontrado\n\n\n";
                     }
                  }
                  else
                     cout<< "\n\n\nNem um elemento na lita\n\n\n";
                  system("pause");
               }

  }while(op != 6);
}

lista *inicializa()
{
  return NULL;
}

int menu()
{
  int op;

  do{
      system("cls");
      cout<< "\t1- Inserir um valor\n";
      cout<< "\t2- Mostrar lista\n";
     cout<< "\t3- Buscar um valor\n";
     cout<< "\t4- Alterar um valor\n";
     cout<< "\t5- Remover um valor\n";
      cout<< "\t6- Sair\n";
      cout<< "\n\n\tDigite a opcao desejada\n\t";
      cin>> op;
      if(op < 1 || op > 6)
      {
        system("cls");
        cout<< "\n\n\nOpcao invalida\n\n\n";
        system("pause");
      }
  }while(op < 1 || op > 6);
  return op;
}

lista *insere(lista *l, lista *fim, int op)
{
  lista *novo, *result;

  system("cls");
  novo=(lista*) malloc (sizeof(lista));
  novo->anterior=NULL;
  novo->proximo=NULL;
  cout<< "\nDigite o valor desejado\n";
  cin>> novo->info;
  if(op == 1)
  {
     if(l != NULL)
     {
        result=busca(l, novo->info, 0);//valida se não há valor repetido
       
        if(result == NULL)
        {
           l->anterior=novo;
           novo->proximo=l;
           return novo;
        }
        else
        {
           system("cls");
           cout<< "\n\n\n\tValor ja existente\n\n\n";
           return l;
        }
     }
     else
     {
        return novo;
     }
  }
  else
     if(op == 2)
     {
        if(l != NULL)
        {
           result=busca(l, novo->info, 0); //valida se não há valor repetido
           if(result == NULL)
           {
              /*result=busca(l, novo->info, 1);
              if(result == l)
              {
              }*/
              novo->anterior=fim;
              fim->proximo=novo;
              return novo;
           }
           else
           {
              system("cls");
              cout<< "\n\n\n\tValor ja existente\n\n\n";
              return fim;
           }
        }
        else
        {
           return novo;
        }
     }
     return NULL;
}

/*lista *ordena(lista *l, lista *fim, lista *inicio, int op)
{

}*/

lista *busca(lista *inicio, int valorp, int cmp_maior_1_ou_nd_0)// 1 = compra valor enquanto for menor, ou 0 = não faz comparação só busca normal
{
   lista *p=inicio;
   if(cmp_maior_1_ou_nd_0 == 0)
   {
      while(p != NULL)
      {
         if(p->info == valorp)
            return p;
         
         p=p->proximo;
      }
      return p;
   }
   else
      if(cmp_maior_1_ou_nd_0 == 1)
      {
      }
}

void alteracao(lista *valor, lista *inicio)
{
   lista *result;
   int valor_novo;

   system("cls");
   cout<< "Info: " << valor->info << "\n\n\tDigite o valor para alterar\n\t";
   cin>> valor_novo;

   result=busca(inicio, valor_novo, 0);

   if(result == NULL || valor->info == valor_novo)
   {
      valor->info=valor_novo;
   }
   else
   {
      system("cls");
      cout<< "\n\n\n\tValor ja existe\n\n\n";
   }
}

lista *remocao(lista *inicio_ou_fim, lista *valor, int flag)
{
   lista *inicio_ou_meio, *fim, *ant, *prox;
   if(flag == 0)
   {
      inicio_ou_meio=inicio_ou_fim;
      if(inicio_ou_meio != valor)// Meio, valor é o meio.
      {
         ant= valor->anterior;
         prox= valor->proximo;
         ant->proximo=prox;
         prox->anterior=ant;
         free(valor);
         return inicio_ou_fim;
         
      }
      else // inicio
      {
         if(inicio_ou_meio->proximo != NULL)
         {
            inicio_ou_meio=inicio_ou_meio->proximo;// inicio anda para o meio
            inicio_ou_meio->anterior=NULL;//anterior do meio recebe NULL
            free(valor);
         }
         else // inicio com somente um elemento
         {
            free(inicio_ou_fim);
            return NULL;
         }
      }
      return inicio_ou_meio;
   }
   else
   {
      fim=inicio_ou_fim;
      fim=fim->anterior;
      fim->proximo=NULL;
      free(inicio_ou_fim);
      return fim;
   }
}

void imprime(lista *inicio, int td_nd)
{
  lista *i=inicio;

  if(td_nd == 0)
  {
     while(i != NULL)
     {
        cout<< "Info: " << i->info << "\n\n";
        i=i->proximo;
     }
  }
  else
     if(td_nd == 1)
     {
        cout<< "Info:" << inicio->info << "\n\n";
     }
}
avatar
Renancr

Mensagens : 118
Data de inscrição : 08/03/2010

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum