bien aqui tienes una lista bien implementada con metodo menu, ahora si la estructura esta declarada de forma global no es necesario pasarla como paramerto a las funciones, saludos y cualquier cosa me preguntas aaa y algo mas los datos los ingresa al inicio de la lista por lo tanto el ultimo dato que ingreses sera el primero cuando se imprima
#include<stdio.h>
#include<stdlib.h>
typedef struct dato{
char palabra[20];
struct dato *sig;
}nodo;
nodo *cabeza=NULL,*final=NULL;
nodo *creanodo();
void ingresaalinicio();
void imprimir();
int pide();
int menu();
int main(void){
int opc;
do{
opc=menu();
switch(opc){
case 1:
ingresaalinicio();
break;
case 2:
imprimir();
break;
case 0:
return(0);
default:
printf("la opcion no esta en el menu\n\n");
}
}while(opc!=0);
return(0);
}
nodo *creanodo(){
nodo *nuevo=(nodo *)malloc(sizeof(struct dato));
printf("ingrese palabra\n");
fflush(stdin);
gets(nuevo->palabra);
nuevo->sig=NULL;
return(nuevo);
}
void ingresaalinicio(){
nodo *nuevo=creanodo();
if(cabeza==NULL)
final=nuevo;
else
nuevo->sig=cabeza;
cabeza=nuevo;
}
void imprimir(){
nodo *aux=cabeza;
printf("lista=");
while(aux!=NULL){
printf("[%s]->",aux->palabra);
aux=aux->sig;
}
printf("NULL\n");
}
int pide(){
int num;
printf("ingrese opcion\n");
scanf("%i",&num);
return(num);
}
int menu(){
printf("1 ingresar al inicio\n2 imprimir\n0 salir\n");
return(pide());
}