Ir para conteúdo

POWERED BY:

Arquivado

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

Ana Fontoura

[Resolvido] C - problema com lista de alocação dinamica(structs)

Recommended Posts

bom pessoal, eu fiz esta função para fazer inserção de um nodo onde precisa ficar ordenado segundo o nome do vertice (variavel "char vertice" da struct), mas dentro do while(que serve para localizar ou o fim da lista, ou a posicao onde deve ser inserido o nodo), acontece um loop infinito que nao consigo resolver :/

alem do mais, tambem estou tendo problemas com o buffer(na hora de ler a variavel q é enviada como parametro para a funcao), sempre que digito a letra para ser o nome do vertice e pressiono enter, o programa automaticamente ja faz a segunda leitura como se eu tivesse apertado "enter" denovo...

 

PS.: nao deem bola para os printf perdidos, eles serviram apenas para eu descobrir onde estava o erro.


struct Arestas
{
	char verticeligado;		/* nome do vertice da sublista ligado ao vertice da lista principal */
	int peso;		/* peso da aresta que liga os 2 vertices em questao */
	struct Arestas *prox_arest;
};
struct Arestas *arest_ant, *nova_arest, *aux_arest;

/* ---------------------------------------------------------------------------------------------------------------------------------- */

struct Vertices
{
	char vertice;	/*nome do vertice da lista principal */
	struct Vertices *prox_vert;		/* *prox aponta para o proximo vertice da lista principal */
	struct Arestas *arest;		/* aponta para o inicio da sublista */
};
struct Vertices *ini, *vert_ant, *novo_vert, *aux_vert;

/* ---------------------------------------------------------------------------------------------------------------------------------- */

void inclui_vertice(char nomevert)
{
	printf("entro na funcao \n");
	if(ini==(struct Vertices*)NULL)		/* caso o vertice a ser inserido seja o 1o */
	{
		printf("insere o primeiro (ini=null)\n");
		ini=(struct Vertices*)malloc(sizeof(struct Vertices));
		ini->vertice=nomevert;
		ini->arest=(struct Arestas*)NULL;
		ini->prox_vert=(struct Vertices*)NULL;
		vert_ant=ini;
	}
	else
	{
		aux_vert=ini;
		printf("comeca o teste pra ver onde insere\n");
		while(aux_vert->prox_vert!=(struct Vertices*)NULL && nomevert > aux_vert->vertice)    //aqui tem um loop infinito que nao consigo resolver <o>
			aux_vert=aux_vert->prox_vert;
		if(aux_vert->vertice==nomevert)
		{
			printf("se ja existe o nodo\n");
			printf("Ja existe um vertice com esse nome!\n");
			printf("Insira um novo nome para o vertice: ");
			scanf("%c", &nomevert);
			inclui_vertice(nomevert);		/* recursividade caso o vertice ja exista */
		}
		else
		{
			if(aux_vert==ini)	/* caso o vertice deva ser inserido na primeira posicao */
			{
				printf("se for inserir na 1a posicao\n");
				aux_vert->prox_vert=ini;
				aux_vert->vertice=nomevert;
				aux_vert->arest=(struct Arestas*)NULL;
				ini=aux_vert;
			}
			else
			{
				if(aux_vert->prox_vert==(struct Vertices*)NULL)		/* caso o vertice deva ser inserido na ultima posicao */
				{
					printf("se for na ultima posicao\n");
					novo_vert=(struct Vertices*)malloc(sizeof(struct Vertices));
					novo_vert->vertice=nomevert;
					novo_vert->prox_vert=(struct Vertices*)NULL;
					novo_vert->arest=(struct Arestas*)NULL;
					aux_vert->prox_vert=novo_vert;
				}
				else	/* caso o vertice deva ser inserido no meio da lista */
				{
					printf("se for inserido no meio da lista\n");
					novo_vert=(struct Vertices*)malloc(sizeof(struct Vertices));
					novo_vert->vertice=nomevert;
					novo_vert->prox_vert=aux_vert->prox_vert;
					novo_vert->arest=(struct Arestas*)NULL;
					aux_vert->prox_vert=novo_vert;
				}
			}
		}
	}
}

/* ---------------------------------------------------------------------------------------------------------------------------------- */

