Ir para conteúdo

POWERED BY:

Arquivado

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

Ivo Ferreira

[Resolvido] Erro em lista ligada

Recommended Posts

estou fazendo um trabalho para a faculdade apesar d no momento esta desorganizado, não estou conseguindo imprimir lista só que na hora de imprimir o nome, aparece sujeira de memoria alguem sabe me informar o pq e como resolvo isso

obrigado.

 

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
//lista
struct no {
	struct no *prox;
	int info;
	char nome[30];
};
typedef struct no Lista;
//cria lista
void cria (Lista **inicio, Lista **fim)
{
	*inicio=NULL;
	*fim=NULL;
}
//inserir inicio
void Ins_Inicio (Lista **inicio, Lista **fim, int v, char n[30])
{
	Lista *p = (Lista *)calloc(1,sizeof(Lista));
	p->info = v;
	p->nome[30] = n[30];
	p->prox = *inicio;
	if (*inicio==NULL)
		   *fim=p;
	*inicio=p;
}
//inserir meio
int Ins_Meio (Lista **L, int v, int v2 ,char n[30])
{
	 Lista *p, *q, *r;
	 p = (Lista *)calloc (1, sizeof(Lista));
	 
	 p->info = v;
	 p->nome[30] = n[30];
	 p->prox = NULL;
	 if (*L==NULL)
		*L=p;
	 else
	 {
		 r = *L;
		 q = *L;
		 while (q->info != v2){
		 r=q;
		 q=q->prox;
		 }
	 p->prox=q;
	 r->prox=p;
	 }
}
//imprimir
void Imprime (Lista *inicio)
{
	Lista *p;
	if (inicio==NULL)
	   printf("\nLista vazia!!");
	else
	{
	   p=inicio;
	   while (p != NULL)
	   {
		printf ("ID:%d\nnome: %s\n",p->info, p->nome);
		p=p->prox;
	   }
	}
	getch();
}
//inserir no fim
void Ins_Fim (Lista **L, int v, char n[30])
{
	 Lista *p, *q;
	 p = (Lista *)calloc (1, sizeof(Lista));
	 p->info = v;
	 p->nome[30] = n[30];
	 p->prox = NULL;
	 if (*L==NULL)
		*L=p;
	 else
	 {
		 q = *L;
		 while (q->prox != NULL)
			   q=q->prox;
		 q->prox = p;
	 }
}
//remover do inicio
int Rem_Inicio (Lista **L, int *v)
{
	Lista *p;
	int flag=0;
	if (*L!=NULL)
	{
	   p=*L;
	   *L=p->prox;
	   *v=p->info;
	   free(p);
	   flag=1;
	}
	return flag;
}
//remover do fim
int Rem_Fim (Lista **L, int *v)
{
	int flag=0; Lista *p, *q;
	if (*L!=NULL)
	{
	   p=*L;
	   if (p->prox==NULL)
		  *L=p->prox;
	   else
	   {
		   while(p->prox!=NULL)
		   {
			  q=p;
			  p=p->prox;
		   }
		   q->prox=NULL;
	   }
		   *v=p->info;
		   free(p);
		   flag=1;
	}
	return flag;
}
//inicio do programa
int main()
{
	Lista *inicio, *fim, *ret;
	int val, op, val2;
	char resp, n[30];
	cria (&inicio, &fim);
	   do
	   {
		printf("1. I in¡cio\n2. I fim\n3. R Inicio\n4. R Fim\n5. I Meio\n6. Listar\n7. Sair\n");		
		scanf("%d",&op);
	   switch (op)
	   {
		  case 1: printf("Valor => ");
			  scanf("%d",&val);
			  printf("Nome:\n");
			  fflush(stdin);
			  gets(n);
			  Ins_Inicio(&inicio, &fim,val ,n);
			  break;
		  case 2: printf("Valor => ");
			  scanf("%d",&val); 
			  printf("Nome:\n");
			  fflush(stdin);
			  gets(n);
			  Ins_Fim(&inicio, val ,n);
			  break;
		  case 3: Rem_Inicio(&inicio, &val);
			  break;
		  case 4: Rem_Fim(&inicio, &val);
			  break;
		  case 5: printf("Valor a ser inserido ");
				  scanf("%d",&val);
				  printf("\nNome a ser inserido ");
				  fflush(stdin);
				  gets(n);
				  printf("\nAntes de qual valor ");
				  scanf("%d",&val2);
				  Ins_Meio(&inicio, val, val2 ,n);
			  break;
		  case 6: Imprime(inicio);break; 
		  }
	} while (op!=7);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, tudo certo?

 

Cara, não li muito do seu código não...

mas logo na inserção ja encontrei um problema: :/

p->nome[30] = n[30];
você está fazendo uma atribuição de chars, que por sinal nem existem! (um array de 30 elementos varia de: arr[0] até arr[29])

mude para:

p->nome = n;
mude as declarações das funções também:

void Ins_Inicio (Lista **inicio, Lista **fim, int v, char n[30])

para:

void Ins_Inicio (Lista **inicio, Lista **fim, int v, char *n)

Posso ser chato??

Pra que você tem algo que aponta para o final da lista? ^_^

 

NÃO USEM FFLUSH(STDIN)!!! leia: http://forum.imasters.com.br/index.php?showtopic=336835

 

E sua função main não retorna nada, o que está errado!

Em caso de sucesso ela deve retornar 0.

 

Abraços!

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz o que você informou e ocorreu o seguinte erro:

 

incompatible types in assignment of char to char[30]

 

e estou lendo aqui o seu artigo parece interessante obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro...

O compilador ta certo, erro meu. ^_^^_^

 

Esqueci que na estrutura nó a memória ja está alocada para "nome".

 

faça:

strcpy(p->nome, n);

a declaração da função:

void Ins_Inicio (Lista **inicio, Lista **fim, int v, char *n)

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

as vzs no escopo da função eu tbm faço assim:

void qlqr_coisa(char n[])

Compartilhar este post


Link para o post
Compartilhar em outros sites

1º curiosidade em que biblioteca esta a o comando strcpy,

 

2ºno caso o fflush(stdin) eu uso para liberar a memoria talvez eu tenha lido rápido o seu artigo, e não vi outro comando para limpar a memoria

 

3º eu tenho a lista apontado para o final nem sei te dizer o pq, a va*** da professora ela só manda copiar os códigos dela e quando tentamos fazer da esta m***** toda ae..

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

as vzs no escopo da função eu tbm faço assim:

void qlqr_coisa(char n[])
Eu não sabia que o compilador aceitava! :P

aprendi outra!

 

1º curiosidade em que biblioteca esta a o comando strcpy

#include <string.h>

 

2ºno caso o fflush(stdin) eu uso para liberar a memoria talvez eu tenha lido rápido o seu artigo, e não vi outro comando para limpar a memoria

Errado.

você usa o comando fflush(stdin) para limpar o buffer de entrada do teclado!

Não existem comandos para isso. A melhor solução é não deixar entrar sujeira nele.

Releia o artigo, com calma!

 

3º eu tenho a lista apontado para o final nem sei te dizer o pq, a va*** da professora ela só manda copiar os códigos dela e quando tentamos fazer da esta m***** toda ae..

=/

Como eu ja referi ali em cima, existem uns 3 ou 4 tópicos sobre esse assunto aqui, com certeza você aprenderá bastante lendo eles!

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Abraços

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.