Ir ao conteúdo

Posts recomendados

Postado

Gente, preciso de ajuda urgentemente! As minhas funções de inserir cidade no inicio e no fim funcionam, mas quando vou imprimir, fala que a lista está vazia. Na hora que vou mudar elas de posição no menu (switch case), também nao funcionam. Preciso entregar este trabalho hoje!!! 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
struct lista2
{
    char cidades[51];
    struct lista2* ant;
    struct lista2* prox;
};
typedef struct lista2 Lista2;

Lista2* lst2_cria (void)
{
    return NULL;
}
void  lst2_insereini(Lista2* inicio, char valor[]){

    Lista2* novo;
    novo =malloc(sizeof(Lista2)); /* aloca memória para o novo nó */
    
    if(novo == NULL) /* se não houver memória disponível */
        return;      /* sai da função */
   
    if(inicio == NULL){    /* se a lista estivava vazia */
          strcpy(novo->cidades,valor); /* insere o valor no novo nó */
        novo->prox = novo->ant = NULL; /* não há próximo nó nem nó anterior, pois só há um nó */
        inicio = novo; /* o novo nó é o primeiro da lista */
    }
    else{   /* se já havia nó na lista */
       strcpy(novo->cidades,valor); /* insere o valor no novo nó */
        
        novo->ant = NULL; /* não há nó anterior */
        
        novo->prox = inicio; /* o novo nó aponta para o que está no início */
        
        inicio->ant = novo; /* o nó atual do início aponta para o novo nó */
        
        inicio = novo; /* o novo nó passa a ser o primeiro da lista */
        
    }
    
}

void lst2_inserefim(Lista2* inicio, char valor[]){
    
    Lista2* novo, *atual;
    
    novo = malloc(sizeof(Lista2));
    if(novo == NULL)
        return;
    if(inicio == NULL){
        strcpy(novo->cidades,valor);
        novo->prox = novo->ant = NULL;
        inicio = novo;
    }
    else{
        atual = inicio; /* atual aponta para o início */
        while(atual->prox != NULL) /* enquanto o nó atual não for o último */
            atual = atual->prox;    /* vai para o nó seguinte */
        strcpy(novo->cidades,valor);
        novo->ant = atual;  /*o nó anterior ao novo é o nó atual */
        novo->prox = NULL; /* não há próximo nó, pois o novo será o último */
        atual->prox = novo; /* o nó atual aponta para o novo nó e não é mais o último */
    }
}


Lista2* lst2_busca (Lista2*l, char v[])
{
    Lista2* p;
    for (p=l; p!=NULL; p=p->prox)
        if (strcmp (p->cidades,v)==0)
            return p;
    
    return NULL;
}
void lst2_buscarcidade(Lista2* l,char v[])
{
    Lista2* p;
    for (p=l; p!=NULL; p=p->prox)
    {
        if (strcmp (p->cidades,v)==0)
        {
            printf("Cidade encontrada\n");
            return;
        }
        
    }
    
    printf("Cidade não encontrada\n");
}



Lista2* lst2_retira (Lista2* l, char v[])
{
    Lista2* p;
    p= lst2_busca(l,v);
    if (p==NULL)
    {
        printf("Cidade não encontrada.\n");
        return l;
    }
    else printf("Cidade retirada.\n");
    if (l==p) l=p->prox;
    else p->ant->prox=p->prox;
    if (p->prox!=NULL)
        p->prox->ant=p->ant;
    free(p);
    return l;
    
}
int lst2_vazia(Lista2* l)
{
    if (l==NULL)return 1;
    else return 0;
}

