Hola bueno aqui tienes un codigo no esta completo falta implementar la funsion que ingresa y elima de cualquier posicion y ademas seria bueno ponerlo en un menu pero por ahora no me queda tiempo intenta continuar cordiales saludos cualquie cosa me preguntas

#include<stdio.h>
#include<stdlib.h>
struct datos{
int valor;
struct datos *sig;
};
void ingrsa_inicio(struct datos **lista);
void ingresa_final(struct datos **lista);
void ingresa_Nposicion(struct datos **lista);
void elimina_inicio(struct datos **lista);
void elimina_final(struct datos **lista);
void elimina_Nposicion(struct datos **lista);
void imprime(struct datos **lista);
int main(void){
struct datos *lista=NULL;
ingrsa_inicio(&lista);
ingrsa_inicio(&lista);
ingrsa_inicio(&lista);
imprime(&lista);
ingresa_final(&lista);
ingresa_final(&lista);
ingresa_final(&lista);
imprime(&lista);
return(0);
}
void ingrsa_inicio(struct datos **lista){
struct datos
*nuevo
=(struct datos
*)malloc(sizeof(struct datos
)); printf("ingrese valor para el nodo\n"); scanf("%i",&nuevo
->valor
); nuevo->sig=NULL;
if(*lista==NULL)
*lista=nuevo;
else{
nuevo->sig=*lista;
*lista=nuevo;
}
}
void ingresa_final(struct datos **lista){
struct datos
*nuevo
=(struct datos
*)malloc(sizeof(struct datos
)); struct datos *aux=*lista;
printf("ingrese valor para el nodo\n"); scanf("%i",&nuevo
->valor
); nuevo->sig=NULL;
while(aux->sig!=NULL)
aux=aux->sig;
aux->sig=nuevo;
}
void ingresa_Nposicion(struct datos **lista);
void elimina_inicio(struct datos **lista){
struct datos *aux=*lista;
*lista=aux->sig;
}
void elimina_final(struct datos **lista){
struct datos *aux1=*lista,*aux2=aux1;
while(aux2->sig!=NULL){
aux1=aux2;
aux2=aux2->sig;
}
aux1->sig=NULL;
}
void elimina_Nposicion(struct datos **lista);
void imprime(struct datos **lista){
if(*lista==NULL){
return;
}
struct datos *aux=*lista;
while(aux!=NULL){
aux=aux->sig;
}
}