Lista ligada dinâmica

Declarando a lista

typedef struct{
    int chave;
} REGISTRO;

typedef struct item{
    REGISTRO r;
    struct item *prox;
} ITEM;

typedef struct
{
    ITEM *inicio;
    int qtde;
} LISTA;

*️⃣ Funções de manipulação da lista

Inicializando a lista sequencial

void inicializar(LISTA *l){
    l->inicio = NULL;
    l->qtde = 0;
}

Inserir na lista

ITEM* criarItem(REGISTRO r){
    ITEM* novo = (ITEM*) malloc(sizeof(ITEM));
    if(novo){
        novo->r = r;
        novo->prox = NULL;
        return novo;
    }
    return NULL;
}
void inserir(LISTA *l, REGISTRO r){
    ITEM *novo = criarItem(r);
    
    ITEM *pos = l->inicio;
    ITEM *ant = NULL;
    while (pos){
        ant = pos;
        pos = pos->prox;
    }
    if (!ant){
        l->inicio = novo;
    }
    else{
        ant->prox = novo;
    }
    l->qtde++;
}

Removendo item da lista

void remover(LISTA *l, REGISTRO r){
    if(!l->inicio) return;

    ITEM *pos = l->inicio;
    ITEM *ant = NULL;
    while(pos && pos->r.chave!=r.chave){
        ant = pos;
        pos = pos->prox;
    }

    if(!pos) return;

    if(!ant){
        l->inicio = l->inicio->prox;        
    }
    else{
        ant->prox = pos->prox;

    }
    free(pos);
    l->qtde--;

}

Imprimindo a lista

void imprimir(LISTA *l){
    ITEM *pos = l->inicio;
    while (pos){
        printf("%d\n", pos->r.chave);
        pos = pos->prox;
    }
}

🧑🏻‍💻 Testando a lista

int main(void){
    LISTA l;
    inicializar(&l);
    inserir(&l, (REGISTRO){10});
    inserir(&l, (REGISTRO){20});
    inserir(&l, (REGISTRO){30});
    
    remover(&l, (REGISTRO){20});
    inserir(&l, (REGISTRO){40});
    
    imprimir(&l);
    return 0;
}