Ir para conteúdo
Fórum Script Brasil

p4t0X

Membros
  • Total de itens

    151
  • Registro em

  • Última visita

Tudo que p4t0X postou

  1. p4t0X

    (Resolvido) Exercicio

    Não entendi direito, teoricamente do jeito que eu postei você só vai digitar as notas depois que você inserir uma matrícula válida. O que você quer é +- assim oh? - Você digita o conjunto de matrícula+notas, e depois checa a matrícula pra ver se já existe; - Se a matrícula já existir, você faz o cara digitar uma matrícula válida, e usa o conjunto de matrícula nova + as notas antigas; É isso?! EDITADO: Posta o código completo aí!
  2. p4t0X

    (Resolvido) Arquivos em C

    O código não tá completo, mais dá pra ter +- uma noção do que fazer :s Tem coisa que eu sei que não está funcionando, tem uns par de teste, mais foi o que eu consegui fazer no trampo =( Qualquer coisa só postar aí!
  3. p4t0X

    (Resolvido) Arquivos em C

    Opa, eu não consegui fazer muita coisa hj, vo posta aqui só pra ter como eu continuar em casa! Mas pode dar uma idéia pra vocês! #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct s_aluno { int codigo; char nome[30]; float media; }Aluno; typedef struct s_pesquisa_aluno { int codigo; long posicao; }AlunoPesquisa; void inserirAluno( Aluno *aluno , char *tmpfile ); Aluno *pesquisarAluno( int codigo , char *datafile , char *keyfile ); void mergeFiles( char *datafile , char *keyFile , char *tmpFile ); void inserirAluno( Aluno *aaa , char *tmpfile ){ FILE *fp; Aluno aux; long pos = 0; if( NULL != ( fp = fopen( tmpfile, "rb+" ) ) ){ //Procura pela posição a ser inserida no arquivo temporario fseek( fp , 0 , SEEK_SET );//Inicio do arquivo while( !feof( fp ) ){ fread( &aux , sizeof( Aluno ) , 1 , fp ); /* if( aux.codigo < aaa->codigo ){ printf( "CODIGO: %d\n" , aux.codigo ); continue; }else { break; } */ if( !feof( fp ) ){ if( aux.codigo < aaa->codigo ){ continue; }else { //fseek( fp , - sizeof( Aluno ) , SEEK_CUR ); break; } } } if( !feof( fp ) ){ printf( "Antes: %ld Elemento: %d" , ftell(fp), aaa->codigo ); fseek( fp , - sizeof( Aluno ) , SEEK_CUR ); printf( "Depois: %ld\n" , ftell(fp) ); } //printf( "Codigo Inserido: %d" , aaa->codigo ); printf( "Pos: %ld\n" , ftell( fp ) ); //fseek( fp , pos , SEEK_SET ); fwrite( aaa , sizeof( Aluno ) , 1 , fp ); }else { printf( "Impossivel abrir o arquivo temporario: %s\n" , tmpfile ); } fclose( fp ); } Aluno *pesquisarAluno( int codigo , char *datafile , char *keyfile ){ FILE *infos, *key; AlunoPesquisa posicao; Aluno *result; key = fopen( keyfile , "rb" ); while( !feof( key ) ){ fread( &posicao , sizeof( AlunoPesquisa ) , 1 , key ); if( !feof( key ) ){ if( posicao.codigo == codigo ){ //Aloca memoria para o registro result = (Aluno *) malloc( sizeof( Aluno ) );//@todo Verificar se conseguiu //Abre o arquivo de dados e coloca na posição encontrada, lê o registro para a estrutura infos = fopen( datafile , "rb" ); fseek( infos, posicao.posicao , SEEK_SET ); fread( result , sizeof( Aluno ) , 1 , infos ); fclose( infos ); fclose( key ); //Retorna a estrutura return result; } } } fclose( key ); return NULL; } void mergeFiles( char *datafile , char *keyFile , char *tmpFile ){ FILE *infos, *key, *tmp; Aluno aluno; AlunoPesquisa posicao; AlunoPesquisa aux; long pos = 0; infos = fopen( datafile , "ab+" ); tmp = fopen( tmpFile , "rb" ); key = fopen( keyFile , "ab" ); //Poderia fazer aqui uma procura pra a ver se já existe o codigo a ser inserido, eu nem //vou fazer fseek( key, 0 , SEEK_SET ); while( !feof( tmp ) ){ //Lê a linha atual do arquivo temporário fread( &aluno , sizeof( Aluno ) , 1 , tmp ); if( !feof( tmp ) ){//Verifica se não chegou no final do arquivo //Adiciona no arquivo de key pos = ftell( key ); while( !feof( key ) ){ fread( &aux , sizeof( AlunoPesquisa ) , 1 , key ); if( !feof( key ) ){ if( aluno.codigo > aux.codigo ){ continue; }else { pos = aux.posicao; } } } posicao.codigo = aluno.codigo; posicao.posicao = ftell( infos ); fwrite( &posicao , sizeof( AlunoPesquisa ) , 1 , key ); //Adiciona no arquivo de dados fwrite( &aluno , sizeof( Aluno ) , 1 , infos ); } } fclose( infos ); fclose( tmp ); fclose( key ); //Remove o temp remove( tmpFile ); } int main( int argc, char **argv ){ Aluno teste; Aluno *teste_pesquisa; FILE *t; t = fopen( "teste.txt" , "wb" ); fclose( t ); teste.codigo = 5; teste.media = 10; strcpy( teste.nome , "Diego" ); inserirAluno( &teste , "teste.txt" );//Coloca para inserir teste.codigo = 2; teste.media = 5; strcpy( teste.nome , "Asdwqe" ); inserirAluno( &teste , "teste.txt" );//Coloca para inserir /* teste.codigo = 3; teste.media = 6; strcpy( teste.nome , "JUAN" ); inserirAluno( &teste , "teste.txt" );//Coloca para inserir */ //mergeFiles( "dados.txt" , "keys.txt" , "teste.txt" );//Atualiza o arquivo de dados e de keys /* teste_pesquisa = pesquisarAluno( 2 , "dados.txt" , "keys.txt" ); if( teste_pesquisa != NULL ){ printf( "%d%s%f\n" , teste_pesquisa->codigo , teste_pesquisa->nome , teste_pesquisa->media ); }else { printf( "Registro não encontrado!\n" ); } */ }
  4. O primeiro é simples, existe uma maneira super simples de você calcular porcentagens, veja: Normalmente, para calcular porcentagem você faz o que? - Multiplica o número pela porcentagem a ser descoberta; - Divide por 100; Se você analizar as 2 operações tem a mesma prioridade, então pouco importa qual das 3 operações você vai fazer primeiro. Agora veja, se você quer descobrir 10% de 50, você multiplica 50 por 10 e divide por 100, se você realizar a operação (multiplicar por 10 e dividir por 100) ANTES de multiplicar por, ficaria assim: 10/100 * 50 0.1 * 50 5 Agora se fosse 20% 20/100 * 50 0.2 * 50 10 Então resumindo, para você descobrir uma certa porcentagem de um valor, basta pelo centésimo desse valor, segue alguns exeplos: 33% -> 0.33 10% -> 0.1 (que é a mesma coisa que 0.10) 1.5% (um e meio porcento) -> 0.015 1% -> 0.01 100% -> 1 Se você tem um produto com um preço X, e você quer dar um desconto de 5% (então no fundo você quer saber 95% (1 - 0.05) do preço original do produto) basta você multiplicar o preço X por 0.95 que você vai ter 95% do preço do produto. O mesmo serve para aumentar o preço, se você quer cobrar 3% a mais, então você quer saber o preço dele(1 + 0.03), então basta multiplicar X por 1.03 Enfim, espero que tenha ajudado! Qualquer coisa dá um toque!
  5. p4t0X

    (Resolvido) Exercicio

    Boa tarde! Tava quase certo! Só que o while era dentro do for! Tenta assim oh: void lerAluno (Aluno *p){ int i; int j; int matriculaValida = 0; for(i=0;i<5;i++){ while( !matriculaValida ){ printf( "Digite uma nova matricula: " ); scanf( "%d" , &(p->matricula[i]) ); matriculaValida = 1; for(j=0; j<i; j++){ if(p->matricula[i] == p->matricula[j]){ printf("\n ERRO - MATRICULA já CONSTA NO SISTEMA!\n\n"); matriculaValida = 0; } } } printf("Nota1: "); scanf("%f",&(p->nota1[i])); printf("Nota2: "); scanf("%f",&(p->nota2[i])); printf("\n"); p->somamedia[i] = p->nota1[i] + p->nota2[i]; } }
  6. Aqui funcionou normalmente com essas entradas: O resultado esperado é o seguinte: Media dos valores é: 10.0 Soma dos valores é : 40.0 Resto da somatoria(40.00) divido pela 1 nota(10.0) é: 0.0 Resto da somatoria(40.00) divido pela 2 nota(10.0) é: 0.0 Resto da somatoria(40.00) divido pela 3 nota(10.0) é: 0.0 Resto da somatoria(40.00) divido pela 4 nota(10.0) é: 0.0 Só lembrando que o resto é o resto mesmo, 40 / 10 = 4 e sobra 0
  7. Aqui parece estar normal! :o Me fala quais as entradas que vocês estão usando... EDITADO: Eu testei tanto no ubuntu quanto no windows e parece estar funcionando!
  8. p4t0X

    (Resolvido) Arquivos em C

    Bom dia, Beleza, vou tentar fazer um esboço aqui pra tentar ajudar =)
  9. Bom dia, vê se foi claro: #include <stdio.h> #include <stdlib.h> #include <math.h> struct Media { float valor[4]; float soma; float media; }; int main( int argc, char **argv ){ struct Media med; int i; med.soma = 0; for( i=0; i<4; i++ ){ printf( "Digite o valor %d: " , i+1 ); scanf( "%f" , &med.valor[i] ); } for( i=0; i<4; i++ ){ med.soma += med.valor[i]; }//O loop termina aki, e não embaixo dos prints //Você só faz a média DEPOIS que você tiver a soma med.media = med.soma / 4; system ("cls"); printf ("Media dos valores é: %0.1f\n", med.media); printf ("Soma dos valores é : %0.1f\n", med.soma); //Substitui a função fmod, vamo fazer na mão mesmo: // O resto da divisão é: o numerador menos a parte inteira do numerador/denomidor vezes o denominador //Ex: o resto de 5/2 //Númerador = 5; Denominador = 2; // 5 - ( (a parte inteira de 5/2) * 2 ) // 5 - ( (2) * 2 ) // 5 - 4 // 1 //Deu pra intender?! for( i=0; i<4; i++ ){ printf( "Resto da somatoria(%.2f) divido pela %d nota(%.1f) é: %0.1lf\n" , med.soma, i+1 , med.valor[i], med.soma - ( ((int)(med.soma/med.valor[i]))* med.valor[i] ) ); } system ("pause"); }
  10. Bom dia! Dando uma estudada melhor no código eu acho que eu descobri o erro! A variável files está sendo passada por VALOR. Tem 2 soluções: 1) A função retornar um ponteiro; 2) Passar a variavel por referencia; Aqui eu adptei rapidamente para a 2 opção: #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #include<dirent.h> #include<string.h> void get_files(char *dir, char ***content, int *i){ DIR *dp; struct dirent *ep; dp = opendir(dir); if( !dp ){ printf("Error!!!\n"); exit(-1); }else{ while( NULL != ( ep = readdir(dp) ) ){ //Realoca a memória existente adicionando +1 posição (*content) = (char **) realloc( (*content), (*i+1) * sizeof(char *) ); if( (*content) == NULL ){ printf( "Erro no realloc!" ); exit( -1 ); } //Aloca a quantidade necessária para o nome do arquivo atual (*content)[*i] = (char *) malloc( ( strlen( ep->d_name ) ) * sizeof(char) ); if( (*content)[*i] == NULL ){ printf( "Putz, impossivel alocar mais memoria!" ); exit( -1 ); } //Copia a string strcpy((*content)[*i],ep->d_name); //Incrementa o número de arquivos *i = *i + 1; } if( closedir( dp ) ){ printf("Can't close the dir.\n"); } } } int main( int argc, char **argv ){ int i=0,j; char **files = (char **) malloc( sizeof( char *) ); get_files(".",&files,&i); for( j = 0; j < i; j++ ){ printf ("%s\n" , files[j] ); } return 0; } Testei no ubuntu e no windows, tudo normal! []'s
  11. Boa noitee! Ultimo post antes de drumir! :x Aki oh, seu código "revisado" Fiz alguns comentários! #include <stdio.h> #include <stdlib.h> struct Media{ float v1; float v2; float v3; float v4; float totmed; float totsoma; }; main (){ /* * Se você quer descobrir a média para um conjunto de quatro números, você não precisa declarar um vetor, * afinal de contas, a struct média já tem as 4 variaveis para as notas! * Se você queria ter 4 conjuntos de 4 números, então tá certinho! :D */ struct Media med [4]; int i=1; for (i=1; i<2; i++){ printf ("\n inf o %u. valor: ", 1); scanf ("%f", &med[i].v1); printf ("\n inf o %u. valor: ", 2); scanf ("%f", &med[i].v2); printf ("\n inf o %u. valor: ", 3); scanf ("%f", &med[i].v3); printf ("\n inf o %u. valor: ", 4); scanf ("%f", &med[i].v4); med[i].totmed= (med[i].v1+med[i].v2+med[i].v3+med[i].v4)/4; med[i].totsoma= (med[i].v1+med[i].v2+med[i].v3+med[i].v4); } system ("cls"); for (i=1; i<2; i++){ printf ("\n media dos valores e = %0.1f \n", med[i].totmed); printf ("\n soma dos valores e = %0.1f \n", med[i].totsoma); /* * O problema tá aqui oh, você tava pegando uma nota de cada estrutura (med[1].v1,med[2].v2,med[3].v3,med[4].v4) * quando que o certo seria você pegar todas as notas da estrutura do loop atual(med[i]) * * Outra coisa é que você tem a soma na estrutura agora, então você não precisa mais pegar a (media*4) */ printf( "\n Resto da somatoria div. pela primeira nota e: %0.1f \n" , fmod( med[i].totsoma , med[i].v1 ) ); printf( "\n Resto da somatoria div. pela segunda nota e: %0.1f \n" , fmod( med[i].totsoma , med[i].v2 ) ); printf( "\n Resto da somatoria div. pela terceira nota e: %0.1f \n" , fmod( med[i].totsoma , med[i].v3 ) ); printf( "\n Resto da somatoria div. pela quarta nota e: %0.1f \n" , fmod( med[i].totsoma , med[i].v4 ) ); } system ("pause"); } Basicamente eu só não entendi o porque você declarou um vetor de 4 posições da estrutura sendo que você só usa 1! Mais do resto tá certinho, o unico errinho na média foi uma confusãozinha, imagino eu que decorrente da declaração desse vetor! Se você quiser, eu fiz uma "versão" oh: #include <stdio.h> #include <stdlib.h> /* * Mudando um pouco a estrutura da média, criando os valores num vetor, daí agnt pode preencher e analisar eles através de um * loop */ struct Media { float valor[4]; float soma; float media; }; int main( int argc, char **argv ){ /* * Se você quer pegar somente um conjunto de quatro números, não é preciso declarar um vetor aqui, * a struct já tem as 4 variaveis para os valores, então basta declarar uma * struct! */ struct Media med; int i; //Inicializa o somatorio como 0 (ZERO) med.soma = 0; //Loop pra pegar todas as notas for( i=0; i<4; i++ ){ printf( "Digite o valor %d: " , i+1 ); scanf( "%f" , &med.valor[i] ); } //Calcula a soma: Esse for é o equivalente a: (med[i].v1+med[i].v2+med[i].v3+med[i].v4) for( i=0; i<4; i++ ){ med.soma += med.valor[i]; } //Adiciona a média agora med.media = med.soma / 4; system ("cls"); printf ("Media dos valores é: %0.1f\n", med.media); printf ("Soma dos valores é : %0.1f\n", med.soma); //Loop pra percorrer todos os valores(notas) for( i=0; i<4; i++ ){ printf( "Resto da somatoria(%.2f) divido pela %d nota(%.1f) é: %0.1f\n" , med.soma, i+1 , med.valor[i], fmod( med.soma , med.valor[i] ) ); } system ("pause"); } Ahh, não tem espaço entre o "[" e o "code", é tudu junto! Enfim, espero ter ajudado! Boa noite! ^.^
  12. p4t0X

    (Resolvido) Arquivos em C

    Boa noite! O que você precisa fazer?!
  13. p4t0X

    Listas circulares

    Boa noite! Bom, posta a estrutura que você montou de lista circular... Existe maneiras diferentes de implementar, posta a maneira que você está usando aí! []'s
  14. Opa, boa noite! Então, a principal razão dele não estar funcionando foi o treco do malloc alí... A questão do closedir eu só falei por falar, embora no caso realmente não esteja resultando em nada ;) btw, tá aí oh: #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #include<dirent.h> #include<string.h> void get_files(char *dir, char **content, int *i){ DIR *dp; struct dirent *ep; dp = opendir(dir); if( !dp ){ printf("Error!!!\n"); exit(-1); }else{ while( NULL != ( ep = readdir(dp) ) ){ //Realoca a memória existente adicionando +1 posição content = (char **) realloc( content, (*i+1) * sizeof(char *) ); if( content == NULL ){ printf( "Erro no realloc!" ); exit( -1 ); } //Aloca a quantidade necessária para o nome do arquivo atual content[*i] = (char *) malloc( ( strlen( ep->d_name ) ) * sizeof(char) ); if( content[*i] == NULL ){ printf( "Putz, impossivel alocar mais memoria!" ); exit( -1 ); } //Copia a string strcpy(content[*i],ep->d_name); //Incrementa o número de arquivos *i = *i + 1; } if( closedir( dp ) ){ printf("Can't close the dir.\n"); } } } int main( int argc, char **argv ){ int i=0,j; char **files; get_files(".",files,&i); for( j = 0; j < i; j++ ){ printf ("%s\n" , files[j] ); } return 0; } Qualquer coisa dá um toque! Até se funcionar... PS: Testei aqui no trampo não rodou, aqui eu uso Ubuntu e compilo com gcc, porém em casa tinha funcionado (DevCpp com mingw (acho) []'s
  15. p4t0X

    (Resolvido) Exercicio

    Boa noite! Hmm, intendi! Foi boa a descrição! O código é esse que tá postado no primeiro post? Para resolver o problema da matrícula é simples! Crie um flag(variável com 2 valores possíveis), enquanto o cara não digitar uma matrícula válida ele tem que digitar outra matrícula... Seria algo assim: int matriculaValida = 0; while( !matriculaValida ){ printf( "Digite uma nova matricula: " ); scanf( "%d" , ALGUMAVARIAVEL ); matriculaValida = 1; //Agora você procura pra ver se a matricula já existe for( ){//Percorre todos os elementos adicionados até o momento if(){//Verifica se matricula atual do loop é igual a digitada //Coloca que a matricula digita é invalida matriculaValida = 0; } } } Bom essa é uma solução possível! Se tiver alguma dúvida posta aí!
  16. p4t0X

    Listas encadeadas

    Boa tarde! Bom, se o conceito você intendeu, é só você fazer isso: Primeiro sugiro que você crie as funções para a manipulação da lista-ligada (no seu caso, somente a função para adicionar basta); Depois você usa o método atual para adicionar elementos, só que na lista; Depois você adapta o selectionSort para funcionar com a lista; Se tiver qualquer dúvida/problema posta aí!
  17. p4t0X

    Dica sobre livro c++

    Boa tarde! Se você quiser praticar, pode tentar aqui oh: http://olimpiada.ic.unicamp.br/
  18. p4t0X

    (Resolvido) Exercicio

    Boa tarde! Intendi! Vamos usar suas idéias mesmo! Atualmente sua idéia é essa ainda? Ou você já pensou em outra coisa? Faz assim, posta o que você pretende, o que você já fez que daí agente te ajuda!
  19. Boa tarde! Opa, não tem problema! num foi nenhuma crítica, só falei para ajudar mesmo :( Beleza, qualquer dúvida coisa posta aí!
  20. Boa tarde! Pra você fazer isso tá simples! Oh, você tem a média certo? Se você multiplicar a média pelo número de elementos (no caso 4) você terá a soma! Com a soma é só você fazer as contas necessárias... Por exemplo, para descobrir o resto da primeira nota: PS: Como você está usando floats, o operador de módulo(%) não funciona, você terá que usar a função fmod[http://www.cplusplus.com/reference/clibrary/cmath/fmod/] printf( "O resto da somatoria dividida pela primeira nota é: %f\n" , fmod( med[1].totmed * 4 , med[1].v1 ) ); Agora seria interessante se você criasse um vetor para armazenar os valores, assim oh: float v1; float v2; float v3; float v4; //Poderia trocar por: float valor[4]; Porque daí você pode iterar o vetor num laço de repetição! PS: Quando for postar um código, coloque ele entre as tags [ code] [ /code] (sem espaço) Qualquer coisa, é só falar!
  21. Bom dia! Um dos problemas está com esse malloc, ele não está fazendo o que você queria que ele fizesse: content = malloc((*i+1) * sizeof(char *)); Ele NÃO mantém a refêrencia para a memória antiga. Veja o exemplo: #include <stdio.h> #include <stdlib.h> int main( int argc , char **argv ){ int *teste; int i; //Adicionando o segundo elemento teste = (int *) malloc( 1 * sizeof( int ) ); teste[0] = 10; //Adicionando o segundo elemento teste = (int *) malloc( 2 * sizeof( int ) ); teste[1] = 20; //Adicionando o terceiro elemento teste = (int *) malloc( 3 * sizeof( int ) ); teste[2] = 30; //Mostrando o resultado for( i = 0; i < 3; i++ ){ printf( "%d\n" , teste[i] ); } } /* Resultado obtido: 0 0 30 Resultado esperado: 10 20 30 */ Sugiro que você dê uma olhada em realloc[http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/]. Outro problema está aqui: if(!closedir(dp)) { printf("Can't close the dir.\n"); } Olhando a descrição da função: CLOSEDIR NAME closedir - close a directory SYNOPSIS #include <sys/types.h> #include <dirent.h> int closedir(DIR *dir); DESCRIPTION The closedir() function closes the directory stream asso- ciated with dir. The directory stream descriptor dir is not available after this call. RETURN VALUE The closedir() function returns 0 on success or -1 on failure. Então quando o diretório for fechado corretamente, irá retornar 0 (que é interpretado como false), como você faz a condição de negação (!closedir()), quando o closedir retornar 0 (o diretório foi fechado CORRETAMENTE), a expressão (!closedir()) vai ser interpretada como true, o que não é verdade! Para esclarecer: #include <stdio.h> int main( int argc , char **argv ){ if( !(0) ){//Close dir retornou 0, diretório fechado corretamente printf( "0 é considerado TRUE" ); } if( !(-1) ){//Close dir retornou -1, diretório fechado INcorretamente printf( "-1 é considerado TRUE" ); } } /* Resultado: 0 é considerado TRUE
  22. Boa noite! Você poderia postar o erro!? Mais ainda sim, acho que tem algum problema aí! Essa função seria para descobrir o segundo maior número? int seg_maior(int n,int vet[]){ int b; //Descobrindo o segundo maior valor if (n==4) return vet[3]; else b=seg_maior(n-1,vet); return b; } Vou tentar clarear um pouco: Uma função recursiva realmente chama a sí própria, para isso ela tem que ter uma situação final(claro, se não ela vai ficar rodando pra sempre). No seu caso, teoricamente, a situação final seria (n==4), que é muiito vago! Por exemplo, você chamar sua função passando: n=3, sua função vai ficar rodando para todo o sempre, porque nunca a comparação n==4 vai ser verdadeira! Não sei porque você quer usar recursão nesse caso, vou dar um exemplo simples: //Vou fazer uma função para descobrir o maior número de um vetor int maiorNumeroVetor( int *vetor , int posicao , int maiorNumero ){ if( posicao < 0 ){//Verifica se chegou no final do vetor, caso tenha chegado retorna o maior número até o momento return maiorNumero; } if( vetor[posicao] > maiorNumero ){//Verifica se o valor da posição atual é maior que o maior número encontrado até agora, se for maior, atribui como o maior número encontrado maiorNumero = vetor[posicao]; } return maiorNumeroVetor( vetor , posicao-1 , maiorNumero );//Chama a função para comparar o próximo elemento do vetor } PS: Não compilei o código
  23. p4t0X

    Listas encadeadas

    Opa, boa noite! Bom, uma lista simplesmente encadeada seria algo +- assim: struct elemento_lista{ int valor; struct elemento_lista*proximo;//Ponteiro para o próximo elemento }; Basicamente, você guarda sempre uma referência do inicio da lista. Quando for adicionar um elemento, guardar a referência do novo elemento adicionado no "proximo" do ultimo elemento. Para percorrer, é só verificar o proximo de todos os elementos da lista. //Criação da lista elemento_lista *lista = NULL; //Adicionar o primeiro elemento lista = (elemento_lista *) malloc( sizeof( elemento_lista ) ); lista->proximo = NULL; lista->valor = 5; //Adicionar o N-simo elemento elemento_lista *aux = lista;//Aponta a variavel auxiliar para o inicio da lista while( aux != NULL ){//Percorre a lista até o ultimo elemento (proximo = NULL) aux = aux->proximo;//Avança um elemento na lista } //Final do loop, aux é o "proximo" do ultimo elemento, (NULL) aux = (elemento_lista *)malloc( sizeof( elemento_lista ) ); aux->proximo = NULL; aux->valor = 6; PS: não compilei o código :s, qualquer coisa é só falar!
  24. p4t0X

    problema com "while"

    Boa noitee! Não cheguei a programar muito c++, mais é possível comparar uma string desse modo: variavel == "string" ? []'s
  25. p4t0X

    Estrutura de Dados

    Don, esse código que você postou é uma mistura de árvore e fila! Uma das possíveis maneiras de declarar uma estrutura para uma árvore é a seguinte: struct noh { int elemento; struct noh *direita; struct noh *esquerda; }; Só lembrando que: - Os elementos da direita são sempre MAIORES; - Os elementos da esquerda são sempre MENORES; A lógica para adicionar é simples: Imaginando que você quer adicionar um elemento Z na árvore A; Comece apontando um nó para raiz da árvore A (a raiz de uma árvore é o primeiro elemento); [1] Compare se o elemento Z é maior que o elemento do nó atual; - Se Z for MAIOR que o elemento do nó atual O nó atual tem um filho à direita? Mude o elemento para o filho à direita e volte para [1]; O nó atual NÃO tem um filho à direita? Adicione o novo nó à direita desse elemento. - Se Z for MENOR que o elemento do nó atual O nó atual tem um filho à esquerda? Mude o nó para o filho à esquerda e volte para [1]; O nó atual NÃO tem um filho à esquerda? Adicione o novo nó à esquerda desse elemento. Exemplo de uma árvore simples: (raiz) 5 (filho) 3 7 (filho) Não sei se eu consegui explicar direito, mais acho que isso! Sugiro que você tente implementar a função de adicionar! Qualquer dúvida é só postar!
×
×
  • Criar Novo...