I am making a static linked list, that numbers will be sorted when the user types, but when I have insert more than one element it appears that the list is full, I do not know why this is happening
My code
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
#define INVALIDO -1
typedef int TIPOCHAVE;
typedef struct
{
TIPOCHAVE chave;
} REGISTRO;
typedef struct
{
REGISTRO reg;
int prox;
} ELEMENTO;
typedef struct
{
ELEMENTO A[MAX];
int inicio;
int dispo;
} LISTA;
void incializar(LISTA *l);
int tam(LISTA *l);
void imprime(LISTA *l);
int procura(LISTA *l, int numero);
void inserirElemento(LISTA *l, REGISTRO reg);
int obterNo(LISTA *l);
int main(int argc, char** argv)
{
LISTA *lista = malloc(sizeof(LISTA));
REGISTRO registro;
registro.chave = 190;
incializar(lista);
inserirElemento(lista,registro);
registro.chave = 10;
inserirElemento(lista,registro);
printf("%d\n",tam(lista));
//free(lista);
return 0;
}
void incializar(LISTA *l)
{
int i;
for(i = 0; i < MAX - 1; i++)
{
l->A[i].prox = i + 1;
}
l->A[MAX - 1].prox = INVALIDO;
l->inicio = INVALIDO;
l->dispo = 0;
}
int tam(LISTA *l)
{
int inicio = l->inicio;
int tam = 0;
while(inicio != INVALIDO)
{
inicio = l->A[inicio].prox;
tam++;
}
return tam;
}
void imprime(LISTA *l)
{
int i = l->inicio;
if(l->dispo == 0)
{
puts("A lista nao tem elementos");
}
else
{
while(i != INVALIDO)
{
printf("%d\n", l->A[i].reg.chave);
i = l->A[i].prox;
}
}
}
int procura(LISTA *l, int numero)
{
int i = l->inicio;
while((i != INVALIDO) && (l->A[i].reg.chave < numero))
{
i = l->A[i].reg.chave;
}
if(i != INVALIDO && l->A[i].reg.chave == numero)
{
return i;
}
return -1;
}
void inserirElemento(LISTA *l, REGISTRO reg)
{
int i;
if(l->dispo == INVALIDO)
{
puts("Lista cheia");
}
int ant = INVALIDO;
int ch = reg.chave;
while((i != INVALIDO) && (l->A[i].reg.chave < ch))
{
i = l->A[i].reg.chave;
}
if(i != INVALIDO && l->A[i].reg.chave == ch)
{
puts("Esse elemento ja existe");
}
i = obterNo(l);
l->A[i].reg = reg;
if(ant == INVALIDO)
{
l->A[i].prox = l->inicio;
l->inicio = i;
}
else
{
l->A[i].prox = l->A[ant].prox;
l->A[ant].prox = i;
}
}
int obterNo(LISTA *l)
{
int resultado = l->dispo;
while(l->dispo != INVALIDO)
{
l->dispo = l->A[l->dispo].prox;
}
return resultado;
}