Informática, perguntado por cruzeiro20166, 1 ano atrás

Alguém me socorre , vale nota .Onde está o erro neste código , é para amanhã ? Um filho de Deus aiu por favor ?

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

#define TAM 5

/*comando typedef
Define um novo nome para um tipo já existente.
*/
typedef struct list
{
int *lista; //elementos da lista
int pos_livre; //proxima posicao livre da lista

} Lista;

//funcao que inicia a lista
void inicia_lista(Lista* lista)
{
lista->pos_livre = 0;
lista->lista = (int *)malloc(sizeof(int) * TAM);
}

//retorna numero de elementos na lista
int tamanho_lista(Lista* lista)
{
return lista->pos_livre;
}

//Dobra o tamanho da lista
void aloca(Lista *lista, int tamanhoMaximoAtualDoVetorDaLista) {

lista->lista = (int *)malloc(sizeof(int) * tamanhoMaximoAtualDoVetorDaLista * 2);

}

//Retorna 1 se a lista está vazia. Retorna 0 caso contrario
int lista_vazia(Lista* lista)
{
if(lista->pos_livre == 0)
return 1;
else
return 0;
}

//Retorna 1 se a lista esta cheia. Retorna 0 caso contrario
int lista_cheia(Lista* lista)
{
if(lista->pos_livre == TAM)
return 1;
else
return 0;
}

//Retorna 1 se o elemento x e inserido. Retorna 0 se não é possível inserir.
int insere_elemento(Lista* lista, int x)
{
//existe espaco na lista
if(lista_cheia(lista) == 0)
{
lista->lista[lista->pos_livre] = x; //escreve x na posicao livre da lista
lista->pos_livre = lista->pos_livre + 1; //atualiza posicao livre da lista
return 1; //indica que foi possivel inserir o elemento
}
else
return 0; //indica que nao foi possivel inserir elemento
}
//Retorna 1 se o elemento é encontrado e removido. Retorna 0 caso contrario.
int remove_elemento(Lista* lista, int x)
{
int i;
int pos_x;
if(lista_vazia(lista) == 0)
{
//percorrer a lista até encontrar o elemento x
for(i = 0; i < lista->pos_livre; ++i)
{
if(lista->lista[i] == x) //elemento x encontrado
{
pos_x = i;
break;
}
}
//verifica se o elemento foi encontrado
if(i < lista->pos_livre)
{
//mover para a posicao anterior cada elemento apos o elemento x
for(i = pos_x; i+1 < lista->pos_livre; ++i)
lista->lista[i] = lista->lista[i+1];

//atualiza posicao livre
lista->pos_livre = lista->pos_livre - 1;

return 1; //indica que o elemento foi removido
}

return 0; //indica que não foi possível remover o elemento
}
}

void mostra_elementos(Lista* lista)
{
int i;
printf("Lista: ");
for(i = 0; i < lista->pos_livre; ++i)
printf("%d ", lista->lista[i]);
printf("\n");

}


int main()
{
int op;
int elem;
int sucesso;
Lista minha_lista;

//inicia os valores adequados da lista
inicia_lista(&minha_lista);

do
{
printf("\tMENU\n");
printf("1 - Inserir elemento na lista\n");
printf("2 - Remover elemento da lista\n");
printf("3 - Mostrar elementos da lista\n");
printf("0 - Sair\n");

scanf("%d", &op);

switch(op)
{
case 1:
printf("Digite o elemento:\n");
scanf("%d", &elem);
sucesso = insere_elemento(&minha_lista, elem);

// Se sucesso igual a 0, a função aloca() é chamada, a lista é dobrada e então insere_elemento() é chamado novamente
if(sucesso == 0) {
aloca(&minha_lista, tamanho_lista);
insere_elemento(&minha_lista, elem);
printf("A lista estava cheia e seu tamanho foi dobrado!\n");
}
else {
printf("Elemento inserido com sucesso!\n");
break;
}
break;
case 2:
printf("Digite o elemento:\n");
scanf("%d", &elem);
sucesso = remove_elemento(&minha_lista, elem);
if(sucesso == 0)
printf("Nao foi possivel remover o elemento!\n");
else
printf("Elemento removido com sucesso!\n");

break;
case 3:
mostra_elementos(&minha_lista);
break;
case 0:
printf("Saindo ... \n");
break;
default:
printf("Opcao nao encontrada!\n");
break;
}
} while(op != 0);


return 0;

}

Soluções para a tarefa

Respondido por miguelhenrique34
0
Me desculpe minha primeira resposta pensei que daria certo copiar e colar o código certo para você.

Mais a unica coisa de errada é que você não declarou a variavel  "tamanho_lista".

Então va lá antes de "minha_lista"  e declare ...

int tamanho_lista;
Perguntas interessantes