EDIT: RESOLVIDO! Achei uma forma rápida e fácil, quem precisar só mandar pm.
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..