Bonjour, voila j'essaye d'apprendre à trier une liste chainée mais j'ai quelques soucis

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct liste
{
int valeur;
struct liste *suivant; //pointe vers l'élément suivant
};
typedef struct liste liste_s ,*pt_cellule,*liste;
void ajout_tete(pt_cellule *tete,int t)
{
liste_s *nouveau; //nouvelle entrée dans la liste chainée
nouveau=(liste_s *)malloc(sizeof (liste_s)); // on assigne une case memoire pour la nouvelle valeur
nouveau->valeur=t; //la valeur de la nouvelle case prend le scanf (variable t)
nouveau->suivant=*tete; // le pointeur de nouveau pointe sur la tete actuelle pour se lier à un autre maillon
(*tete)=nouveau; //on donne à tete la 1er valeur de la chaine (l'adresse)
}
void affichage(pt_cellule *tete)
{
liste l=*tete;
while(l != NULL)
{
printf("valeur : %d\n",l-> valeur);
l=l->suivant;
}
}
// Voici l'endroit qui me pose probleme void tri(pt_cellule *tete)
{
liste actuel = *tete;
liste precedent = actuel->suivant;
liste tmp = NULL;
printf("actuel : %d\n",actuel-> valeur);
printf("precedent : %d\n",precedent-> valeur);
while(precedent != NULL)
{
if (actuel < precedent)
{
tmp = precedent;
precedent = actuel;
actuel = tmp ;
};
actuel=actuel->suivant;
}
affichage(tete);
}
int main()
{
int t=-1;
pt_cellule tete=NULL; //pointeur de tete initialisé à 0
while (t!=0)
{
printf("saisie :\n");
scanf("%d",&t);
if (t==0) break;
ajout_tete(&tete,t);
}
affichage(&tete);
tri(&tete);
return 0;
}