void main (void)
{
	int x;
	char oba;
	ini=(struct Vertices*)NULL;
	clrscr();
	for(x=0; x<10; x++)
	{
		printf("insira o nome: ");
		scanf("%c", &oba);
		printf("\n\n");
		inclui_vertice(oba);
	}
	aux_vert=ini;
	while(aux_vert->prox_vert!=(struct Vertices*)NULL)
	{
		printf("%c, ",aux_vert->vertice);
		aux_vert=aux_vert->prox_vert;
	}
	getch();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

pois é... agora que vi isso, lembrei que uma vez uma professora minha ja tinha me dito o mesmo... XD

muito obrigada.

 

mas o problema do loop infinito continua :S

 

e eu vi também que a segunda inserção ta entrando na 1º posição sempre, nao importando o seu valor :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

problema do loop infinito resolvido! \o/

problema de inserir sempre na 1ª posição resolvido! \o/

 

novo problema encontrado :( (problema de loop na recursividade)

novo problema resolvido! \o/ (resolvi no meio do post :P)

 

mudei o while, e criei uma variavel para enviar de parametro na recursividade, alem de ter usado o "vert_ant" para salvar o vertice anterior na hora de inserir no fim e no meio da lista... aqui está como ficou o programa:

 

struct Arestas
{
	char verticeligado;		/* nome do vertice da sublista ligado ao vertice da lista principal */
	int peso;		/* peso da aresta que liga os 2 vertices em questao */
	struct Arestas *prox_arest;
};
struct Arestas *arest_ant, *nova_arest, *aux_arest;

/* ---------------------------------------------------------------------------------------------------------------------------------- */

struct Vertices
{
	char vertice;	/*nome do vertice da lista principal */
	struct Vertices *prox_vert;		/* *prox aponta para o proximo vertice da lista principal */
	struct Arestas *arest;		/* aponta para o inicio da sublista */
};
struct Vertices *ini, *vert_ant, *novo_vert, *aux_vert;

/* ---------------------------------------------------------------------------------------------------------------------------------- */

void inclui_vertice(char nomevert)
{
	char recursividade;
	printf("entro na funcao \n");
	if(ini==(struct Vertices*)NULL)		/* caso o vertice a ser inserido seja o 1o */
	{
		printf("insere o primeiro (ini=null)\n");
		ini=(struct Vertices*)malloc(sizeof(struct Vertices));
		ini->vertice=nomevert;
		ini->arest=(struct Arestas*)NULL;
		ini->prox_vert=(struct Vertices*)NULL;
	}
	else
	{
		aux_vert=ini;
		printf("comeca o teste pra ver onde insere\n");
		while(aux_vert!=(struct Vertices*)NULL && nomevert > aux_vert->vertice)
		{
			vert_ant=aux_vert;
			aux_vert=aux_vert->prox_vert;
		}
		if(aux_vert->vertice==nomevert)
		{
			printf("se ja existe o nodo\n");
			printf("Ja existe um vertice com esse nome!\n");
			printf("Insira um novo nome para o vertice: ");
			scanf("%c%*c", &recursividade);
			inclui_vertice(recursividade);		/* recursividade caso o vertice ja exista */
		}
		else
		{
			if(aux_vert==ini)	/* caso o vertice deva ser inserido na primeira posicao */
			{
				printf("se for inserir na 1a posicao\n");
				novo_vert=(struct Vertices*)malloc(sizeof(struct Vertices));
				novo_vert->prox_vert=ini;
				novo_vert->vertice=nomevert;
				novo_vert->arest=(struct Arestas*)NULL;
				ini=novo_vert;
			}
			else
			{
				if(aux_vert==(struct Vertices*)NULL)		/* caso o vertice deva ser inserido na ultima posicao */
				{
					printf("se for na ultima posicao\n");
					novo_vert=(struct Vertices*)malloc(sizeof(struct Vertices));
					novo_vert->vertice=nomevert;
					novo_vert->prox_vert=(struct Vertices*)NULL;
					novo_vert->arest=(struct Arestas*)NULL;
					vert_ant->prox_vert=novo_vert;
				}
				else	/* caso o vertice deva ser inserido no meio da lista */
				{
					printf("se for inserido no meio da lista\n");
					novo_vert=(struct Vertices*)malloc(sizeof(struct Vertices));
					novo_vert->vertice=nomevert;
					novo_vert->prox_vert=aux_vert;
					novo_vert->arest=(struct Arestas*)NULL;
					vert_ant->prox_vert=novo_vert;
				}
			}
		}
	}
}

/* ---------------------------------------------------------------------------------------------------------------------------------- */

void main (void)
{
	int x;
	char oba;
	ini=(struct Vertices*)NULL;
	clrscr();
	for(x=0; x<10; x++)
	{
		printf("insira o nome: ");
		scanf("%c%*c", &oba);
		printf("\n\n");
		inclui_vertice(oba);
	}
	aux_vert=ini;
	while(aux_vert!=(struct Vertices*)NULL)
	{
		printf("%c, ",aux_vert->vertice);
		aux_vert=aux_vert->prox_vert;
	}
	getch();
}

pode colocar como resolvido ja http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

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.