Ir para conteúdo
cristiano moreira

lista duplamente encadeadas

Recommended Posts

ajuda com lista duplamente encadeada 

A primeira lista deve conter as seguintes informações em cada nodo:

- dinheiro - crédito - dívida

Além destes atributos, a primeira lista conterá em cada nodo uma segunda lista.

A segunda lista conterá as seguintes informações:

- idade - peso - altura

A primeira lista conterá 4 nodos. Sabendo que dentro de cada nodo da primeira lista temos outra lista (chamada de segunda lista), teremos ao total 5 listas. A segunda lista contida no primeiro nodo da primeira lista deverá ter 3 nodos. A segunda lista contida no segundo nodo da primeira lista deverá ter 3 nodos. A segunda lista contida no terceiro nodo da primeira lista deverá ter 2 nodos. A segunda lista contida no quarto nodo da primeira lista deverá ter 5 nodos. Após estruturar todas os elementos das listas você deve: 1) Apresentar a lista principal (primeira lista); 2) Apresentar as quatro listas secundárias (secunda lista); 3) Remover o elemento 2 da lista contida no nodo 4 dentro da lista principal; 4) Exibir a lista principal inversa; 5) Exibir as 4 listas secundárias inversas.

esse o meu código 

#include<stdlib.h>
#include<stdio.h>

typedef struct No{
   int idade;
   int peso;
   int altura;
   struct No1 * listainterna;
   struct No *proximo;
   struct No *anterior;
} No;
typedef struct No1{
   float dinheiro;
   float credito;
   float divida;
   struct No1 * listaexterna;
   struct No1 *proximo;
   struct No1 *anterior;
} No1;

No * criar_listaexterna(int idade, int peso, int altura){
  No *novo;
  novo = (No *) malloc(sizeof(No));
  novo->idade = idade;
  novo->peso = peso;
  novo->altura = altura;
  novo->proximo  = NULL;
  novo->anterior = NULL;
  return novo;
}
No1 * criar_listainterna(float dinheiro, float credito, float divida){
  No1 *novo;
  novo = (No1 *) malloc(sizeof(No1));
  novo->dinheiro = dinheiro;
  novo->credito = credito;
  novo->divida = divida;
  novo->proximo = NULL;
  novo->anterior = NULL;
  return novo;
}
//Funcao abaixo insere no inicio da lista
No * insere_primeiro(No * lista, No * novo){
   if (lista != NULL){
     lista->anterior = novo;
     novo->proximo = lista;
   }
   return novo;
}
No1 * insere_primeiro1(No1 * lista, No1 * novo){
   if (lista != NULL){
     lista->anterior = novo;
     novo->proximo = lista;
   }
   return novo;
}

No * retorna_ultimo_da_lista(No * lista){
  while (lista->proximo != NULL){
    lista = lista->proximo;
  }
  return lista;
}

No * insere_ultimo(No * lista, No * novo){
  if (lista != NULL) {
    No * n = retorna_ultimo_da_lista(lista);
    n->proximo = novo;
    novo->anterior = n;
    return lista;
  }else{
    return novo;
  }
}
No1 * insere_ultimo1(No1 * lista, No1 * novo){
  if (lista != NULL) {
    No1 * n = retorna_ultimo_da_lista(lista);
    n->proximo = novo;
    novo->anterior = n;
    return lista;
  }else{
    return novo;
  }
}
void apresenta_lista(No * lista){
  //Percorrendo os elementos da lista
   int cont = 0;
   while (lista != NULL){
      printf("\nIdade %d, peso %d, altura %d\n", lista->idade, lista->peso, lista->altura);
      cont++;
      lista = lista->proximo;
   }
}
 
 void apresenta_listainterna(No1 * lista){
  //Percorrendo os elementos da lista
   int cont = 0;
   while (lista != NULL){
      printf("Valor %f, Credito %f, Divida %f\n", lista->dinheiro, lista->credito, lista->divida);
      cont++;
      lista = lista->proximo;
   }
}
void apresenta_lista_inversa(No * lista){
   int cont = 0;
   No * ultimo = retorna_ultimo_da_lista(lista);
   system("pause");
   while (ultimo != NULL){
      printf("\nIdade %d, peso %d, altura %d\n", ultimo->idade, ultimo->peso, ultimo->altura);
      cont++;
      ultimo = ultimo->anterior;
   }
}

