Ir ao conteúdo
  • Cadastre-se

listas encadeada


kindurys

Posts recomendados

Eu gravei o conteudo dos campos de uma struct em uma lista encadeada e gravei num arquivo. agora estou com uma duvida: quando eu executar novamente o programa e carregar esse arquivo para onde essas informações serao passadas?? e tem como eu usar uma funcao random() na lista encadeada?

/* PROGRAMA QUE INSERE DADOS EM UMA LISTA E SALVA EM ARQUIVO */
/* ESSE PROGRAMA TEM POR FINALIDADE ENTRAR COM DADOS DO USUARIO*/
/* ORDENA-LOS EM UMA LISTA E SALVA-LOS EM ARQUIVO*/


/* FUNCAO ENTER() RESPONSAVEL POR ENTRAR COM O DADO NA LISTA ENCADEADA */
/* FUNCAO SAVE() RESPONSALVEL POR SALVAR A LISTA NO ARQUIVO ESPECIFICADO */
/* FUNCAO LOAD() RESPONSAVEL POR ABRIR O ARQUIVO E CARREGAR NA LISTA ENCADEADA */
/* FUNCAO LIST() RESPONSALVEL POR LISTAR A LISTA ENCADEADA */
/* FUNCAO SLS_STORE() RESPONSµVEL POR ARMAZENAR ORDENADAMENTE NA LISTA */



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

struct address {
 char codigo[30];
 char name[40];
 char telefone[20];
 struct address *next; /* ponteiro para o proximo registro  */
} list_entry;


struct address *start;  /* ponteiro para a primeira entrada
        da lista */
struct address *last;  /* ponteiro para a £ltima entrada */

void enter(void), save(void);/*prototipa‡Æo das rotinas usadas no programa */

void load(void), list(void);

void sls_store(struct address *i, struct address **start,
   struct address **last);

void inputs(char *, char *, int), display(struct address *);

int menu_select(void);

void main(void)
{
 start = last = NULL;  /* inicializa os ponteiros de topo
        e fundo */
 load();

 for(; {
 switch(menu_select()) {
 case 1: enter();    /*insere os componentes na lista*/
   break;
 case 2: list();     /*imprime a lista na tela*/
   break;
 case 3: save();     /* grava a lista no disco */
   break;
 case 4: exit(0);    /*Sai do Programa */
 }
 }
}

/* Seleciona uma opera‡ao. */
menu_select(void)
{
 char s[80];
 int c;

 printf("1. Inserir um nome\n");
 printf("2. Listar o arquivo\n");
 printf("3. Gravar o arquivo\n");
 printf("4. Sair\n");
 do {
 printf("\nEntre com sua opcao: ");
 gets(s);
 c =atoi(s);
 } while(c<0 || c>6);
 return c;
}

/* Insere codigo nome e telefone */
void enter(void)
{
 struct address *info;

 for(; {
 info = (struct address *)malloc(sizeof(list_entry));
 if(!info) {
 printf("\nsem mem¢ria");
 return;
 }
 inputs("Entre com o codigo: ", info->codigo, 30);
 inputs("Entre com o nome: ", info->name, 40);
 inputs("Entre com o telefone: ", info->telefone, 20);
 sls_store(info, &start, &last);
 break;

 } /* la‡o de entrada */
}

/* Esta fun‡ao lˆ uma string de comprimento m ximo count e evita que
a string seja ultrapassada. Ela tamb‚m apresenta uma mensagem de prompt. */

void inputs(char *prompt, char *s, int count)
{
 char p[255];

 do {
 printf(prompt);
 gets(p);
 if(strlen(p)>count) printf("\nMuito comprido\n");
 } while(strlen(p)>count);
 strcpy(s, p);
}

/* Cria uma lista simples encadeada ordenada */

void sls_store(struct address *i, struct address **start, struct address **last)

{

struct address *old, *p;

p=*start;
if(!*last)
{
i->next=NULL;
*last=i;
*start=i;
return;
}

old=NULL;
while(p)
{
if(strcmp(p->name, i->name)<0){
 old=p;
 p=p->next;
}
else {
 if(old){
 old->next=i;
 i->next=p;
 return;
}
i->next=p;
*start=i;
return;
}
}
(*last)->next=i;
i->next=NULL;
*last=i;
}


/* Mostra a lista completa */
void list(void)
{
 struct address *info;
 info = start;
 while(info) {
 display(info);
 info = info->next;  /* obt‚m pr¢ximo endere‡o */
 printf("Press to the next field..\n");
 getch();
 }
 printf("\n\n");

}

/* Esta fun‡ao imprime os campos de cada endere‡o. */
void display(struct address *info)
{
 printf("%s\n", info->codigo);
 printf("%s\n", info->name);
 printf("%s\n", info->telefone);
 printf("\n");
// getch();
}

/* Salva o arquivo em disco. */
void save(void)
{
 struct address *info;
 FILE *fp;
 fp = fopen("mlist", "wb");

 if(!fp) {
 printf("arquivo não pode ser aberto\n");
 exit(1);
 }
 printf("\nsalvando arquivo\n");

 info = start;
 while(info) {
 fwrite(info, sizeof(struct address), 1, fp);
 info = info->next; /* obt‚m pr¢ximo endere‡o */
 }
 fclose(fp);
}

/* Carrega o arquivo de dados. */
void load()
{
 struct address *info;
 FILE *fp;
 fp = fopen("mlist", "rb");
 if(!fp) {
 printf("arquivo não pode ser aberto\n");
 exit(1);
 }
 /* libera qualquer mem¢ria previamente alocada */
 while(start) {
 info = start->next;
 free(info);
 start = info;
 }

 /* reinicializa os ponteiros de in¡cio e fim */
 start = last = NULL;

 printf("\nCarregando arquivo\n");
 while(!feof(fp)) {
 info = (struct address *) malloc(sizeof(struct address));
 if(!info) {
 printf("sem mem¢ria");
 return;
 }
 if(1!=fread(info, sizeof(struct address), 1, fp)) break;
 sls_store(info, &start, &last);
 }
 fclose(fp);
}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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...