Ir para conteúdo

Arquivado

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

Luísa Brandão

Lista duplamente encadeada - c

Recommended Posts

Olá, preciso de ajuda em um algoritmo. A pergunta é: implemente um programa com as opções de inserir, buscar, excluir e listar dados usando uma lista duplamente encadeada, com o tema Cidades visitadas pelo vendedor 

 

O algoritmo está praticamente pronto, mas toda vez que rodo, da problema com a opção “liberar lista”. Ele simplesmente não libera e imprime caracteres estranhos Alguém pode ajudar?

 

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

struct lista2{
    char cidades[51];
    struct lista2* ant;
    struct lista2* prox;
};

typedef struct lista2 Lista2;

Lista2* lst2_cria (void){
    return NULL;
}

Lista2* lst2_insere (Lista2* l, char v[] ){
    Lista2* novo=(Lista2*)malloc(sizeof(Lista2));
    strcpy(novo->cidades, v);
    novo->prox=l;
    novo->ant=NULL;

    if (l!=NULL) l->ant=novo;
    return novo;
}

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;
}

Lista2* lst2_retira (Lista2* l, char v[]){
    Lista2* p;
    p= lst2_busca(l,v);

    if (p==NULL){
        printf("Cidade nao encontada.\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_imprime (Lista2* l){
	Lista2*p=l;

    if(lst2_vazia(l))
        printf("\n\nA lista esta vazia.\n\n");
    else{
	    while(p->prox != NULL)
	        p = p->prox;
 
		while(p != NULL){
        	printf("%s\n", p->cidades);
        	p = p->ant;
		}
    }
}

void lst2_libera (Lista2* l){
    Lista2* p=l;

    while (p!=NULL) {
        Lista2* t=p->prox;
        free(p);
        p=t;
    }
}


int main() {
    int n;char cidade[51];
    Lista2* l;

    printf("\n\t\t>-------------------- MENU --------------------<\n\n");
    printf("\n0)Encerrar\n1)Criar lista\n2)Inserir cidade\n3)Retirar cidade\n4)Imprimir lista\n5)Verificar se a lista esta vazia\n6)Liberar lista\n");
    printf("\n\t\t>----------------------------------------------<\n");

    while(1) {
        scanf("%d",&n);
        if(n==0)break;

        switch(n) {
            case 1:
                l=lst2_cria();
                printf("Lista criada.\n");
                break;

            case 2:
                printf("Digite a cidade que deseja inserir\n");
                scanf(" %[^\n]s", cidade);
                l=lst2_insere(l, cidade);
                break;

            case 3:
                printf("Digite a cidade que deseja retirar\n");
                scanf("%s", cidade);
                l=lst2_retira(l, cidade);
                break;

            case 4:
                lst2_imprime(l);
                break;

            case 5:
                if(lst2_vazia(l))
                    printf("A lista esta vazia.\n");
                else printf("A lista nao esta vazia.\n");
                break;

            case 6:
                lst2_libera(l);
                printf("Lista liberada\n");
                break;

            default:
                printf("\nDigite uma das opções validas.\n");
                break;
        }       

    }
    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum OpcoesMenu{SAIR=0,CRIAR_LISTA,INSERIR_CIDADE,REMOVER_CIDADE,IMPRIMIR_LISTA,VERIFICAR_LISTA_VAZIA,LIBERAR_MEMORIA};

#define TAMMAX_CIDADE 51

struct no {
    char cidade[TAMMAX_CIDADE];
    struct no * anterior;
    struct no * proximo;
};

typedef struct no No;

int is_vazia(No * lista) {
  return (lista->anterior == NULL && lista->proximo == NULL && strcasecmp(lista->cidade,"") == 0);
}

No * criar_elemento() {
  No * e = (No*) malloc(sizeof(No));
  e->anterior = e->proximo = NULL;
  e->cidade[0] = '\0';
  return e;
}

// Insere no final
void inserir(No * lista, char * nome_cidade) {
  if (is_vazia(lista)) {
    strncpy(lista->cidade, (const char *) nome_cidade, strlen(nome_cidade));
    
  } else {
    No * tmp = lista;
    while(tmp->proximo != NULL) { tmp = tmp->proximo; }
    
    No * e = criar_elemento();
    strncpy(e->cidade, (const char *) nome_cidade, strlen(nome_cidade));
    e->anterior = tmp;
    e->proximo = NULL;
    
    tmp->proximo = e;
  }
}

No * pesquisar (No * inicio_lista, char * nome_cidade) {
  No * tmp;
  if (is_vazia(inicio_lista)) {
    tmp = NULL;
    
  } else {
    tmp = inicio_lista;
    while(tmp != NULL) {
      if (strcasecmp(tmp->cidade, nome_cidade) == 0) return tmp;
      tmp = tmp->proximo;
    }
  }
  
  return tmp;
}

No * remover(No * lista, No * elemento) {
  No * tmp_inicio;
  if (elemento == lista) {
    tmp_inicio = lista;
    tmp_inicio = elemento->proximo;
    tmp_inicio->anterior = NULL;

  } else {
    tmp_inicio = elemento->anterior;
    tmp_inicio->proximo = elemento->proximo;
    tmp_inicio = lista;
  }
  
  free(elemento);
  return tmp_inicio;
}


void imprimir(No * lista) {
  
  if (is_vazia(lista)) {
    puts("Não há elementos na lista.");
  } else {
    No * tmp = lista;
    while(tmp != NULL) {
      printf("%s\n", tmp->cidade);
      tmp = tmp->proximo;
    }
  }
}

void liberar_memoria(No * lista) {
  if (lista->proximo == NULL) {
    free(lista);
  } else {
    return liberar_memoria(lista->proximo);
  }
}

void menu_geral() {
  printf("\n\t\t>-------------------- MENU --------------------<\n\n");
  printf("%d) Sair\n", SAIR);
  printf("%d) Criar lista\n", CRIAR_LISTA);
  printf("%d) Inserir cidade\n", INSERIR_CIDADE);
  printf("%d) Remover cidade\n", REMOVER_CIDADE);
  printf("%d) Imprimir lista\n", IMPRIMIR_LISTA);
  printf("%d) Verificar se lista está vazia\n", VERIFICAR_LISTA_VAZIA);
  printf("%d) Liberar lista\n", LIBERAR_MEMORIA);
}

char * menu_ler_cidade() {
  char nome[TAMMAX_CIDADE];
  printf("Informe o nome da cidade: ");
  fgets(nome, TAMMAX_CIDADE, stdin);
  (*strrchr(nome, '\n')) = '\0';
  
  return strdup(nome);
}

int main() {
    int opcao;
    char * nome_cidade;
    No * lista = NULL;
    
    while(1) {
      
      menu_geral();
      printf("Opção: ");
      scanf("%d%*c", &opcao);
      
      if (opcao == SAIR) break;
      
      if (lista == NULL && opcao != CRIAR_LISTA) {
        puts("A lista não foi criada.");
      } else {
      
        switch(opcao) {
            case CRIAR_LISTA:
                  lista = criar_elemento();
                break;
  
            case INSERIR_CIDADE:
                  puts("\t\t------------- INSERIR CIDADE ------------------");
                  nome_cidade = menu_ler_cidade();
                  if (pesquisar(lista, nome_cidade) == NULL) {
                    inserir(lista, nome_cidade);
                  } else {
                    puts("Cidade já inserida na lista.");
                  }
  
                break;
            
            case REMOVER_CIDADE:
                puts("\t\t------------- REMOVER CIDADE ------------------");
                nome_cidade = menu_ler_cidade();
                No * registro = pesquisar(lista, nome_cidade);
                if (registro == NULL) {
                  puts("Cidade não localizada.");
                } else {
                  lista = remover(lista, registro);
                }
                break;
                
            case VERIFICAR_LISTA_VAZIA:
                printf("A lista%sestá vazia\n", is_vazia(lista)? " " : " não ");
                break;
                
            case IMPRIMIR_LISTA:
                imprimir(lista);
                break;
            
            case LIBERAR_MEMORIA:
                liberar_memoria(lista);
                lista = NULL;
                break;
            default:
                printf("\nDigite uma das opções validas.\n");
        }
        
      }
      
    }
    
    if (lista != NULL) liberar_memoria(lista);
    
    return 0;
}

A sua função p/ criar a lista não cria nada em memória.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por paulopoxoreo1234@gmail.com
      Dado o trecho de código em C listado abaixo responda as perguntas a seguir.
      Cont = result = 1;
      For ( i=0; i<5; i= i+0.1){
            Cont = cont+i;
            Result  *= cont;
            Printf(“%f", result);
      }
      a)      O que será impresso depois da primeira iteração deste código?
      b)      Quantas vezes este laço precisará ser executado para que encontre a condição de término ?
      c)      Faça um trecho de código em C para quebrar esse laço na decima quinta iteração.
    • Por ednan
      estou precisando de ajuda neste trabalho se alguem souber e puder ajudar agradeço de coraçao
       
    • Por Hokage1
      Boa Tarde estou quebrando a cabeça com um trabalho, podem me ajudar ?:
       
      ara execução do projeto final siga as instruções: 
       
      (Tarefa 1) Elaborar um programa em Linguagem de Programação C com 2 interfaces (telas); uma para o cadastro dos 10 estudantes e outra para os dados analíticos. (Tarefa 2) Somente após finalizar a Tarefa 1, faça uma investigação para identificar quais recursos (não abordados nesta disciplina), em Linguagem de Programação C, que poderiam tornar a construção desta aplicação mais sofisticada e, até mesmo, mais fácil de implementar? Explique (não há necessidade de implementar o novo recurso). Enviar a resposta da Tarefa 1 (código-fonte escrito em Linguagem de Programação C) e da Tarefa 2 para avaliação em um arquivo no formato MS-Word com nome no seguinte padrão: LCC-IA-2020-3-Mod3-Projeto-Seu_Nome.docx (Arquivos nomeados fora deste padrão serão descartados). Use o fórum do Módulo 03 para postar suas dúvidas e/ou colaborar com os colegas.  
      TAREFA 1 – Programa de cadastro e análise de dados de 10 Estudantes:
      1.Tela: Criar a tela a seguir que permita a entrada de dados de 10 estudantes diferentes. Assim que o usuário digitar os dados do último estudante, o programa deverá ir para a 2.tela.
      Tela 1 – Interface (Tela) para cadastro de 10 estudantes
      2.Tela: Criar a tela a seguir que apresente os dados analíticos, a partir dos dados digitados na Tela 1. Na sequência, encerrar o programa.
       
      tela 2 – Interface (Tela) do quadro analítico
      OBSERVAÇÕES:
      Todos indicadores do Quadro Analítico deverão ser calculados (nenhum digitado pelo usuário);
       
      A “Maior Nota Individual” deverá ser a maior nota obtida por um estudante em qualquer uma das 2 avaliações; A “Menor Nota Individual” deverá ser a menor nota obtida por um estudante em qualquer uma das 2 avaliações; A “Média da Sala” deverá ser a média das médias dos 10 estudantes; A “Melhor Média da Sala” deverá ser a maior média obtida por 1 estudante; A “Pior Média da Sala” deverá ser a menor média obtida por 1 estudante.
    • Por sidius
      ei galera, minha professora pediu para que eu calculasse matrizes utilizando a linguagem c, poderiam me dar uma luz ae?? ficaria grato, tenho grande dificuldade no assunto

    • Por juliaKrunker
      1- O comando typedef pode ser utilizado para criar novos comandos, ou simplesmente novas formas de escrever
      determinados comandos em linguagem C. Por exemplo, toda vez que você quiser criar uma variável do tipo struct
      declarado acima, terá que escrever o nome completo do tipo, isto é struct lista. Usando o comando typedef, defina um
      tipo alternativo, chamado Lista, que possa ser usado em lugar de struct lista.

      2-  Usando o tipo Lista que você criou na questão 3, declare uma variável chamada myList que possa ser utilizada para
      construir uma lista encadeada.
       
      3- (0,5) Usando o tipo Lista que você criou na questão 3, declare uma variável chamada novo que possa ser utilizada para criar
      um novo elemento para a lista declarada na questão 4.

      4- Escreva uma linha de código que aloque espaço na memória para a variável novo declarada na questão 5, de forma
      que a variável possa ser utilizada para inserir um novo elemento na lista myList declarada na questão 4.

      5 -Considerando a variável myList declarada na questão 4 e a variável novo declarada na questão 5 e alocada na questão
      6, atribua os valores 1 para o atributo id e 9.1 para o atributo valor e insira-a na lista myList.
       
      6- O trecho de código apresentado a seguir, refere-se a uma função que receberá como parâmetro um ponteiro para
      uma lista do tipo Lista e deverá calcular e retornar a média dos valores existentes na lista. Escreva o corpo da função.

×

Informação importante

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