Problème de suppression d'un chainon de ma liste doublement chainée
Il y a quelque jours je me suis mis au liste chainée simple puis double;
j'ai donc créé un programme qui obtient par ordre alphabétique un nom et un age.
L'ajout marche impec', l'affichage aussi mais lorsqu'il s'agit de supprimer un chainon ca plante.
Voici mon code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define a 100
#define sp printf("\n")
#define v fflush(stdin)
typedef struct fic
{
char nom[a];
int x;
struct fic *svt;
struct fic *pcd;
}fic;
fic * ajouter(fic*);
void afficher(fic*);
fic * suppression(fic*);
void main(void)
{
fic *ptrfic=NULL;
//ajout trié
do
{ptrfic=ajouter(ptrfic);
}while(ptrfic->x!=0);
//suppression d'un chainon
ptrfic=suppression(ptrfic);
//affichage
afficher(ptrfic);
sp;
system("pause");
}
fic * ajouter(fic *ptrfic)
{
fic *newptr=malloc(sizeof(fic));
fic *savptr=NULL,*suiv=ptrfic;
puts("Notez votre nom:");
v;
gets(newptr->nom);
puts("age:");
v;
scanf("%d",&newptr->x);
newptr->svt=newptr->pcd=NULL;
while(suiv!=NULL && strcmp(suiv->nom,newptr->nom)<0)
{
savptr=suiv;
suiv=suiv->svt;
}
newptr->svt=suiv;
newptr->pcd=savptr;
if(savptr)savptr->svt=newptr;
if(suiv){
suiv->pcd=newptr;}
if(savptr)return ptrfic;
return newptr;
}
void afficher(fic *ptrfic)
{
fic *tmp;
if(ptrfic==NULL)
puts("liste vide");
else
{
tmp=ptrfic;
tmp=tmp->svt;
system("cls");
while(tmp!=NULL)
{
sp;
printf("Nom: %s",tmp->nom);
printf("\nage: %d",tmp->x);
sp;
tmp=tmp->svt;
}
}
}
fic * suppression(fic *ptrfic)
{
fic *psup=malloc(sizeof(fic));
fic *suiv=ptrfic,*savptr=NULL;
puts("Notez votre nom a supprimer:");
v;
gets(psup->nom);
psup->svt=psup->pcd=NULL;
while(suiv!=NULL && strcmp(suiv ->nom,psup->nom)<0)
{
savptr=suiv;
suiv=suiv->svt;
}
if(suiv=NULL || strcmp(suiv->nom,psup->nom)!=0)
puts("pas trouvé");
else
{
if(savptr->pcd==NULL){
suiv->pcd=NULL;
return suiv;}
else
{
savptr->svt=suiv->svt;
return savptr;
}
}
} |
Je pense que ca doit etre une petite erreur, mais je n'arrive pas à voir laquelle.
Si vous la trouviez, ca m'aiderait beaucoup! :)