Ir ao conteúdo
  • Cadastre-se

C Estrutura de Dados - Listas Simplesmente Encadeadas com strings?


Jouy Durão

Posts recomendados

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

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

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


?

Link para o comentário
Compartilhar em outros sites

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