Ir ao conteúdo
  • Cadastre-se

Problemas com exercício de lista simplesmente encadeada circular em C


Melina

Posts recomendados

Boa Noite! Estou fazendo um exercício de lista encadeada circular e estou com algumas dificuldades. O exercício pede que eu crie uma lista simplesmente encadeada circular que receba o nome e a idade de pessoas distintas. Aí eu devo ordenar a lista, usando o critério de o mais velho primeiro e criar uma função que permita remover um elemento da lista, usando como critério o nome de quem eu quero remover. O código que eu fiz insere os elementos direitinho, mas na hora de ordenar ele ordena só a idade e não leva o nome da pessoa junto, mudando assim as idades das pessoas que eu inseri. O outro problema é na minha função de remoção, pois eu não consigo remover o nome que eu quero, e eu não consigo identificar onde está o erro. AH, e se minha lista tiver apenas o primeiro elemento, eu não consigo exibi-la. Segue o código:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//DEFINIÇAO DE PONTEIROS
struct no{
char nome[50];
int idade;
struct no *prox;
};
//CRIAÇÃO DE PONTEIROS
struct no *pra mim = NULL ,*novo,*aux,*ant;

//INSERE
int Insere (char *nome, int idade){
int cont;
novo = new no();
if (novo != NULL) {
novo->idade = idade;
strcpy(novo->nome,nome);

if (pra mim == NULL){
pra mim = novo ;
novo->prox=pra mim;
pra mim->prox=novo;
}else{
aux = pra mim;
while(aux->prox != pra mim){
aux = aux ->prox;
}
novo->prox=pra mim;
aux->prox=novo;
}
}
}
//IMPRIME
int imprime_circular(){
if(aux==NULL){
printf("Lista vazia!\r\n");
printf("\n");}
else{
aux = pra mim;
do{
printf("-----------------------------");
printf("\nNOME: %s\n",aux->nome);
printf("\nIDADE: %d\n",aux->idade);
printf("-----------------------------");
aux=aux->prox;
}while (aux!=pra mim);
} }

//ORDENA
void ordenar(){
int a = 0;
no *p1;
p1=(no*)malloc(sizeof(no));
while (a<20){
aux = pra mim;
do{
if (aux->idade <= aux->prox->idade){
aux = aux->prox;
}
if (aux->prox!=pra mim){
if (aux->idade > aux->prox->idade){
p1->idade=aux->prox->idade;
aux->prox->idade=aux->idade;
aux->idade=p1->idade;
aux=aux->prox;
}
}
}while (aux->prox!= pra mim);
a++;
}
}

//DELETA
void deleta(char *nome1){
aux=pra mim;
ant=aux;
if (aux==NULL){
printf("Lista vazia!\r\n");
printf("\n");}
else{
while(aux->prox != pra mim){
if(strcmp(nome1,aux->nome)){
if(aux == pra mim){
pra mim = aux->prox;
}
else{
ant->prox = aux->prox;
}
free(aux);
aux=ant;

}
ant=aux;
aux=aux->prox;
}
}
}


