Probleme des liste chainee

Fermé
maher - 16 janv. 2012 à 14:39
Bonjour,

slt, j'ai probleme et j'espere que vous m'aider .
j'ai cree un programme qui ajoute, tri & affiche des elements ,il s'execute sur "DEV++"
mais quand je tape le choix N°8 il se bloque voici le programme :


#include<stdio.h>
#include<stdlib.h>
typedef struct liste{
int val;
liste *suivant;
};
liste *ajouter_debut(liste *p,int v)
{
liste *nouveau;
nouveau=(liste*)malloc(sizeof(liste));
if(nouveau==NULL)
{
printf("\n Erreur! ");
getchar();
exit(1);
}
else{
nouveau->val=v;
if(p==NULL)
{
p=nouveau;
nouveau->suivant=NULL;
}
else{
nouveau->suivant=p;
p=nouveau;
}
}
return p;
}

liste *ajouter_fin(liste *p,int v)
{
liste *nouveau,*aide;
nouveau=(liste*)malloc(sizeof(liste));
if(nouveau==NULL)
{
printf("\n Erreur! ");
exit(0);
}
else
{
nouveau->val=v;
if(p==NULL)
{
p=nouveau;
nouveau->suivant=NULL;
}
else{
aide=p;
while(aide->suivant!=NULL)
aide=aide->suivant;
aide->suivant=nouveau;
nouveau->suivant=NULL;
}
}
return p;
}

void afficher(liste *p)
{
liste *aide;
if(p==NULL)
printf("\t Liste vide! \n\n");
else{
aide=p;
while(aide!=NULL)
{
printf("%d \n",aide->val);
aide= aide->suivant;
}
printf("\n\n");
}
}

int sizelc(liste *tete)
{
int n=0;
liste *tmp;
tmp=tete;
while(tmp!=NULL)
{
n++;
tmp=tmp->suivant;
}
return n;
}

int chercher(liste *tete,int X)
{
liste *tmp ;
int b=0,pos=0;
tmp=tete;
while(tmp!=NULL)
{
if(tmp->val == X)
{

b=1;
break;
}
else
tmp=tmp->suivant;
pos++;
}
if(b==0)
return -1;
else
return pos;
}
liste *supprimer (liste *tete , int v)
{
int h ;
liste *tmp, *p;
h=chercher(tete,v);
if(h==-1)
printf("rien a supprimer");
else
{
if(tete->val==v)
{
tmp=tete;
tete=tete->suivant;
free(tmp);
}
else
{
tmp=tete;
while(tmp->suivant!=NULL && tmp->suivant->val!=v)
tmp=tmp->suivant;
p=tmp->suivant;
tmp->suivant=tmp->suivant->suivant;
free(p);

}
}
return tete;
}

liste* insert_ordre(liste *p,int X)
{
liste *New,*tmp;
New=(liste*)malloc(sizeof(liste));
if(New==NULL)
{
printf("erreur");
exit(0);
}
else{
New->val=X;
if(X<p->val)
{
New->suivant=p;
p=New;
}
else
{
tmp=p;

while(tmp->suivant!=NULL)
{
if(X>tmp->suivant->val)
tmp=tmp->suivant;
else
break;
}
New->suivant=tmp->suivant;
tmp->suivant=New;
}
}
return p;
}
void tri_selection(liste *tete)
{
liste *p,*q,*min;
int aide;
for(p=tete;p->suivant!=NULL;p=p->suivant)
{
min=p;
for(q=p->suivant;q!=NULL;q=q->suivant)
{
if(q->val<min->val)
min=q;
}
aide=p->val;
p->val=min->val;
min->val=aide;

}
}


liste* tri_insertion(liste *tete)
{
liste *r=NULL,*tmp;
for(tmp=tete;tmp!=NULL;tmp=tmp->suivant)
r=insert_ordre(r,tmp->val);
return r;
}

void menu(int choix)
{
liste *p=NULL;
int v,n;
do{
printf(" 1-\t\tAjouter au debut de la liste.\n");
printf(" 2-\t\tAjouter à la fin de la liste.\n");
printf(" 3-\t\tAfficher la liste.\n");
printf(" 4-\t\tChercher une valeur.\n");
printf(" 5-\t\tDonner la longueur de la liste.\n");
printf(" 6-\t\tSupprimer une valeur de la liste.\n");
printf(" 7-\t\tri par selection d'une liste.\n");
printf(" 8-\t\tri pa insertion d'une liste.\n");
printf("\t\tQuitter\n");
printf("\t\tDonnez votre choix: \n ");
scanf("%d",&choix);
if(choix==1)
{
printf("\t Donnez une valeur: ");
scanf("%d",&v);
p=ajouter_debut(p,v);
}
else if(choix==2)
{
printf("\t Donnez une valeur: ");
scanf("%d",&v);
p=ajouter_fin(p,v);
}
else if(choix==3)
{
afficher(p);
}
else if(choix==4)
{
printf("\t Donnez une valeur: ");
scanf("%d",&v);
n=chercher(p,v);
if(n==-1)
printf("la valeur n'existe pas\n");
else
printf("la position de la valeur %d est %d \n",v,n);
}
else if (choix==5)
{
n=sizelc(p);
printf("la longueur est %d",n);
}
else if(choix==6)
{
printf("\t entrer la valeur à supprimer: ");
scanf("%d",&v);
p=supprimer(p,v);
}
else
if(choix==7)
{
printf("\t triage de la liste: ");
tri_selection(p);
}
else

if(choix==8)
{
printf("\t tri par insertion: ");
tri_insertion(p);
}


}
while(choix!=0);
}
int main()
{
int choix;
menu(choix);
system("cls");
getchar();
getchar();
return 0;
}













MERCI D'AVANCE :)