Ir para conteúdo

POWERED BY:

Arquivado

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

VitãoOGrande

[Resolvido] Listas Encadeadas

Recommended Posts

Fala pessoal, eu estou desenvolvendo um projeto de faculdade, onde o objetivo é criar um programa utilizando "Listas Encadeadas" para Cadastro de Livros em uma biblioteca.

Só que ao começar a desenvolver o programa surgiu diversas dúvidas.

Antes de mais nada irei postar aqui o código do programa, assim pode ficar mais facil de voces me ajudarem:

 

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

// (INICIO) Estrutura para cadastrar livros
typedef struct cadastrar_livros
{
   char titulo[50], assunto[200], autor[50];
   int numero_registro;
   struct cadastrar_livros *proximo;
}lista;
// (FIM) Estrutura para cadastrar livros

main ()
{
   lista *inicio = NULL, *auxiliar;
   int cont = 1, cont2, escolha, flag;
   char resposta = 'S', busca[50];

   printf ("- BIBLIOTECA -\n");

   // (INICIO) Opções para o usuário
   do
   {
      printf ("\n- OPCOES -");
      printf ("\n   1 - Inclusao de novos livros.");
      printf ("\n   2 - Remocao de livros.");
      printf ("\n   3 - Alteracao de informacoes.");
      printf ("\n   4 - Busca de um livro.");
      printf ("\n   5 - Listagem de todos os livros.");
      printf ("\n   0 - Sair.");
      printf ("\nEscolha a opcao que deseja realizar? ");
      scanf ("%d", & escolha);

      switch (escolha)
      {
         case 1:
            // (INICIO) Cadastrando livros
            printf ("\n- INCLUSAO DE NOVOS LIVROS -");

            do
            {
               auxiliar = (lista*) malloc (sizeof (lista));

               printf ("\nDigite o titulo do livro %d: ", cont);
               fflush(stdin);
               gets(auxiliar -> titulo);
               fflush(stdin);

               printf ("Digite o assunto do livro %d: ", cont);
               fflush(stdin);
               gets(auxiliar -> assunto);
               fflush(stdin);

               printf ("Digite o nome do autor do livro %d: ", cont);
               fflush(stdin);
               gets(auxiliar -> autor);
               fflush(stdin);

               auxiliar -> proximo = NULL;

               if (inicio == NULL)
               {
                  inicio = auxiliar;
               }
               else
               {
                  auxiliar -> proximo = inicio;
                  inicio = auxiliar;
               }

               printf ("\nDeseja cadastrar mais um livro? Sim (S) | Nao (N): ");
               scanf ("%c", & resposta);
               fflush(stdin);

               cont++;
            } while ((resposta == 'S') || (resposta == 's'));
            // (FIM) Cadastrando livros
         break;

         case 2:
            // (INICIO) Removendo livros
            
            // (FIM) Removendo livros
         break;

         case 4:
            // (INICIO) Buscando livros
            printf ("\n- BUSCA DE UM LIVRO -");

            printf ("\nDigite o livro a ser procurado: ");
            fflush(stdin);
            gets (busca);
            fflush(stdin);

            flag = 0;
            auxiliar = inicio;

            while ((flag = 0) && (auxiliar != NULL))
            {
               if (auxiliar -> titulo == busca)
               {
                  flag = 1;
               }
               auxiliar = auxiliar -> proximo;
            }

            if (flag == 0)
            {
               printf ("O livro que voce procura nao foi encontrado.\n");
            }
            else
            {
               printf ("O livro que voce procura foi encontrado\n.");
            }
            // (FIM) Buscando livros
         break;

         case 5:
            // (INICIO) Exibindo Listagem dos Livros
            printf ("\n- LISTAGEM DE TODOS OS LIVROS -");
            cont2 = cont - 1;

            auxiliar = inicio;
            do
            {
               printf ("\nlivro %d -> %s", cont2, auxiliar -> titulo);
               auxiliar = auxiliar -> proximo;
               cont2--;
            }while (auxiliar != NULL);
            printf ("\n");
            // (FIM) Exibindo Listagem dos Livros
         break;
      }

   } while (escolha != 0);
   // (FIM) Opções para o usuário

   printf ("\n");
   system ("pause");
}

