Ir ao conteúdo

arfneto

Membro Pleno
  • Posts

    6.526
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. "melhor" vai ser sempre o seu critério. Posso tentar algo Entendeu o que eu disse sobre escrever seu programa SEMPRE a partir dos dados? Veja esse desenho Tem dois casais, 0 e 1 e 2 e 3. Eles tem filhos, 4 e 5. E Esses tem um filho 6. Então 6 é neto de 0 1 2 e 3, filho de 4 e 5 e tal. Entende isso? É uma árvore genealógica pobre, 3 gerações com o mínimo pra testar seu programa. São os dados. Nada tem a ver com o que foi ensinado. Mas e o programa? struct pessoa { char nome[20]; char mae[20]; char pai[20]; int idade; }; Pois é: os caras vão entrar aí. Esses 6 ou 600 deles. No seu programa você tentar acessar por 0 1 e 2 e tal. Isso são pessoas fixas. Não vai resolver nada assim. Seria sempre o 0 1 e 2 do desenho. Precisa usar os índices. Que adianta olhar para pessoa[0]? É sempre o primeiro. typedef struct pessoa Pessoa; C tem esse comando que cria um novo tipo, um alias. Para que isso? Conveniência para você não ter que usar toda hora o tal struct pessoa... Use Colocando a família no programa Pessoa p[8] = { { "0","0","0", 30 }, // 0 { "1","1","1", 30 }, // 1 { "2","2","2", 30 }, // 2 { "3","3","3", 30 }, // 3 { "4","1","0", 20 }, // 4 { "5","3","2", 20 }, // 5 { "6","5","4", 2 } // 6 }; Veja como a vida fica mais simples: esses são os caras do desenho, da família de teste. Eu não coloquei nomes só porque dá trabalho. E tem o desenho afinal Aí já mostra quem é filho de quem porque está na ordem da declaração, certo? nome, mãe, pai, idade E você já pode rodar o programa só com isso. Ele tem que mostrar de 6 é neto de 0 1 2 e 3, como está no desenho. É isso. Se chama abstração e é o que os programas fazem. E o irmão? É muito mais fácil mas deixei para depois: imagine que 6 tem um irmão, então ele é filho de 4 e 5. Control-C control-V e eis um cara Pessoa irmaoDo6 = { "7","5","4", 7 }; // irmão do 6 Sim, filho de 5 e 4, com 7 anos e então irmão de 6 que 2 o Jr. Entende como já temos os dados e nada fizemos ainda? Vamos colocar o cara na família. Reparou que tem 8 no vetor mas só criamos 7 até agora? Sim, foi de propósito p[7] = irmaoDo6; E agora vamos ver se está certo ANTES de continuar com o programa. Escrevendo um programa que mostra o que tem na família. Pessoa: nome: 0 pai: 0 mae 0 idade = 30 Pessoa: nome: 1 pai: 1 mae 1 idade = 30 Pessoa: nome: 2 pai: 2 mae 2 idade = 30 Pessoa: nome: 3 pai: 3 mae 3 idade = 30 Pessoa: nome: 4 pai: 0 mae 1 idade = 20 Pessoa: nome: 5 pai: 2 mae 3 idade = 20 Pessoa: nome: 6 pai: 4 mae 5 idade = 2 Pessoa: nome: 7 pai: 4 mae 5 idade = 7 E não é que deu certo? Eis o programa int main() { Pessoa p[8] = { { "0","0","0", 30 }, // 0 { "1","1","1", 30 }, // 1 { "2","2","2", 30 }, // 2 { "3","3","3", 30 }, // 3 { "4","1","0", 20 }, // 4 { "5","3","2", 20 }, // 5 { "6","5","4", 2 } // 6 }; Pessoa irmaoDo6 = { "7","5","4", 7 }; // irmão do 6 p[7] = irmaoDo6; for (int i = 0; i < 8; i += 1) { printf("Pessoa: nome: %s pai: %s mae %s idade = %d\n", p[i].nome, p[i].pai, p[i].mae, p[i].idade); }; // for() }; Entende a diferença? Primeiro os dados. Agora o lance de avô e neto é o que te mostrei no tópico 1: A, B, C... adicionado 1 minuto depois E sem menus e ler coisas porque demora demais pra testar. Agora o programa tem que mostrar que 6 e 7 são netos de 0 1 2 e 3. São os avós. E 6 e 7 são irmãos. E todos tem idade. adicionado 49 minutos depois Eu te disse que pra achar os irmãos precisa de dois loops --- são duas gerações afinal --- e para achar um avô precisa de 3 loops. Sim, são 3 gerações para ter um neto. Seu programa não tem nenhum loop exceto o que lê os dados --- e como eu te mostrei não precisava desse antes de escrever a solução --- e assim não vai achar nem os irmãos nem os avós. recomendo ver com atenção o lance de A, B e C no tópico inicial. O enunciado não fala nada sobre isso, mas se tiver 10 irmãos na família se precisar saber o mais novo dos 10 tem que fazer mais umas coisas. Do jeito normalzinho de exercício de loop como esse só vai mostrar par a par, que eles são irmãos, entende? Não vai mostrar o mais novo dos 10, porque não vai agrupar o pessoal. Talvez deva confirmar se precisa disso, porque seria um outro exercício Nesse caso para cada geração teria que marcar os irmãos e agrupar e aí mostrar o mais novo de todos
  2. ? não entendo o que quer dizer. Eu nada disse lá sobre C. É apenas a lógica das relações. Não entendeu nada mesmo?
  3. Leia o primeiro tópico apenas e me diga o que você não entende e eu tento explicar de outro modo. Lá está claro que a opção de irmão vai usar dois loops e o lance de avô 3 loops, afinal são 3 gerações e o programa é baseado numa relação REAL. Em especial o lance de A B e C veja se entende e pergunte algo
  4. E? Eu disse Não entendo porque está usando constantes nos índices, tipo 0,1,2 3 E você responde Certo Mas porque está usando constantes nos índices? Entendeu o que perguntei sobre A B e C acima e o que expliquei no primeiro post?
  5. Não entendo porque está usando constantes nos índices, tipo 0,1,2 3. São variáveis. Leia bem o que te disse sobre A, B e C. Não use menus enquanto seu programa não está pronto. Só vai te atrasar. Escreva seu programa em torno dos dados. Sempre em torno dos dados. E tem que tirar essas constantes daí. Entenda o lance de A B e C e as relações que expliquei inicialmente e isso vai ficar claro adicionado 2 minutos depois Ao ler um valor, mostre de novo quando está testando. Vai se sentir mais seguro. Sabe escrever funções? São apenas um bloco de código com um nome, mas ajudam muito
  6. n deve ser uma constante adicionado 1 minuto depois O que significa esse lance de "não imprime ainda"?
  7. mudar pra usar strcmp() não ajudou em nada. Não respondeu se isso compila ok Não respondeu se entendeu o que expliquei inicialmente, ou mesmo se leu o que eu disse Poste o código como estava então antes de mudar para usar strcmp()
  8. o que é strcmp()? int strcmp(const char *stingr1, const char *string2) É uma função que compara duas coisas do tipo char*, as tais strings em C, coisas como "teste" O que é idade? struct pessoa { char nome[20]; char mae[20]; char pai[20]; int idade; }; Segundo acima é um campo de pessoa, um int. Então... não deve esperar muito ao usar strcmp() pra comparar dois números. Use o simples, > < = != , os operadores comuns... Compilou esse programa com sucesso? adicionado 0 minutos depois Entendeu o que te expliquei antes? adicionado 1 minuto depois Não teste seus programas dentro de menus. É muito chato e lento. Não leia nada do teclado até a ultima hora. Só dá problema e atrasa
  9. Esses "ambientes integrados de desenvolvimento" em geral tratam C e C++ ou muitas linguagens mesmo. O gcc no Linux é um kit de compiladores, de FORTRAN a C++, incluindo C e várias outras. Na Microsoft o Visual Studio e o Visual Studio Code aceitam de C a Assembler a javascript e dezenas de linguagens. É o mesmo com vários outros IDE. E aqui no forum essas linguagens C C++ e C# estão juntas mas são muito diferentes. Então na lista as questão tem um ícone pra cada linguagem e você escolhe ao criar um tópico. No Dev-C++ acho que diferencia apenas pela extensão do arquivo, c ou cpp
  10. Não precisa disso se só quer tratar a cor. Na console do Windows Como eu disse, no Unix/Linux/MacOS não tem console, mas no Windows pode usar isso BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD wAttributes ); E ver os parämetros em https://docs.microsoft.com/en-us/windows/console/setconsoletextattribute. ~E trivial. Ou pode usar uma função como essa: void text_color(int letras, int fundo) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), letras | (fundo << 4)); } // text_color Só pra ficar mais curtinho. E essas constantes // define para as cores para simplificar #define _preto_ 0 #define _azul_ 1 #define _verde_ 2 #define _ciano_ 3 #define _vermelho_ 4 #define _magenta_ 5 #define _marron_ 6 #define _cinza_claro_ 7 #define _cinza_escuro_ 8 #define _azul_claro_ 9 #define _verde_claro_ 10 #define _ciano_claro_ 11 #define _vermelho_claro_ 12 #define _magenta_claro_ 13 #define _amarelo_ 14 #define _branco_ 15 Para não ter que usar os números, porque é muito chato. Teste essa função em sua máquina: void mostra_grade_256_cores() { cls(); text_color(15, 0); /* preto sobre branco */ printf("Gabarito (Frente|Fundo) escrito na linha 5 coluna 10\n"); printf(" os numeros sao das cores que o windows usa\n\n\n"); for (int letra = 0; letra < 16; letra += 1) { for (int fundo = 0; fundo < 16; fundo += 1) { text_color(letra, fundo); printf(" %2d %2d ", letra, fundo); text_color(_branco_, _preto_); printf(" "); } text_color(_branco_, _preto_); printf(" \n"); } Por exemplo. Ela vai mostrar esse gabarito clássico E tem os números das cores pra você escolher e saber o que usar. Claro, os tempos mudaram e os programas de console hoje podem usar não 256 mas 16.7 milhões de cores. Mas isso não é importante eu acho. E pode até usar pra testar com a versão Linux Unix e as cores no terminal Nos tempos do Unix o terminal era de verdade, um terminal. E quando as core surgiram entraram no mesmo modo de programação dos atributos de vídeo. E é o mesmo modo usado pelo Virtual Terminal no Windows Terminal hoje, no Windows 10 a partir de 2018. Está documentado aqui por exemplo https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences Linux e SGR Para mudar as cores no Linux você usa essas sequências chamadas de SGR --- de Set GRaphics Rendition --- e são coisas mesmo dos velhos tempos. Mas estão aí. E voltando até em alguns casos, devido à migração dos computadores para a nuvem: muitas máquinas agora são virtuais e não tem interface gráfica... Muitas mesmo. E caras. São simples sequências de escape, como se usava naquela época também para programar o cursor e as impressoras (matriciais). Por exemplo ESC [ 31 m seleciona texto com fundo vermelho, ESC[32m escreve em verde, e provavelmente pode combinar com ESC [ 31;32m e escrever em verde sobre vermelho. Tudo é feito assim. Se mandar a letra sai a letra. Se mandar um ESC o terminal fica esperando até receber o comando todo. Lembre-se: era um terminal de verdade... Com teclado e tudo. Veja um ai Espero que tenha entendido. Se programar a console assim no Windows seu programa fica absolutamente portável. Não que eu recomende escrever programas em modo texto a menos que paguem bem ou tenha uma boa nota envolvida A programação em si é trivial e chata. adicionado 5 minutos depois ncurses, sucessora de curses, roda em Windows também. Mas é um jeito de guardar imagens de telas inteiras, janelas na console, e tratar teclado e tal. É como um gerenciador de janelas na console, para terminais em modo texto. cores e atributos, tipo reverso, sublinhado, amarelo e tal, são tratados por simples sequências de ESCape, as tais SGR, ESC depois [ depois algum comando, como descritos em https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences ou https://vt100.net/
  11. No windows cada letra num programa de console tem um atributo que dá a cor e a intensidade. No Linux e no MacOS que é Linux que um dia foi Unix não tem esse conceito de console, mas no terminal você controla os atributos em efeito para a próxima letra, como nos '80 quanto o terminal era, digamos, um terminal mesmo. No "novo" terminal do windows 10 é igual ao Unix. E os atributos são controlados por sequências de Escape estilo VT-100
  12. Escreva seu próprio "exemplo" e teste em separado. Só quer medir um intervalo. Está usando C mas marcou C++ ao abrir o tópico Pode ser algo simples como int main() { clock_t inicio = clock(); printf("Cronometro rodando. Tecle ENTER para ver o intervalo: "); getc(stdin); clock_t final = clock(); printf("Intervalo: %6.2fs\n", (double)(final - inicio) / CLOCKS_PER_SEC); return 0; } que mostra algo assim Cronometro rodando. Tecle ENTER para ver o intervalo: Intervalo: 7.18s Acho que falta só o (cast) no seu programa. Teste sempre em separado.
  13. No popular ninguém é irmão ou neto de si mesmo. Isso é o que vai controlar o loop externo, o primeiro. irmão Esse é mais simples. Você pode considerar que basta o mesmo pai ou a mesma mãe para ser irmão. Ou exigir os dois. Não está no enunciado. Então para cada elemento A você varre a lista e exceto para A num segundo loop compare se esse elemento B tem os mesmos pais e então será irmão. Os irmãos vão aparecer duas vezes na lista. O enunciado não fala nada sobre isso. avô/neto A estrutura só identifica o avô. Não o neto. Mas como um é o inverso do outro tanto faz: vai achar um par de relações, claro. Para cada A você compara com todos B exceto A. Num segundo loop, para cada B, se B for pai ou mãe de A você procura num terceiro loop todos os C exceto A e B. E se C for pai ou mãe de B então tem um avô. E se tem um avô tem um neto: A é neto de C, C é avô de A. Cuidado para seu programa não entrar em loop com essas condições. São 2 loops no primeiro caso e 3 no segundo, um dentro do outro dentro do outro. Ou eu confundi tudo
  14. Boa ideia. Bubble, Selection, Insertion e Radix são os mais intuitivos desses algoritmos. Alguns já deve ter usado sem saber o nome até.
  15. O programa de que falei está aqui https://github.com/ARFNeto-CH/ch-191128-bubble para download. Eis uma imagem É algo simples. Mas opera de dois modos e nos dois vai ver o loop em execução: É o par em amarelo na figura acima. Rode em sua máquina
  16. Isso seria para o forum de algebra, mas i+1 seria 2 quando i fosse um. Como vê na linha de cima, esse loop é executado para os valores de i entre 1 e 10 e assim você tem sua resposta... Eu postei tempos atrás um algoritmo animado desse bubble sort onde umas barrinhas coloridas vão mostrando esse loop, em duas versões. Pode procurar no meu perfil. Pode ser interessante de ver. E tem a fonte em C ou C++
  17. Mas não perguntou nadinha... int contfilmes (int cont){ FILE* arquivo = fopen("filmes.txt", "r"); char c, letra = '\n'; cont=0; while(fread (&c, sizeof(char), 1, arquivo)) { if(c == letra) { cont++; } } fclose(arquivo); return cont; } Deixou no código uma função só para abrir o arquivo e contar as linhas? Mas se você lê uma a uma as linhas no programa --- e já conta --- para que precisa disso? E se é só pra contar as linhas podia ao menos passar o nome do arquivo como parâmetro... E para que o parâmetro cont? Deixou isso no programa que entregou ? Considerando o programa que te mostrei, e que já roda copiando o arquivo da entrada para a saída, e aceitando um ou dois arquivos como parâmetro a função que expliquei e mostrei que insere na ordem no vetor, declarada assim int insere_na_ordem(int N, int V[], int T); Bastaria mudar essa rotina para usar um vetor de T linhas ao invés de T int. E ela só tem 5 instruções. E a função já colocaria o filme na posição certa. Como eu te disse, escreva seu programa em torno dos dados. Para simplificar, eis uma estrutura de dados Filmoteca que serviria: typedef struct { // a filmoteca vai ser como // todo programa em C // int argc, char** argc int T; // total de filmes char** filme; // cada um // mas vamos manter um registro da capacidade maxima // para nao ficar criando um por um mas sim bloco a // bloco int bloco; // aloca em blocos desse tamanho int capacidade; // atualizado em multiplos de bloco } Filmoteca; Só 4 campos comentadinhos: o total de filmes, quantos cabem na coleção e o ponteiro para os filmes. O bloco é o tanto que aloca por vez, tipo 1000 por vez ao invés de um por um em filme E os filmes estão claro em filme[0],filme[1]...filme[T]; Só precisaria mudar insere() para usar os filmes da Filmoteca... Algo assim: int insere_filme(char* filme, int L, Filmoteca* F); // poe 'filme' de tamanho 'L' na filmoteca 'F' E eles já entrariam na ordem e depois era só gravar na saída
  18. Se o usuário digita já é uma string e podia já ler como tal ou aceitar como argumento. Para verificar quantos dígitos tem não precisa converter para string A função está disponível no Windows no compilador da Microsotf até 2020 em stdlib https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/itoa-itow?view=vs-2019 Para os casos de decimal e hexadecimal, os mais comuns, pode usar sprintf() com o mesmo efeito
  19. mas eu mandei o código
  20. Muito bom! Mas era mais esperto já inserir na ordem ao invés de DEPOIS voltar lá e ler tudo de novo e classificar. E eu te mostrei a função ... adicionado 1 minuto depois E deixou os nomes dos arquivos fixos no programa e eu te mostrei como usar parâmetros Nem tentou ler do usuário?
  21. char filmes[17475][60]; // por exemplo, para perto de 1MB Acho que já viu a diferença certo? char[3000] cabe uma única linha... Resumindo a imagem do que escrevi ontem: A solução "ideal" escrevendo a partir dos dados: char entrada[60]; char saida[60]; int total_de_filmes; char** filmes; // e mais a funcao, alterada // para inserir uma string em um vetor de strings de tamanho T // igualzinho ao que o sistema faz para TODO programa em C int insere_na_ordem(char* filme, char* filmes[], int T); Abre o arquivo 'entrada', lê todas as linhas e usa a função para gravar no vetor A função já insere na ordem então não precisa fazer mais nada Fecha o arquivo 'entrada' abre o arquivo 'saida' grava todos os filmes na saída e vai liberando a memória de cada um porque não vai usar mais fecha o arquivo de saída hora do lanche bonus Escreva seu programa aos poucos, e sempre em torno dos dados. Eis a saída de um programa que roda como x entrada saida que grava o conteúdo do arquivo entrada no arquivo saida e mostra na tela as linhas e o tamanho de cada uma. Se não der nenhum parâmetro ele tenta copiar 'filme.txt' em 'temp.txt' Arquivo de entrada: filmes.txt Arquivo de saida: temp.txt [34] LITTLE MAN TATE,1991,JODIE FOSTER [25] STUCK,2007,STUART GORDON [36] DANGEROUS GROUND,1997,DARRELL ROODT [26] ENIGMA,2001,MICHAEL APTED [30] FLASH GORDON,1980,MIKE HODGES rodando com o seu exemplo, claro, que eu não ficar digitando O programa #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char** argv) { // entrada char* arquivo = "filmes.txt"; char entrada[80]; strcpy(entrada, arquivo); if (argc > 1) strcpy(entrada, argv[1]); printf("Arquivo de entrada: %s\n", entrada); // saida char* arquivo_saida = "temp.txt"; char saida[80]; strcpy(saida, arquivo_saida); if (argc > 2) strcpy(saida, argv[2]); printf("Arquivo de saida: %s\n", saida); FILE* F = fopen(entrada,"r"); FILE* O = fopen(saida,"w"); int N = 60; // maior tamanho de linha char linha[60]; if (F == NULL) return -1; while (fgets(linha, N, F) != 0) { printf("[%2d] %s", strlen(linha), linha); fwrite(linha, strlen(linha), 1, O); }; fclose(F); return 0; }; // fim Trocando o printf() pela chamada a insere() e acertando a criação inicial do vetor de filmes você tem o seu programa
  22. veja esse exemplo, que digitei em cima do seu programa agora, na ordem em que te falei há pouco: Mostra Lista nao alocada 0 1 0 2 1 0 3 2 1 0 4 3 2 1 0 Para #include<stdio.h> #include<stdlib.h> struct stTLDE { int dados; struct stTLDE* ant; struct stTLDE* prox; }; typedef struct stTLDE TLDE; TLDE* insere_no_inicio(int,TLDE*); int mostra(TLDE*); int main() { TLDE* lista = NULL; mostra(lista); for (int i = 0; i < 5; i += 1) { lista = insere_no_inicio(i, lista); mostra(lista); }; return 0; }; TLDE* insere_no_inicio(int E, TLDE* L) { TLDE* novo = (TLDE*)malloc(sizeof(TLDE)); novo->dados = E; novo->prox = L; if(L!=NULL) L->ant = novo; return novo; }; int mostra(TLDE* L) { if (L == NULL) { printf("Lista nao alocada\n"); return -1; }; while (L != NULL) { printf("%d ", L->dados); L = L->prox; }; // while() printf("\n"); return 0; }; //fim adicionado 2 minutos depois O modo como ele fez não está nada bom. Nesse que escreveu acho que faltou o typedef adicionado 22 minutos depois inserir no fim não é muito diferente: Só é um pouco maior porque tem o caso de a lista estar vazia e porque não declarou a lista como eu mostrei, mantendo alguns parâmetros como o tamanho, o limite e o endereço de início e de fim... Assim precisa varrer a lista toda para achar o fim... TLDE* insere_no_final(int E, TLDE* L) { TLDE* novo = (TLDE*)malloc(sizeof(TLDE)); novo->dados = E; novo->prox = NULL; // sempre no fim if (L == NULL) { novo->ant = NULL; return novo; }; TLDE* raiz = L; // vai ate o fim ja que nao tem o ponteiro while (L->prox != NULL) L = L->prox; L->prox = novo; novo->ant = L; return raiz; };
  23. Antes de tudo inclua isso no seu programa struct stTLDE { int dados; struct TLDE* prox; }; typedef struct stTLDE TLDE; porque do jeito que declarou está errado insere() estava ok do jeito que estava antes como escreveu com 5 linhas. faltava so retornar o valor e tirar O **
  24. People can write nonsense stuff in any language. Esqueça. scanf() foi escrita para tratar entrada formatada --- scan formatted input --- e não para ler do teclado. É uma rotina poderosa, mas acabou sendo usada para ler entrada do teclado, que é tudo menos formatada --- free form, o cara digita o que quiser --- e a mecânica sequer é explicada direito pelos instrutores pelo visto, e em geral nem pelos livros. "%[^\n]" Esse é um caso de um modificador genérico. Se você usasse %[12345] scanf() aceitaria um grupo desses caracteres e pararia no primeiro diferente. Se você usasse %[^123X45] scanf() aceitaria tudo até ver um desses símbolos. Se você usasse um número antes limitaria o tamanho da string a ser lida, contrariando o texto citado. "'\n' remains in stdin " não conta a história toda: scanf() é uma rotina ativa: ela consome dados da entrada e para em um tab espaço ou newline. O que não foi consumido fica no buffer. Trata-se na noção de stream, que é o caso de stdin ou de arquivos desse tipo: eles tem um buffer. Uma rotina não pode excluir nada do buffer. Um '\n'não é lixo. Limpar o buffer como já li aqui pode não nada certo. Imagine várias rotinas lendo do mesmo arquivo por exemplo... scanf() retorna o número de valores lidos e deveria ser usado SEMPRE e é raro se ver isso em programas de estudantes e mesmo de profissionais... É uma longa história, mas não é essa que viu nesse texto aí. Eu postei muitos exemplos de uso de scanf() aqui, acho que pode consultar clicando no meu nome. De todo modo entenda que essas rotinas não foram escritas para ler do teclado. Se quer ler do teclado com controle a solução é conhecida: leia letra a letra, mas não mostre monte uma string com o valor lido de acordo com o que precisa ler só mostra a letra e avança o cursor se era algo válido ao terminar o campo converta para o formato desejado, tipo string, float, inteiro...
  25. Em 4 linhas não dá pra ter muito estilo senhor foi mal Isso foi engraçado... Foi você que escreveu esse código que insere no fim. E seu professor escreveu o que insere no começo. o que eu te mostrei foi uma declaração diferente de Lista. Mais "séria" digamos. Mas não postei nenhuma implementação e você não disse se entendeu a diferença Compilar nada ou pouco quer dizer. Mas você não pode ir mudando os tipos sem pensar. Não mexa em nada enquanto a lista não estiver certinha. O que houve com sua função? TLDE* inserir_no_fim( TLDE*p , float elem) { TLDE *raiz = p; TLDE* pTemp = (struct TLDE*)malloc(sizeof(struct TLDE*)); pTemp->dados = elem; pTemp->prox = NULL; if(!raiz) return pTemp; else { TLDE* pPar = p; while(p->prox) { p=p->prox; } p->prox =pTemp; return raiz; } } Ela cresceu pra caramba, bem depois de eu dizer que não só precisava retornar o nó. E aquela parte em que eu escrevi para não mudar uma linha sequer sem um motivo? Sua função agora tem dois return????? Sério? Pense bem: ou o que é uma lista final? Qual o significado de raiz e inserir no início? Esta complicando demais... Eis como se implementa uma lista, ao menos um estudante: primeiro a função mostra(Lista*) que mostra na tela um a um os caras da lista depois a função cria() que cria a lista depois a função insere() que... insere Você não sai escrevendo mil funções. E você nem tem a mostra() que era pra ser a primeira. Isto está quase certo: TLDE *insere(TLDE** l, int elem) { TLDE* temp = novaLista(elem); temp->prox = *l; (*l)->ant = temp; (*l) = temp; } Nem li a que escreveu depois. Muito complicado. Com DOIS return para inserir no início não pode estar bom. Pense assim: quer inserir no INÍCIO e a lista é struct TLDE { int dados; struct TLDE* prox; }; typedef struct TLDE Lista; Não sei de quem foi a ideia de usar esse nome folclórico, mas para mim Lista é Lista. Mais importante: TLDE é uma struct então TODAS as declarações teriam que ter a palavra struct porque TLDE não é um tipo... Eu te mostrei uma maneira bem melhor do que essa que seu professor usou e você tentou usar...

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!