Ciao , mi permetto di darti qualche consiglio

tu hai un main e tante funzioni che devono operare su un UNICA lista , di conseguenza è pensabile
che la lista sia dichiarata nel main e venga passata come argomento a ciascuna delle funzioni .


Ci sarebbero molti aspetti , da descrivere e che secondo me non ti sono chiari , ma non si possono trattare in un unico thread di un forum .


Posso dirti , senza specificare il motivo e la teoria , che se devi modificare il puntatore lista del main() , cioè fare puntare quel puntatore a un altro nodo della lista "come nel caso di inserimento di un nodo in testa a una lista " o lo restituisci come puntatore o passi l'indirizzo del puntatore come parametro tramite a un doppio puntatore ....


Mi sto rendendo conto che è impossibile spiegare tutto in thread ma ASSURDO provare a farlo in un unico post


provo a farti un esempio di codice commentato , di come secondo me dovresti impostare il problema


codice:
#include <stdio.h>
#include <stdlib.h>
struct elemento{
 int valore;
 struct elemento *next;
};
void menu();
struct elemento * insElemento(struct elemento *); //restituisce un puntatore a struct elemento cioè restituisce la lista in questo caso :)
void delElemento();
void ordLista();
int main(){
 struct elemento *Lista=NULL ; //puntatore a struct elemento nullo , non punta ancora a una locazione di memoria 
 int comando;
 menu();
 printf("\nComando:\t");
 scanf("%d", &comando);
 switch(comando){
  case 1:{
   Lista=insElemento(Lista);
   break;
  }
  case 2:{
   delElemento();
   break;
  }
  case 3:{
   ordLista();
   break;
  }
 }
 return 0; 
}
void menu(){
 printf("--------------------------");
 printf("\n1 - Inserisci Elemento\n");
 printf("2 - Cancella Elemento\n");
 printf("3 - Ordinamento Lista\n");
 printf("--------------------------");
}
struct elemento* insElemento(struct elemento *list_head)
{
    struct elemento *list_pointer, *list_record;
    int i, n=0, val, newval;
 printf("Specificare il numero di elementi della lista:  ");
 scanf("%d", &n);
 //Inserimento del primo elemento
    list_record = (struct elemento *)malloc(sizeof(struct elemento));
    printf("\nInserisci il 1 elemento: ");
    scanf("%d", &val);
 list_record->valore = val;
 list_head=list_record;
 list_pointer = list_head;
 //Inserimento degli elementi successivi
 for(i=2; i<=n; i++)
       {
          list_record->next = (struct elemento *)malloc(sizeof(struct elemento));
          list_record = list_record->next;
          printf("\nInserisci il %d elemento: ", i);
          scanf("%d", &newval);
          list_record->valore = newval;
          
       } 
       list_record->next = NULL;
	   list_pointer = list_head;// uso un puntatore temporaneo , in modo da scorrere la lista ma mantenere list_head che punti al primo elemento :)
  //Stampa della lista
 printf("\nlista -> ");
 while(list_pointer != NULL){
    printf("%d", list_pointer->valore); // visualizza l’informazione 
       printf(" -> ");
       list_pointer = list_pointer->next; //scorre di un elemento
    }
 printf(" NULL"); 
 
   return list_head; //ho creato la lista , l'ho stampata , e restituisco il primo elemento la testa della lista , 
                     //che sarà assegnata al puntatore Lista del main()    e quindi potrà essere usata da altre funzioni , in modo analogo ;)
                        
    } 
 void delElemento(){
  int del;
  printf("Work in Progress");
  
 }
 void ordLista(){
  printf("Work in Progress");
 }