Bem, na execução deste programa, as funções de Inclusão de novos livros e exibição de novos livros estão funcionando perfeitamente.

Só que a busca de livros esta com problema e não consigo identificar o erro.

E as opções de remover livros e alterar informações dos livros eu não sei como fazer.

 

Desde de já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom antes da gente começar a ajuda de uma lidinha nesse tópico em especial:

http://forum.imasters.com.br/index.php?/topic/336835-tutorial-systempause-e-fflushstdin/

 

[]s

 

---

Título Editado:

 

DÚVIDAS - Trabalho de Faculdade http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Listas Encadeadas

Compartilhar este post


Link para o post
Compartilhar em outros sites
fflush(stdin);
gets(auxiliar -> assunto);
fflush(stdin);

 

1- Não use fflush(stdin). C99, fflush serve só p/ stdout (ou streams de saída) e o comportamento p/ streams de entrada é indefinido. E não, não interessa se no windows funciona e o professor usa.

 

2- Não use gets pelo simples fato de ser possível estourar a pilha e sobrescrever 2 registradores: o ebp e o eip. E nem precisa de muito esforço p/ colocar 0x0 no eip e gerar falha de segmentação; um pouco mais e você é capaz de sequestrar o root do sistema. No C1X vão retirar a função (graças a Deus).

 

3- Também não use system('pause'). Pela cara você está usando Dev C/C++. Troque por Eclipse, Netbeans, CodeBlocks ou Geany. Ou pegue um live cd do ubuntu e instale numa maquina virtual.

 

 

isis@isis-desktop:~/src/imasters$ gcc -Wall -Wextra p8.c

p8.c:14: warning: return type defaults to ‘int’

p8.c: In function ‘main’:

p8.c:139: warning: control reaches end of non-void function

/tmp/ccL64hec.o: In function `main':

p8.c:(.text+0x12d): warning: the `gets' function is dangerous and should not be used.

 

 

Não use números mágicos num menu. Defina macros ou um enum com algum nome significativo.

 

O nome da estrutura p/ os livros tem o nome de uma operação...Isso não é bom.

 

É int main e deve ser explícito, inclusive com um return no final da função.

 

Evite ficar separando símbolos.

 

Trate o caso de opções inválidas com uma mensagem.

 

 

"Digite o livro a ser pesquisado" não dá muita informação sobre qual campo é usado na pesquisa...

 

Sempre libere a memória que foi alocada no programa.

 

 

Só que a busca de livros esta com problema e não consigo identificar o erro.

 

P/ isso se usa um depurador, que, incrivelmente, parece ser algo desconhecido dos professores de faculdade. Porque é realmente muito estranho alguém estar mexendo com ponteiros e não saber como observar os problemas que acontecem no código.

 

 

E as opções de remover livros e alterar informações dos livros eu não sei como fazer.

 

Remova um nó da lista e sobrescreva o que já existe no nó...

 

 

 

- OPCOES -

1 - Inclusao de novos livros.

2 - Remocao de livros.

3 - Alteracao de informacoes.

4 - Busca de um livro.

5 - Listagem de todos os livros.

0 - Sair.

Escolha a opcao que deseja realizar? 1

 

- INCLUSAO DE NOVOS LIVROS -

Digite o titulo do livro 1: Digite o assunto do livro 1:

 

 

- OPCOES -

1 - Inclusao de novos livros.

2 - Remocao de livros.

3 - Alteracao de informacoes.

4 - Busca de um livro.

5 - Listagem de todos os livros.

0 - Sair.

Escolha a opcao que deseja realizar? 4

 

- BUSCA DE UM LIVRO -

Digite o livro a ser procurado: O livro que voce procura nao foi encontrado.

 

 

O Buffer tem um \n sendo lido. Limpe.

 

 

- OPCOES -

1 - Inclusao de novos livros.

2 - Remocao de livros.

3 - Alteracao de informacoes.

