Lista simplesmente encadeada com estrutura dentro de estrutura

Boa Noite Pessoal!

Estou com dificuldade em implementar um exercício que pede para criar duas estruturas, uma com os dados de um aluno, e outra para ser a lista. Na inserção de dados pede para fazer em ordem crescente de matriculas. Ele está dando erro. Vocês conseguem me dizer onde estou errando? Vejam meu código:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct aluno{
int matricula;
char nome[100];
float media;
};
typedef struct aluno Aluno;

struct no{
Aluno* dados;
struct no* prox;
};
typedef struct no No;

No* cria(No* l){
No* p=(No*)malloc(sizeof(No));
p->dados=NULL;
return l;
}

No* ins_ordenado(No* l,int mat,char* nome,float nota){
Aluno* Al=(Aluno*)malloc(sizeof(Aluno));
No* novo=(No*)malloc(sizeof(No));
int i=0;
Al->matricula=mat;
while(nome[i]!=’\0’){
Al->nome[i]=nome[i];
i++;
}
Al->nome[i]=NULL;

Al->media=nota;
novo->dados=Al;

No*p=l;
No*aux=NULL;

if(l==NULL){
    novo->prox=l;
    return novo;
}
    while(p!=NULL&&((p->dados->matricula)<(Al->matricula))){
          aux=p;
          p=p->prox;
    }

    novo->prox=aux->prox;
    aux->prox=novo;
    if(p==NULL){
        novo->prox=NULL;
    }

return l;

}

void imprime(No* l){
No* p;
printf(“turma 1:\n”);
for(p=l;p!=NULL;p->prox){
printf(“Matricula: %d\t Nome: %s Nota:%f\n”,p->dados->matricula,p->dados->nome,p->dados->media);
}
printf("\n");
}

int vazia(No* l){
return(l==NULL);
}

int main(){
No* l1=cria(l1);
l1=ins_ordenado(l1,1,“Maria”,5);
printf(“vazia? %d”,vazia(l1));
//imprime(l1);

return 0;
}