Ir ao conteúdo

Posts recomendados

Postado

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

Postado

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
Postado

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


?

Postado

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
Postado

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!

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!