Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Jouy Durão

C Estrutura de Dados - Listas Simplesmente Encadeadas com strings?

Recommended Posts

Oi! Sou novo no fórum, e já venho pedindo ajuda =P
Mas é o seguinte, tenho que entregar esse exercício até quinta, e por me enrolar estudando cálculo, GA e física, acabei deixando pra última hora esse exercício! D:
Esse é o cabeçalho do exercício:

Escrever um programa para gerenciar passagens reservadas:
O programa deve mostrar um menu com 4 opções,
1 - Reservar Passagem
2 - Cancelar Passagem
3 - Verificar Passagem Reservada
4 - Mostrar Passageiros

A informação deve ser armazenada em uma lista, com nomes em ordem alfabética.
Cada passageiro pode reservar apenas uma vez.

O programa deve ser em C.
Deve ser feito utilizando Listas Simplesmente Encadeadas.
Estou utilizando o CodeBlocks.

Como base, tenho o seguinte código:

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

typedef struct elemento{
    int dado;
    struct elemento *proximo;
} Elemento;

typedef struct listasimples{
    Elemento *inicio;
    int tamanho;
} ListaSimples;

ListaSimples *inicializaLista()
{
    ListaSimples *l;
    l = (ListaSimples *)malloc(sizeof(ListaSimples));
    l->inicio = NULL;
    l->tamanho = 0;
    return l;
}

void colocaDado(int d, ListaSimples *l, int pos){

    Elemento *andarilho = l->inicio;
    Elemento *anterior = NULL;

    Elemento *novoDado;
    novoDado = (Elemento *)malloc(sizeof(Elemento));
    novoDado->dado = d;

    int i = 0;
    while(andarilho != NULL && i < pos) {
        anterior = andarilho;
        andarilho = andarilho->proximo;
        i++;
    }

    if (anterior == NULL){
        novoDado->proximo = l->inicio;
        l->inicio = novoDado;
    }
    else{
        anterior->proximo = novoDado;
        novoDado->proximo = andarilho;
    }

    l->tamanho++;

}

int retiraDado(ListaSimples *l,int pos) {
    if (l->inicio == NULL){
        printf("A lista esta vazia, não há o que retirar! \n");
        return 0;
    }
    else {

        Elemento *andarilho = l->inicio;
        Elemento *anterior = NULL;
        Elemento *retirado;
        retirado = (Elemento *)malloc(sizeof(Elemento));

        int i = 0;
        while(i < pos) {
            anterior = andarilho;
            andarilho = andarilho->proximo;
            i++;
        }

        retirado = andarilho;
        int saida = retirado->dado;

        if (anterior == NULL) {
            l->inicio = andarilho->proximo;
        }
        else{
            anterior->proximo = andarilho->proximo;
        }
        free(retirado);
        return saida;
    }
}

void imprimeListaSimples(ListaSimples *l) {
    Elemento *iterador;
    iterador = l->inicio;

    if (iterador == NULL) {
        printf("Lista vazia!");
    }
    else{
        while (iterador != NULL) {
            printf("%i",iterador->dado);
            iterador = iterador->proximo;
        }
    }
	printf("\n");
}

void limpaListaSimples(ListaSimples *l) {
    Elemento *iterador, *anterior;
    iterador = l->inicio;
    anterior = NULL;

    if (iterador == NULL) {
        printf("Lista vazia!");
    }
    else{
        while (iterador != NULL) {
            anterior = iterador;
            iterador = iterador->proximo;
            free(anterior);
        }
    }
    l->inicio = NULL;
}

int main(void)
{
    ListaSimples *l = inicializaLista();
    colocaDado(1,l,0);
    imprimeListaSimples(l);
    colocaDado(2,l,1);
    imprimeListaSimples(l);
    colocaDado(3,l,1);
    imprimeListaSimples(l);
    colocaDado(4,l,2);
    imprimeListaSimples(l);
    retiraDado(l,0);
    imprimeListaSimples(l);
    retiraDado(l,0);
    imprimeListaSimples(l);
    colocaDado(5,l,0);
    imprimeListaSimples(l);
    colocaDado(6,l,0);
    imprimeListaSimples(l);
    retiraDado(l,0);
    imprimeListaSimples(l);
    retiraDado(l,2);
    imprimeListaSimples(l);
    retiraDado(l,1);
    imprimeListaSimples(l);
    retiraDado(l,0);
    imprimeListaSimples(l);
    retiraDado(l,0);
    return 0;
}

 

e meu código está atualmente assim:
 

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

typedef struct elemento{
    char nome[20];
    int dado;
    struct elemento *proximo;
} Elemento;

typedef struct listasimples{
    Elemento *inicio;
    int tamanho;
} ListaSimples;

ListaSimples *inicializaLista()
{
    ListaSimples *l;
    l = (ListaSimples *)malloc(sizeof(ListaSimples));
    l->inicio = NULL;
    l->tamanho = 0;
    return l;
}

void colocaDado(char d, ListaSimples *l, int pos){

    Elemento *andarilho = l->inicio;
    Elemento *anterior = NULL;

    Elemento *novoDado;
    novoDado = (Elemento *)malloc(sizeof(Elemento));
    novoDado->nome[20] = d;

    int i = 0;
    while(andarilho != NULL && i < pos) {
        anterior = andarilho;
        andarilho = andarilho->proximo;
        i++;
    }

    if (anterior == NULL){
        novoDado->proximo = l->inicio;
        l->inicio = novoDado;
    }
    else{
        anterior->proximo = novoDado;
        novoDado->proximo = andarilho;
    }

    l->tamanho++;

}

int retiraDado(ListaSimples *l,int pos) {
    if (l->inicio == NULL){
        printf("A lista esta vazia, não há o que retirar! \n");
        return 0;
    }
    else {

        Elemento *andarilho = l->inicio;
        Elemento *anterior = NULL;
        Elemento *retirado;
        retirado = (Elemento *)malloc(sizeof(Elemento));

        int i = 0;
        while(i < pos) {
            anterior = andarilho;
            andarilho = andarilho->proximo;
            i++;
        }

        retirado = andarilho;
        int saida = retirado->dado;

        if (anterior == NULL) {
            l->inicio = andarilho->proximo;
        }
        else{
            anterior->proximo = andarilho->proximo;
        }
        free(retirado);
        return saida;
    }
}

void imprimeListaSimples(ListaSimples *l) {
    Elemento *iterador;
    iterador = l->inicio;

    if (iterador == NULL) {
        printf("Lista vazia!");
    }
    else{
        while (iterador != NULL) {
            //printf("%s",iterador->nome);
            puts(iterador->nome);
            iterador = iterador->proximo;
        }
    }
	printf("\n");
}

void limpaListaSimples(ListaSimples *l) {
    Elemento *iterador, *anterior;
    iterador = l->inicio;
    anterior = NULL;

    if (iterador == NULL) {
        printf("Lista vazia!");
    }
    else{
        while (iterador != NULL) {
            anterior = iterador;
            iterador = iterador->proximo;
            free(anterior);
        }
    }
    l->inicio = NULL;
}

int main(void)
{
    ListaSimples *l = inicializaLista();
    int escolha=0;
    char name[20];
    printf("Reservator v0.1\n");
    printf("1 - Reservar Passagem\n2 - Cancelar Passagem\n3 - Verificar Passagem Reservada\n4 - Mostrar Passageiros\n");
    while(escolha<1 || escolha>4)
    {
        scanf("%d",&escolha);
    }
    gets(name);
    colocaDado(name,l,0);
    imprimeListaSimples(l);
    colocaDado("ass",l,1);

    imprimeListaSimples(l);
    retiraDado(l,0);
    return 0;
}

 

Eu empaquei, e minhas dúvidas são as seguintes:
1) Como eu faço para enviar um nome, com espaços, para a lista???
2) Como eu faço para a lista se organizar em ordem alfabética? (pensei em usar o strcmp, mas n sei como fazer isso junto da lista),
3) Como eu imprimo esses nomes da lista?

 

Por favor, me ajudem :(

To desesperado pois tenho prova de fisica na quinta, mesmo dia da entrega desse exercício que vale nota..

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) utilizando scanf pode ser da seguinte maneira:

scanf("%[^\n]s", var); //pega toda a string até a entrada do enter
setbuf(stdin, NULL); // limpa o buffer

também podemos utilizar fgets que seria assim:

fgets(var, sizeof(var), stdin);

onde o primeiro parâmetro é nome da variável, o segundo o tamanho da string, e o terceiro método de entrada, nesse caso o teclado.

 

2) A primeiro momento eu pensaria fazer comparações de caracteres utilizando a tabela ascii, mas dê uma pesquisada, acho que deve encontrar algumas funções prontas.

 

3) só utilizar um laço de repetição

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Beleza, a dúvida 2) e 3) eu entendi, pesquisei e já sei como fazer! :D

    Agora, ainda to com a dúvida 1), 
    como eu defino essa variavel?

    seria algo tipo

    char var[20]?

     

    e para enviar isso para a lista, seria 
     

    colocaDado(var,l,0); //onde 0 é a posição, l é a lista l, e var seria o nome da pessoa


    ?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Sim, tu criaria a variavel, exemplo:

    char nome[30];


    e pediria pro usuário digitar o nome, exemplo:

    printf("digite seu nome: ");
    fgets(nome, sizeof(nome), stdin);

    E então colocaria na lista, acredito que o exemplo que você citou esteja certo, to a um tempo sem ver lista em C.

    • Amei 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Resolvido!
    Consegui usando o fget e puts!
    e para organizar em ordem alfabética utilizei o strcmp.

     

    está funcionando 100% :)
    Deu um trabalho lascado, mas valeu a pena!
    Obrigado por me dar uma ajuda! ;)

    Se alguem precisar ver a minha solução, só avisar!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×