Programa está inserindo normalmente, mais não está ordenando e nem mostrando os itens ordenados. 
 
	 
 
	obs1: Usando bubblesort
 
	obs2: ordenando primeiro por nome e depois por idade
 
	 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct lista
{
	int qtd;
	struct Aluno * inicio;
}lista;
typedef struct Aluno
{
	char nome[30];
	int idade;
	struct Aluno * prox;
}Aluno;
lista * aloca_lista();
Aluno * aloca_aluno();
int inserir(lista *l, char * nome, int idade);
void  mostrar(lista *l);
int main()
{
	char aux[30];
	int i,aux2,aux3,aux4,tam=3,pass,trocou;
	Aluno * aluno[3];
	lista * l1;
	l1 = aloca_lista();
	aux4 = l1->inicio;
	
	int idade;
	char nome[30];
	
	for(i=0; i<3; i++)
	{
		printf("\nDigite o nome do aluno[%d]: ",i+1);
		fflush(stdin);
		gets(nome);
		printf("\nDigite o numero: ");
		fflush(stdin);
		scanf("%d",&idade);
		inserir(l1,nome,idade);
	}
	
	trocou = 1;
	
	for(pass=0; pass<tam-1 && trocou==1; pass++)
	{
		trocou = 0;
		
		for(i=0; i<tam-pass-1; i++)
		{
			if(strcmp(aluno[i]->nome,aluno[i+1]->nome) == 0)
			{
				if(aluno[i]->idade > aluno[i+1]->idade)
				{
					aux2 = aluno[i]->idade;
					aluno[i]->idade = aluno[i]->prox->idade;
					aluno[i]->prox->idade = aux2;
				
					strcpy(aux,aluno[i]->nome);
					strcpy(aluno[i]->nome,aluno[i+1]->nome);
					strcpy(aluno[i+1]->nome,aux);
					trocou = 1;
				}
			}
			else if(strcmp(aluno[i]->nome,aluno[i+1]->nome)>0)
			{
				aux3 = aluno[i]->idade;
				aluno[i]->idade = aluno[i+1]->idade;
				aluno[i+1]->idade = aux3;
				
				strcpy(aux,aluno[i]->nome);
				strcpy(aluno[i]->nome,aluno[i+1]->nome);
				strcpy(aluno[i+1]->nome,aux);
				trocou = 1;
			}
		}
	}
	
	printf("\nmostrando:\n\n");
	
	mostrar(l1);
	
	return 0;
}
lista * aloca_lista()
{
	lista * novo;
	novo = (lista*)malloc(sizeof(lista));
	novo->qtd = 0;
	novo->inicio = NULL;
	return novo;	
}
Aluno * aloca_aluno()
{
	Aluno * novo;
	novo = (Aluno*)malloc(sizeof(Aluno));
	novo->idade = 0;
	strcpy(novo->nome," ");
	novo->prox = NULL;
	return novo;
}
int inserir(lista *l,char * nome, int idade)
{
	Aluno * novo, * aux;
	novo = aloca_aluno();
	novo->idade = idade;
	strcpy(novo->nome,nome);
	
	if(l->inicio == NULL)
	{
		l->inicio = novo;
	}
	else
	{
		aux = l->inicio;
		while(aux->prox != NULL)
		{
			aux = aux->prox;
		}
		aux->prox = novo;
	}
	l->qtd++;
	return 1;
}
void mostrar(lista *l)
{
	Aluno * aux;
	aux = l->inicio;
	while (aux != NULL)
	{
		printf("\nNome: %s",aux->nome);
		printf("\nIdade: %d",aux->idade);
		aux = aux->prox;
	}
}