No * remove_elemento(No * lista, int posicao){
  if (lista != NULL){
   //   printf("Removendo NULL \n");
    No * aux = lista;
    //exclusao lista
    if (posicao == 1){
      lista = lista->proximo;
      //Se nao for o ultimo elemento da lista
      if (lista != NULL){
         lista->anterior = NULL;
      }
    }else{
      int cont = 1;
      while (aux != NULL && cont < posicao) {
        aux = aux->proximo;
        cont++;
      }

      if (aux == NULL){
          printf("A lista nao tem %d elementos \n", posicao);
          return lista;
      }

      aux->anterior->proximo = aux->proximo;

      //exclusão do último não necessita atualizar a referencia de um elemento posterior
      if (aux->proximo != NULL){
        aux->proximo->anterior = aux->anterior;
      }
    }
    free(aux);
  }else{
     printf("A lista esta vazia! \n");
  }
  return lista;
}

No * insere_na_lista(No * lista, No * novo, int posicao){
  No * aux = lista;
  //Inclusão no inicio
  if (lista == NULL || posicao == 1){
     lista = insere_primeiro(lista, novo);
  }else{
    int cont = 1;
    while (aux->proximo != NULL && cont < posicao) {
      aux = aux->proximo;
      cont++;
    }
    //Inclusão no último
    if (aux->proximo == NULL){
       insere_ultimo(lista, novo);
    }else{
       //inclusão em outro ponto
       
       aux->anterior->proximo = novo;
       novo->proximo  = aux;
       novo->anterior = aux->anterior;
     
       aux->anterior  = novo;
    }
  }
  return lista;
}


 int main() {
   // Criando referencia para a lista
  printf("\n\n");
   No *lista = NULL;

   // criar um lista apontada por n com o primerio elemento
   No *n = criar_listaexterna(18, 75, 179);
   lista = insere_ultimo(lista, n);
   
   No *n2 = criar_listaexterna(22, 84,180);
   lista = insere_ultimo(lista, n2);
   
   No *n3 = criar_listaexterna(30, 90, 190);
   lista = insere_ultimo(lista, n3);
   
   No *n4 = criar_listaexterna(55, 76, 178);
   lista = insere_ultimo(lista, n4);   
   apresenta_lista(lista);
   system("PAUSE");
   
   No1 *m = criar_listaexterna(18, 75, 179);
   No1 *m2 = criar_listaexterna(22, 84,180);
   No1 *m3 = criar_listaexterna(30, 90, 190);
   No1 *m4 = criar_listaexterna(55, 76, 178);
  
   printf("Inserindo na ultima posicao da lista os elementos n2, n3 e n4 \n");
   lista = insere_ultimo1(lista, m);
   lista = insere_ultimo1(lista, m2);
   lista = insere_ultimo1(lista, m3);
   apresenta_listainterna(lista);
   system("PAUSE");

   printf("Inserindo n5 como primeiro elemento da lista. \n");
   lista = insere_primeiro(lista, n4);
   apresenta_lista(lista);
   system("PAUSE");


   printf("Apresentado a lista em ordem inversa. \n");
   apresenta_lista_inversa(lista);
   system("PAUSE");


   printf("Apresentado a lista em ordem inversa. \n");
   apresenta_lista_inversa(lista);
   system("PAUSE");


   printf("Removendo 2 \n");
   lista = remove_elemento(lista, 2);
   apresenta_listainterna(lista);
   system("PAUSE");
}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora


  • Conteúdo Similar

    • Por carlosdaniiel07
      Tenho o seguinte código em minha aplicação:
      public Usuario checkLogin(Usuario entity) { //return Usuario userEntity = new Usuario(); connection = mysql.OpenConnection(); try { MySqlCommand stm = new MySqlCommand(); MySqlDataReader data; stm.CommandText = "CALL validaLogin(?login, ?senha)"; stm.Connection = connection; stm.Parameters.AddWithValue("?login", entity.Login); stm.Parameters.AddWithValue("?senha", entity.Senha); var id = stm.ExecuteScalar(); errorUtil.showCustomAlert(id.ToString()); } catch(MySqlException ex) { errorUtil.showDBError(ex); } finally{ connection.Close(); } return userEntity; } A função dele é basicamente receber um usuário e senha e efetuar a validação do login por meio do stored procedure validaLogin. Porém, ao passar o atributo Login do objeto entity a minha consulta simplesmente não retornada nada (necessariamente precisa retornar pois os dados que digito no form são idênticos aos salvos no MySQL).
      Entretanto, caso eu substitua o atributo do objeto por uma string (conforme abaixo) obtenho sucesso em minha query.
      stm.Parameters.AddWithValue("?login", "logindousuario"); stm.Parameters.AddWithValue("?senha", "senhadousuario");
    • Por macielcr7
      Estou usando o sdk dahua para conectar-me a um DVR. Até então. Estou tendo problemas para obter os bytes
      retornados de uma câmera. e exportar em formato de imagem. Sou iniciante e não tenho ideia. como.
       
      // real-time monitoring method g_lRealHandle = CLIENT_RealPlayEx(g_lLoginHandle, command_options.dvr_channel, NULL, emRealPlayType); //set-callback CLIENT_SetRealDataCallBackEx(g_lRealHandle, &RealDataCallBackEx, NULL, dwFlag) //bytes de retorno da camera void CALLBACK RealDataCallBackEx(LLONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, LONG param, LDWORD dwUser) { // if more than one real-time monitoring use same data callback, we can judge by parameter lRealHandle. //NESTA PARTE QUE QUERIA PEGAR OS FRAMES DOS BYTES E SALVAR A IMAGEM fwrite (pBuffer, 1, dwBufSize, file); fflush(file); //original A/V hybrid data //printf("receive real data, param: lRealHandle[%ld], dwDataType[%u], pBuffer[%p], dwBufSize[%u], param[%d], dwUser[%ld] - [%d]\n", lRealHandle, dwDataType, pBuffer, dwBufSize, param, dwUser, bInput); }
    • Por carolOL
      Estou procurando uma biblioteca tanto windows como linux para enviar email com layout, alguém aqui já usou alguma e pode me indicar ?
    • Por Marina Novello Bortolucci
      Será que alguém pode me ajudar, tenho o código abaixo, gostaria de converte-lo em c#
      HttpClient client = HttpClientBuilder.create().build(); HttpPost post = new HttpPost(URL); FileBody fileBody = new FileBody(path.toFile(), ContentType.DEFAULT_BINARY); StringBody stringBody1 = new StringBody("15425039000128", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = new StringBody("154250", ContentType.MULTIPART_FORM_DATA); StringBody stringBody3 = new StringBody("7513", ContentType.MULTIPART_FORM_DATA); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("login", stringBody1); builder.addPart("senha", stringBody2); builder.addPart("cidade", stringBody3); builder.addPart("f1", fileBody); HttpEntity entity = builder.build(); // post.setEntity(entity); HttpResponse response = client.execute(post);
    • Por yukaGoonom
      Estou montando um programa em c+ , que deveria solicitar números para uma matriz e identificar se ela é simétrica , ou não é simétrica, porém não acho erro em meu programa , se alguém puder me informar aonde estou errando , ficaria grata.
       
      #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char* argv[]){          int A[8][8],B[8][8];     int i,j,cont=0;          for(i=0;i<8;i++){         for(j=0;j<8;j++){             printf("Informe o elemento da linha %d da coluna %d: ",i+1,j+1);             scanf("%d", &A[j]);             B[j] = A[j];                          if(A[j]!=B[j]){                 cont++;             }         }     }     if(cont>0){         printf("\n\nA matriz nao e simetrica!!\n\n");     }else{         printf("\n\nA matriz e simetrica!!\n\n");     }          system("PAUSE");     return 0; }  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.

Este projeto é mantido e patrocinado pelas empresas:
Hospedado por: