Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Help - Lista encadeada com arquivo


bake

Pergunta

E ai galera...

Estou tendo alguns problemas, o programa é o seguinte(em C). Ler um arquivo txt, e inserir os valores do arquivos em uma lista encadeada... Podendo depois remover da lista ou inserir na lista...

Quem poder ajudar, posta ai...

Grato...

Editado por bake
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Achei esse codigo, q faz tudo certinho ler do txt e grava na lista. Agora preciso de uma função inserir e remover para essa lista... para fazer o menu.

#include <cstdlib>
#include <iostream>
#include <stdio.h>

typedef struct tlista{
        int n;
        tlista *prox;
};

tlista *lu_insereinicio(tlista *plst, int pn)
{
       tlista *aux;
       aux = (tlista*)malloc(sizeof(tlista));
       aux -> n = pn;
       aux -> prox = plst;
       return aux;
}

void lu_exibelista(tlista *plst)
{
     tlista *aux = plst;

     while (aux != NULL)
     {
           printf("\n%d ", aux -> n);
           aux = aux -> prox;
     }
}

int main()
{
    int num; // ESTE É O NUMERO QUE SERÁ LIDO DO ARQUIVO E PASSADO PARA A LISTA
    tlista *list; // ESTOU CRIANDO A LISTA, NADA DE NOVO
    list = NULL;
    FILE *arquivo; // REFERENCIA DO ARQUIVO, SEMPRE QUE FOR UTILIZAR O ARQUIVO
                   // SERA REFERENDIDO-SE PELO arquivo
    arquivo = fopen("arq.txt","r"); // O FOPEN ABRE O ARQUIVO, NO CASO
                                        // É PASSADO POR PARAMETRO O ENDEREÇO
                                        // DO ARQUIVO, E O "r" SIGNIFICA QUE
                                        // O ARQUIVO ESTÁ SENDO ABERTO APENAS
                                        // PARA LEITURA

    if (arquivo) // CASO não TENHA DADO ERRO AO ABRIR O ARQUIVO
       {
           do
             {
                fscanf(arquivo,"%d",&num ); // O FSCANF É IDENTICO AO SCANF QUE
                                            // TODOS CONHECEM, PORÉM ELE É
                                            // UTILIZADO PARA LER DADOS DE
                                            // ARQUIVOS, E É PASSADO COMO
                                            // PARAMETRO, O PROPRIO ARQUIVO
                                            // QUE ESTA SENDO LIDO
                list = lu_insereinicio(list, num); // INSERE O NUMERO NA LISTA
             }while(!feof(arquivo)); // ELE PERCORRERÁ TODAS AS LINHAS DO ARQUIVO
                                     // ENQUANTO O ARQUIVO não CHEGAR AO FIM
                                     // FEOF = END OF FILE
         }

    lu_exibelista(list); // EXIBE A LISTA
    fclose(arquivo); // FECHA O ARQUIVO
    printf("\n");
    system("pause");
}

Link para o comentário
Compartilhar em outros sites

  • 0

Estou usando o Dev, e salvando normal ".cpp".

O programa só precisa do arquivo para inserir os valores na lista... depois você tem q trabahar com a lista só.

Inserir na lista mesmo, qualquer lugar dela, e remover do inicio ou fim, tanto faz..

Grato...

Link para o comentário
Compartilhar em outros sites

  • 0

pelo que estou vendo você quer cria uma funcão inserir e outra remove você pode fazer o inserir com o fgets (para enviar string para o arquivo) apos digitar uma mensagem vai ser salvo dentro do arquivo

já o remove você pode simplismente deleta o arquivo.txt e recriar o arquivo

não vou postar codigos de exemplo por que estou sem tempo para escrever já vou sair desculpe ...

Editado por ce1o2e
Link para o comentário
Compartilhar em outros sites

  • 0
pelo que estou vendo você quer cria uma funcão inserir e outra remove você pode fazer o inserir com o fgets (para enviar string para o arquivo) apos digitar uma mensagem vai ser salvo dentro do arquivo

já o remove você pode simplismente deleta o arquivo.txt e recriar o arquivo

não vou postar codigos de exemplo por que estou sem tempo para escrever já vou sair desculpe ...

Se eu entendí bem, o que o bake quer é inserir e remover elementos da lista que está na RAM, depois que ela foi carregada... Não deixou a entender que queria atualizar o arquivo.

A função de inserção no início já está implementada no código que você postou. Enquanto as funções de inserção nas demais posições você vai precisar de uma repetição que acontece até que a posição que se deseja seja encontrada. Se o elemento procurado for o último, a condição da repetição é semelhante a esta:

while (aux->next != NULL) { aux = aux->prox; } //  deixando [i]aux[/i] apontando para o último nó da lista.
Alternativamente, você pode fazer a função de inserção ser recursiva ao invés de usar o while, a função chamará a sí mesma passando como parâmetro o próximo nó da lista enquando seu ponteiro prox apontar para algo diferente da condição de repetição. Finalmente, a inserção pode ser feita com:
tlista *aux2;
aux2 = (tlista *)malloc(sizeof(tlista));
aux2->prox = aux->prox;
aux2->n = numeroDesejado;
aux->prox = aux2;
Enquanto às remoções:
// REMOÇÃO NO MEIO E NO FIM DA LISTA:
// aux é ponteiro para uma posição imediatamente antes da posição do elemento a ser retirado
aux2 = aux->prox; // aux2 = nó a ser retirado
aux->next = aux2->prox; // remove o nó
free(aux);


// REMOÇÃO NO COMEÇO DA LISTA:
aux = ponteiroDaLista; // sendo ponteiroDaLista o ponteiro para o primeiro elemento da lista
ponteiroDaLista = ponteiroDaLista->prox; // retira o elemento
free(aux); // libera a memória do elemento retirado

A busca por um elemento através de seu índice pode ser feita de modo similar ao que mostrei para inserção.

Céus, espero que não tenha ficado confuso!

Editado por == Douplus ==
Link para o comentário
Compartilhar em outros sites

  • 0

Seguinte, o algoritmo q eu deixei, está fazendo o seguinte, ler o arquivo e insere os dados do arquivos na lista.

No txt tinha: 1,2,3,4,5, ele grava 1,2,3,4,5 na lista.

Agora esquece o arquivo, tenho q trabalhar com a lista, cria um menu pra inserir mais dados na lista, e um remover, tanto faz no inicio ou final da lista.

== Douplus ==

Eu entendi, estou tentando colocar isso no codigo acima...

ce1o2e

Entendeu?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...