void lst2_imprimefimini(Lista2* l){
    Lista2*p=l;
    while(p!=NULL){
        printf("%s\n", p->cidades);
        p=p->prox;
        
    }
    
}
void lst2_imprimeinifim (Lista2* l)
{
    
    Lista2*p=l;
    
    if(lst2_vazia(l))
        
        printf("\n\nA lista está vazia.\n\n");
    
    
    else
    {
        while(p->prox != NULL)
            
            p = p->prox;
        
        
        while(p != NULL)
        {
            
            printf("%s\n", p->cidades);
            
            p = p->ant;
            
        }
        
    }
    
}
Lista2* lst2_libera (Lista2* l)
{
    Lista2 *p = l->ant;
    
    
    while(p != NULL)
    {
        free(p);
        p = p->ant;
    }
    
    p = l;
    
    while(p != NULL)
    {
        free(p);
        p = p->prox;
    }
    return p;
}
void imprimir_menu(){
    printf("\n\t\t>-------------------- MENU --------------------<\n\n");
    printf("\n1)Inserir cidade no início\n2)Retirar cidade\n3)Buscar cidade\n4)Imprimir lista\n5)Verificar se a lista está vazia\n6)Liberar lista\n7)Encerrar\n8)Inserir cidade no fim\n0)Mostrar opções\n");
    printf("\n\t\t>----------------------------------------------<\n");
}
int main()
{
    setlocale(LC_ALL, "Portuguese");
    int n,i;
    char cidade[51];
    Lista2* l;
    l=lst2_cria();
    imprimir_menu();
    while(1)
    {
        
        
        scanf("%d",&n);
        if(n==7)break;
        switch(n)
        {
            case 0:
                imprimir_menu();
                break;
            case 1:
                printf("Digite a cidade que deseja inserir\n");
                scanf(" %[^\n]s", cidade);
                lst2_insereini(l, cidade);
                break;
            case 2:
                printf("Digite a cidade que deseja retirar\n");
                scanf(" %[^\n]s", cidade);
                l=lst2_retira(l, cidade);
                
                break;
            case 3:
                printf("Digite a cidade que deseja buscar\n");
                scanf(" %[^\n]s", cidade);
                lst2_buscarcidade(l,cidade);
                break;
            case 4:
                printf("De que modo deseja imprimir a lista?\n");
                printf("1)Ordem original\n2)Ordem inversa\n");
                scanf("%d",&i);
                if(i==1)
                    lst2_imprimeinifim(l);
                else if(i==2)
                    lst2_imprimefimini(l);
                else printf("Digite uma opção válida.\n");
                break;
            case 5:
                if(lst2_vazia(l))
                    printf("A lista está vazia.\n");
                else printf("A lista não está vazia.\n");
                break;
            case 6:
                l=lst2_libera(l);
                printf("Lista liberada\n");
                break;
            case 8:
                printf("Digite a cidade que deseja inserir\n");
                scanf(" %[^\n]s", cidade);
                lst2_inserefim(l, cidade);
                break;
            default:
                printf("\nDigite uma das opções válidas.\n");
                break;
        }
    }
    return 0;
}

 

Postado

1 - Retorne a lista ao inserir no fim e no inicio:

Lista2* inserir(Lista *inicio){
   //... 
   return inicio;
}

 

Segue:



Lista2*lst2_insereini(Lista2* inicio, char valor[]){
    Lista2* novo = malloc(sizeof(Lista2)); /* aloca memória para o novo nó */

    if(novo == NULL) /* se não houver memória disponível */
        return inicio;      /* sai da função */

    if(inicio == NULL){    /* se a lista estivava vazia */
        strcpy(novo->cidades, valor); /* insere o valor no novo nó */
        novo->prox = novo->ant = NULL; /* não há próximo nó nem nó anterior, pois só há um nó */
        inicio = novo; /* o novo nó é o primeiro da lista */
    }
    else{   /* se já havia nó na lista */
        strcpy(novo->cidades,valor); /* insere o valor no novo nó */

        novo->ant = NULL; /* não há nó anterior */
        novo->prox = inicio; /* o novo nó aponta para o que está no início */

        inicio->ant = novo; /* o nó atual do início aponta para o novo nó */

        inicio = novo; /* o novo nó passa a ser o primeiro da lista */

    }
    return inicio;
}

Lista2*lst2_inserefim(Lista2* inicio, char valor[]){

    Lista2* novo, *atual;
    novo = malloc(sizeof(Lista2));
    if(novo == NULL)
        return inicio;

    if(inicio == NULL){
        strcpy(novo->cidades,valor);
        novo->prox = novo->ant = NULL;
        inicio = novo;
        return inicio;
    }
    else{
        atual = inicio; /* atual aponta para o início */
        while(atual->prox != NULL) /* enquanto o nó atual não for o último */
            atual = atual->prox;    /* vai para o nó seguinte */
        strcpy(novo->cidades,valor);
        novo->ant = atual;  /*o nó anterior ao novo é o nó atual */
        novo->prox = NULL; /* não há próximo nó, pois o novo será o último */
        atual->prox = novo; /* o nó atual aponta para o novo nó e não é mais o último */
    }
    return atual;
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!