int main () {
int x,k;
no *p_l;
char nome[50],nomedel[50];
int idade;
for (;{
system("cls");
printf("\n01-Inserir");
printf("\n02-Exibir");
printf("\n03-Ordenar");
printf("\n04-Deletar");
printf("\n05-Exit");
printf("\n O que voce deseja fazer? : ");
scanf("%d",&x);
switch(x){
case 1 : printf("\nQual e o nome?\t");
scanf("%s",&nome);
printf("\nQual e a idade?\t");
scanf("%d",&idade);
Insere(nome,idade);
system("PAUSE");
break;
case 2 : imprime_circular();
system("PAUSE");
break;
case 3 : ordenar();
system("PAUSE");
break;
case 4 : printf("\nQuem voce deseja deletar?\n");
scanf("%s",&nomedel);
deleta(nomedel);
system("PAUSE");
break;
case 5 : exit(0);
default: printf("opção Errada");
scanf("%d",&k);
}
}
}

Peço encarecidamente a ajuda de você! ^_^

Link para o comentário
Compartilhar em outros sites

Na função imprime_Circular(), você estava testando se aux é NULL, mas quem possui a lista é pra_mim.

Segue função imprime_Circular() corrigida:


//IMPRIME
void imprime_circular()
{

if(pra_mim==NULL)
{
printf("Lista vazia!\r\n");
printf("\n");
}
else
{
aux = pra_mim;
do
{
printf("-----------------------------");
printf("\nNOME: %s\n",aux->nome);
printf("\nIDADE: %d\n",aux->idade);
printf("-----------------------------");
aux=aux->prox;
}
while ( aux != pra_mim );

}
}

Link para o comentário
Compartilhar em outros sites

Screen Black, obrigado, agora eu consigo imprimir meu primeiro elemento![^^]

Também consegui resolver sozinha o problema da ordenação, porém am minha função remover continua dando erros... Assim, eu alterei ela para remover o elemento pela ordem em que ele está(1 para o primeiro, 2 para o segundo e assim por diante...).

Porém eu só consigo remover o nome, a idade permanece lá. Segue o novo código:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//DEFINIÇAO DE PONTEIROS
struct no{
char nome[50];
int idade;
struct no *prox;
};
//CRIAÇÃO DE PONTEIROS
struct no *pra_mim = NULL ,*novo,*aux,*ant;

//INSERE
int Insere (char *nome, int idade){
int cont;
novo = new no();
if (novo != NULL) {
novo->idade = idade;
strcpy(novo->nome,nome);

if (pra_mim == NULL){
pra_mim = novo ;
novo->prox=pra_mim;
pra_mim->prox=novo;
}else{
aux = pra_mim;
while(aux->prox != pra_mim){
aux = aux ->prox;
}
novo->prox=pra_mim;
aux->prox=novo;
}
}
}
//IMPRIME
int imprime_circular(){
if(pra_mim==NULL){
printf("Lista vazia!\r\n");
printf("\n");}
else{
aux = pra_mim;
do{
printf("-----------------------------");
printf("\nNOME: %s\n",aux->nome);
printf("\nIDADE: %d\n",aux->idade);
printf("-----------------------------");
aux=aux->prox;
}while (aux!=pra_mim);
} }

//ORDENA
void ordenar(){
int a = 0;
no *p1;
p1=(no*)malloc(sizeof(no));
while (a<20){
aux = pra_mim;
do{
if (aux->idade <= aux->prox->idade){
aux = aux->prox;
}
if (aux->prox!=pra_mim){
if (aux->idade > aux->prox->idade){
p1->idade=aux->prox->idade;
strcpy((p1->nome),aux->prox->nome);
aux->prox->idade=aux->idade;
strcpy((aux->prox->nome),aux->nome);
aux->idade=p1->idade;
strcpy((aux->nome),p1->nome);
aux=aux->prox;
}
}
}while (aux->prox!= pra_mim);
a++;
}
}

//DELETA
int deleta(int posicao){
char aux_nome[50];
int cont = 1 ;
aux=pra_mim;
if (aux==NULL){
printf("Lista vazia!\r\n");
printf("\n");}
if (aux!=NULL){
while((aux->prox != pra_mim) && ( cont < posicao-1 )){
if(cont == 1){
pra_mim = aux->prox;
free(aux);
return (0);
}
else{
ant->prox = aux->prox;
free(aux);
return (0);
}
}
cont++;
ant=aux;
aux=aux->prox;
}

}


int main () {
int x,k,posicao;;
no *p_l;
char nome[50],nomedel[50];
int idade;
for (;{
system("cls");
printf("\n01-Inserir");
printf("\n02-Exibir");
printf("\n03-Ordenar");
printf("\n04-Deletar");
printf("\n05-Exit");
printf("\n O que voce deseja fazer? : ");
scanf("%d",&x);
switch(x){
case 1 : printf("\nQual e o nome?\t");
scanf("%s",&nome);
printf("\nQual e a idade?\t");
scanf("%d",&idade);
Insere(nome,idade);
system("PAUSE");
break;
case 2 : imprime_circular();
system("PAUSE");
break;
case 3 : ordenar();
system("PAUSE");
break;
case 4 : printf("\nDigite a posicao q deseja deletar?\n");
scanf("%s",&posicao);
deleta(posicao);
system("PAUSE");
break;
case 5 : exit(0);
default: printf("opção Errada");
scanf("%d",&k);
}
}
}

Link para o comentário
Compartilhar em outros sites

Segue função de remoção pra estudos e comparação com o que já tem:


//DELETA
void deleta(char *nome1)
{
struct no *ptr = NULL;
struct no *tmp = NULL;
int removeu = 0;

if ( pra_mim == NULL )
{
printf("Lista vazia!\r\n");
printf("\n");
}
else
{

// Se for o primeiro da lista
if( ! strcmp( pra_mim->nome, nome1 ) )
{
ptr = pra_mim;

if ( pra_mim != pra_mim->prox )
{
while(tmp->prox != pra_mim)
tmp = tmp->prox;
pra_mim = pra_mim->prox;
tmp->prox = pra_mim;
}
else
pra_mim = NULL;

free(ptr);

}
else
{

ptr = pra_mim->prox;

while ( ( ptr != pra_mim ) && ( removeu != 1 ) )
{

if ( ! strcmp( ptr->nome, nome1 ) )
{
tmp = ptr;
while( tmp->prox != ptr )
tmp = tmp->prox;
tmp->prox = ptr->prox;
free(ptr);
removeu = 1;


}
else
{
ptr = ptr->prox;
}
}
}
}
}

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