
p4t0X
Membros-
Total de itens
151 -
Registro em
-
Última visita
Tudo que p4t0X postou
-
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í!
-
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í!
-
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" ); } */ }
-
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!
-
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]; } }
-
(Resolvido) Dúvidas para utilização de ponteiros
pergunta respondeu ao Carla Aguiar de p4t0X em C, C++
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 -
(Resolvido) Dúvidas para utilização de ponteiros
pergunta respondeu ao Carla Aguiar de p4t0X em C, C++
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! -
Bom dia, Beleza, vou tentar fazer um esboço aqui pra tentar ajudar =)
-
(Resolvido) Dúvidas para utilização de ponteiros
pergunta respondeu ao Carla Aguiar de p4t0X em C, C++
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"); } -
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
-
(Resolvido) Dúvidas para utilização de ponteiros
pergunta respondeu ao Carla Aguiar de p4t0X em C, C++
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! ^.^ -
Boa noite! O que você precisa fazer?!
-
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
-
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
-
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í!
-
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í!
-
Boa tarde! Se você quiser praticar, pode tentar aqui oh: http://olimpiada.ic.unicamp.br/
-
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!
-
(Resolvido) Dúvidas para utilização de ponteiros
pergunta respondeu ao Carla Aguiar de p4t0X em C, C++
Boa tarde! Opa, não tem problema! num foi nenhuma crítica, só falei para ajudar mesmo :( Beleza, qualquer dúvida coisa posta aí! -
(Resolvido) Dúvidas para utilização de ponteiros
pergunta respondeu ao Carla Aguiar de p4t0X em C, C++
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! -
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
-
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
-
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!
-
Boa noitee! Não cheguei a programar muito c++, mais é possível comparar uma string desse modo: variavel == "string" ? []'s
-
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!