4 - Busca de um livro.

5 - Listagem de todos os livros.

0 - Sair.

Escolha a opcao que deseja realizar? 5

 

- LISTAGEM DE TODOS OS LIVROS -

Falha de segmentação

 

Use o depurador aqui.

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <stdbool.h>
#include <string.h>

#define MAX_TITULO 50
#define MAX_ASSUNTO 200
#define MAX_AUTOR 50

typedef struct st_livros {
char titulo[MAX_TITULO], assunto[MAX_ASSUNTO], autor[MAX_AUTOR];
int numero_registro;
struct st_livros *proximo;
}lista;


int main () {


enum {
INSERIR = 1,
REMOVER = 2,
ALTERAR = 3,
PESQUISAR = 4,
LISTAR = 5,
SAIR = 0
};


lista *inicio = (lista *)malloc(0);

if (inicio == NULL) {
perror("malloc inicial");
return 1;
}

int idx_livro = 0, escolha;
char str_busca[MAX_TITULO];
char continuar;

puts("- BIBLIOTECA -");

do {
puts("- OPCOES -");
printf(" %d - Inclusao de novos livros.\n", INSERIR);
printf(" %d - Remocao de livros.\n", REMOVER);
printf(" %d - Alteracao de informacoes.\n", ALTERAR);
printf(" %d - Busca de um livro.\n", PESQUISAR);
printf(" %d - Listagem de todos os livros.\n", LISTAR);
printf(" %d - Sair.\n", SAIR);
printf("\nEscolha a operação que deseja realizar:");
scanf("%d", &escolha);

if (escolha < SAIR || escolha > LISTAR) {
	puts("Opção inválida.");
} else {

	switch(escolha){

	case INSERIR:
	do {

	inicio = (lista *)realloc(inicio, (idx_livro + 1) * sizeof(lista));
	if (inicio == NULL) {
	perror("realloc inserção");
	return 1;
	}
	inicio[idx_livro].proximo = NULL;

	puts("- INCLUSÃO DE NOVOS LIVROS -");

	printf("Digite o título do livro %d: ", idx_livro + 1);
	fgets(inicio[idx_livro].titulo, MAX_TITULO, stdin);

	printf ("Digite o assunto do livro %d: ", idx_livro + 1);
	fgets(inicio[idx_livro].assunto, MAX_ASSUNTO, stdin);

	printf ("Digite o nome do autor do livro %d: ", idx_livro + 1);
	fgets(inicio[idx_livro].autor, MAX_AUTOR, stdin);

	idx_livro++;

	printf("Deseja cadastrar mais um livro? (s/n): ");
	scanf("%c", &continuar);
	} while (tolower(continuar) == 's');
	break;


	case REMOVER:
	break;


	case ALTERAR:
	break;


	case PESQUISAR:

	if (idx_livro == 0) {
	puts("Não é possível realizar a operação. Cadastre algum livro primeiro.");
	} else {
	puts("\n- BUSCA DE UM LIVRO -");
	printf("\nDigite o título do livro a ser procurado: ");
	fgets(str_busca, MAX_TITULO, stdin);

	bool encontrado = false;

	for(int i=0; i< idx_livro; i++) {
	if (strcoll(inicio[i].titulo, str_busca) == 0) {
	printf("\n[ Título: %s ]", inicio[i].titulo);
	printf("\n[ Autor: %s ]", inicio[i].autor);
	printf("\n[ Assunto: %s ]", inicio[i].assunto);
	encontrado = true;
	}
	}

	if (!encontrado) {
	puts("\nNenhum livro encontrado.");
	}
	}
	break;


	case LISTAR:
	for(int i = 0; i < idx_livro; i++) {
	printf("[Título: %s ]", inicio[i].titulo);
	printf("[Autor: %s ]", inicio[i].autor);
	printf("[Assunto: %s ]", inicio[i].assunto);
	}

	if (idx_livro == 0) {
	puts("\nNão existem livros cadatrados.");
	}
	break;
	}

}

} while(escolha != SAIR);

free(inicio);
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.