application liste chainée en C

    Partagez
    avatar
    super
    Débutant
    Débutant

    Nombre de messages : 79
    Age : 28
    Localisation : mahdia
    Emploi : 9raya & 9raya & 9raya
    Date d'inscription : 10/03/2008

    default application liste chainée en C

    Message par super le Mer 3 Juin - 1:57

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

    int n;//n est le nombre des notes pour chaque etudiant-variable globale-
    struct date
    {
    int jj;
    int mm;
    int aa;
    };

    typedef struct date DATE;

    struct etudiant
    {
    int matricule;
    char nom[20];
    char prenom[20];
    DATE date_naiss;
    float tab_note[10];
    float moyenne;
    };

    typedef struct etudiant ETUDIANT;
    struct Element
    {
    ETUDIANT info;
    struct Element *suiv;
    };
    typedef struct Element *liste;

    int controle_date(int a,int b,int c)
    {
    int mois[12];
    mois[0]=31;
    mois[8]=30;
    mois[2]=31;
    mois[4]=31;
    mois[6]=31;
    mois[7]=31;
    mois[9]=31;
    mois[11]=31;
    mois[3]=30;
    mois[10]=30;
    mois[1]=30;
    mois[5]=30;
    if(c%4==0)
    mois[1]=29;
    else
    mois[1]=28;
    if((b-1<0)||(b-1>11))
    return(0);
    if ((a>mois[b+1])||(a<1))
    return(0);
    return(1);
    }

    float remplir(float t[20])
    {
    float moyn=0;
    do
    {
    printf("\nentrer le nombre des notes qui doit etre superieur ou egale a 1\n");
    scanf("%d",&n);
    }
    while(n<1);
    for(int i=0;i<n;i++)
    {
    printf("\nentrer la note de la martiere -%d-\n",i);
    scanf("%f",&t[i]);
    moyn=moyn+t[i];
    }
    moyn=moyn/n;
    return(moyn);
    }

    void saisie_etudiant(ETUDIANT *etud)
    {
    do
    {
    printf("entrer le numero de la matricule qui doit etre >0\n");
    scanf("%d",&(*etud).matricule);
    }
    while(etud->matricule<=0);
    printf("\nentrer le nom\n");
    scanf("%s",etud->nom);
    printf("\nentrer le prenom\n");
    scanf("%s",etud->prenom);
    do
    {
    printf("\nentrer la jour de la date de naissance\n");
    scanf("%d",&(*etud).date_naiss.jj);
    printf("\nentrer le mois de la date de naissance\n");
    scanf("%d",&(*etud).date_naiss.mm);
    printf("\nentrer l'anné de la date de naissance\n");
    scanf("%d",&(*etud).date_naiss.aa);
    }
    while(controle_date(etud->date_naiss.jj,etud->date_naiss.mm,etud->date_naiss.aa)<0);
    etud->moyenne=remplir(etud->tab_note);
    }

    void affiche_etudiant(ETUDIANT etud)
    {
    printf("\nla matricule est :\n");
    printf("%d",etud.matricule);
    printf("\nle nom est :\n");
    printf("%s",etud.nom);
    printf("\nle prenom est :\n");
    printf("%s",etud.prenom);
    printf("\nla date de naissance est :\n");
    printf("\nle jour est :%d",etud.date_naiss.jj);
    printf("\n le mois est :%d",etud.date_naiss.mm);
    printf("\n l'anne est :%d",etud.date_naiss.aa);
    printf("\nles notes sont :\n");
    for(int i=0;i<n;i++)
    printf("la note de la matiere -%d-est %f\n",i,etud.tab_note[i]);
    printf("\nla moyenne est :\n");
    printf("%f",etud.moyenne);
    }

    //creer liste
    liste creer_liste()//creer une liste consiste a metre la tete a NULL
    {
    return(NULL);
    }

    // ajouter un element au debut de la liste
    liste ajout_debut(liste tete)
    {
    //allouer(p);
    liste p;
    p=(liste)malloc(sizeof(liste));
    //remplissage de p
    saisie_etudiant(&(p->info));
    //chainage
    p->suiv=tete;
    return(p);
    }

    //ajouter a la fin de la liste
    liste ajout_fin(liste tete)
    {
    //allouer(p);
    liste p,pp,ps;
    ps=tete;
    pp=NULL;
    //pp va pointer sur l'element l'avant dernier
    while(ps!=NULL)//rechercher du dernier element
    {
    pp=ps;
    ps=ps->suiv;
    }
    //allocation de p
    p=(liste)malloc(sizeof(liste));
    //remplissage de p
    saisie_etudiant(&(p->info));
    //chainage
    p->suiv=NULL;
    if (pp==NULL)//si pp=NULL alors que la liste est initialement vide,l'ajout va etre eeffectue au debut de la liste
    return (p);//on retourne alors p qui sera parsuite la tete de la liste
    else
    pp->suiv=p;
    return(tete);
    }

    //recherche d'un element dans la liste
    int recherche(liste tete)
    {
    liste p;
    p=tete;
    int cherch;
    do
    {
    printf("entrer une matricule matricule non nulle de l'etudiant a rechercher");
    scanf("%d",&cherch);
    }
    while(cherch<1);
    while((p->info.matricule!=cherch)&&(p!=NULL))//recherche du mot dans la liste
    p=p->suiv;
    if(p==NULL)
    //si pp=NULL alors que le mot cle n'existe pas
    return(-1);
    return(0);
    }


    //tri de la liste (tri alphabetique)
    liste precedent(liste p,int m)//cette fonction cherche le precedent grace a une matricule donné
    {
    liste pp,ps;
    ps=p;
    pp=NULL;
    while((ps!=NULL)&&(ps->info.matricule<m))
    {
    pp=ps;
    ps=ps->suiv;
    }
    return(pp);
    }

    liste insertion(liste ord,liste p)//cette fonction insert un étudiant dans sa bonne position afin de garder la nuvelle liste trier
    {
    liste prec;
    prec=precedent(ord,p->info.matricule) ;
    if (prec==NULL)
    {
    p->suiv=ord;
    ord=p;
    }
    else
    {
    p->suiv=prec->suiv;
    prec->suiv=p;
    }
    return(ord);

    }

    liste tri_insertion_chaine(liste tete)//tri de la liste
    {
    liste p,aux,ord;
    ord=NULL;
    aux=tete;
    while (aux!=NULL)
    {
    p=aux;
    aux=aux->suiv;
    ord=insertion(ord,p);
    }
    return(ord);
    }

    //tri de la liste (tri numerique)
    liste precedent2(liste p,float m)
    {
    liste pp,ps;
    ps=p;
    pp=NULL;
    while((ps!=NULL)&&(ps->info.moyenne<m))
    {
    pp=ps;
    ps=ps->suiv;
    }
    return(pp);
    }

    liste insertion2(liste ord,liste p)
    {
    liste prec;
    prec=precedent2(ord,p->info.moyenne) ;
    if (prec==NULL)
    {
    p->suiv=ord;
    ord=p;
    }
    else
    {
    p->suiv=prec->suiv;
    prec->suiv=p;
    }
    return(ord);

    }
    liste tri_insertion_numerique(liste tete)//cette tri est comme la tri precedante mais son critere de tri est la moyenne
    {
    liste p,aux,ord;
    ord=NULL;
    aux=tete;
    while (aux!=NULL)
    {
    p=aux;
    aux=aux->suiv;
    ord=insertion2(ord,p);
    }
    return(ord);
    }

    //affichage des etudiant qui ont le meme nom
    liste r_list_nom(liste tete)
    {
    liste p,ps,psave;
    p=tri_insertion_chaine(tete);//tout d'abord on effectue une tri sur la liste
    psave=p;//apres la tri de la liste on aura besoin d'une variable auxiliaire qui va garder la nouvelle tete de la liste et qui sera la valeur de retour de la fonction
    int i=1;
    printf("la %d eme ensemble des etudiant qui ont le meme noms :\n",i);//on affiche la premiere ensemble
    printf("%d\n",p->info.matricule);
    ps=p;
    p=p->suiv;
    while (p!=NULL)
    {
    if(p->info.matricule!=ps->info.matricule)//dans le cas ou deux elements consecutive sont differents cela signifie qu'il ya une nouvelle ensemble
    {
    i++;
    printf("la %d eme ensemble des etudiant qui ont le meme noms :\n",i);
    }
    printf("%d\n",p->info.matricule);
    p=p->suiv;
    }
    return(psave);
    }

    //tri de la liste (tri numerique par jour de naissance)
    liste precedent3(liste p,int j,int m,int a)
    {
    int ok=1;
    liste pp,ps;
    ps=p;
    pp=NULL;
    while((ps!=NULL)&&(ok))
    {
    if ((ps->info.date_naiss.aa*400+ps->info.date_naiss.mm*20+ps->info.date_naiss.jj)<(a*400+m*20+j))//comparaison de deux date
    {
    pp=ps;
    ps=ps->suiv;
    }
    else
    ok=0;
    }
    return(pp);
    }

    liste insertion3(liste ord,liste p)
    {
    liste prec;
    prec=precedent3(ord,p->info.date_naiss.jj,p->info.date_naiss.mm,p->info.date_naiss.aa) ;
    if (prec==NULL)
    {
    p->suiv=ord;
    ord=p;
    }
    else
    {
    p->suiv=prec->suiv;
    prec->suiv=p;
    }
    return(ord);

    }
    liste tri_insertion_jour(liste tete)//cette tri est comme la tri precedante mais son critere de tri est la moyenne
    {
    liste p,aux,ord;
    ord=NULL;
    aux=tete;
    while (aux!=NULL)
    {
    p=aux;
    aux=aux->suiv;
    ord=insertion3(ord,p);
    }
    return(ord);
    }

    //affichage des etudiants qui sont nes le meme jour
    liste r_list_date(liste tete)
    {
    liste p,ps,psave;
    p=tri_insertion_jour(tete);//tout d'abord on fait une tri par jour de naissance
    psave=p;//apres la tri de la liste on aura besoin d'une variable auxiliaire qui va garder la nouvelle tete de la liste et qui sera la valeur de retour de la fonction
    int i=1;
    printf("la %d eme ensemble des etudiants qui sont nes le meme jour :\n",i);//On affiche la premiere ensemble en dehord de la boucle
    printf("%d\n",p->info.matricule);
    ps=p;
    p=p->suiv;
    while (p!=NULL)
    {
    if((p->info.date_naiss.jj!=ps->info.date_naiss.jj)||(p->info.date_naiss.mm!=ps->info.date_naiss.mm)||(p->info.date_naiss.aa!=ps->info.date_naiss.aa))//à chaque fois qu'on trouve deux elements conséqutive qui sont differents cela signifie qu'il ya une nouvelle ensemble
    {
    i++;
    printf("la %d eme ensemble des etudiants qui sont nes le meme jour est:\n",i);
    }
    printf("%d\n",p->info.matricule);
    p=p->suiv;
    }
    return(psave);
    }

    //suppression
    liste supprimer(liste tete)
    {
    liste pp,ps;//le pointeur ps va pointer sur l'element a supprimer
    int cherch;
    do
    {
    puts("entrer une matricule non nulle de l'etudiant a supprimer\n");
    scanf("%d",&cherch);
    }
    while (cherch<1);
    pp=precedent(tete,cherch);//chercher le precedent de l'element à supprimer
    if (pp==NULL)//Dans ce cas l'element a supprimer est la tete de la liste
    ps=tete;
    else
    ps=pp->suiv;
    if(ps==NULL)
    {
    printf("l'element que vous avez entrer n'existe pas dans la liste \n suppression non effectue");
    return(tete);
    }
    if (pp==NULL)
    tete=tete->suiv;
    else
    pp->suiv=ps->suiv;
    delete ps;
    printf("suppression effectue");
    return(tete);
    }

    //affichage de la liste
    void afficher(liste tete)
    {
    printf("la liste est \n\n");
    liste p;
    p=tete;
    do
    {
    affiche_etudiant(p->info);
    p=p->suiv;
    }
    while(p!=NULL);
    }

    void main()
    {
    clrscr();
    liste tete;
    tete=creer_liste();
    int rep;
    do
    {
    printf("\n\n");
    printf(" ________________________________________________________________________\n|\n");
    printf("| GEStIONAIRE ETUDIANT |\n");
    printf("|________________________________________________________________________|\n|\n");
    printf("| 1-ajouter un element au debut de la liste |\n");
    printf("| 2-ajouter un element a la fin de la liste |\n");
    printf("| 3-rechercher un etudiant dans la liste |\n");
    printf("| 4-l'ensemble des etuidants qui portent le meme le meme nom |\n");
    printf("| 5-l'ensemble des etuidants qui sont nes le meme jour |\n");
    printf("| 6-trier les etudiants alphabetiquement |\n");
    printf("| 7-trier les etudiants par moyenne |\n");
    printf("| 8-trier les etudiants par jour de naissance |\n");
    printf("| 9-supprimer un element de la liste |\n");
    printf("| 10-Affichage de la liste |\n");
    printf("| 0-QUITTER |\n");
    printf("|________________________________________________________________________|\n");
    printf("| donner le numero de votre choix |\n");
    printf("|________________________________________________________________________|\n\n");
    scanf("%d",&rep);
    switch(rep)
    {
    case 1:tete=ajout_debut(tete);
    break;
    case 2:tete=ajout_fin(tete);
    break;
    case 3: if (tete==NULL)
    printf("la liste est vide vous devez la remplir");
    else
    {
    if (recherche(tete)==0)
    printf("etudiant trouve");
    else
    printf("etudiant non trouve");
    }
    break;
    case 4:if (tete==NULL)
    printf("la liste est vide vous devez la remplir");
    else
    tete=r_list_nom(tete);
    break;
    case 5:if (tete==NULL)
    printf("la liste est vide vous devez la remplir");
    else
    tete=r_list_date(tete);
    break;
    case 6: if (tete==NULL)
    printf("la liste est vide vous devez la remplir");
    else
    {
    tete=tri_insertion_chaine(tete);
    printf("tri effectue");
    }
    break;
    case 7:if (tete==NULL)
    printf("la liste est vide vous devez la remplir");
    else
    {
    tete=tri_insertion_numerique(tete);
    printf("tri effectue");
    }
    break;
    case 8:if (tete==NULL)
    printf("la liste est vide vous devez la remplir");
    else
    {
    tete=tri_insertion_jour(tete);
    printf("tri effectue");
    }
    break;
    case 9:if (tete==NULL)
    printf("la liste est vide vous devez la remplir");
    else
    tete=supprimer(tete);
    break;
    case 10:if (tete==NULL)
    printf("la liste est vide vous devez la remplir");
    else
    afficher(tete);
    break;
    }
    }
    while(rep!=0);
    printf("\n COPY RIGHT\n\nPRODUCED BY KHOUAJA MARWEN & BEN DERMECH OUSSAMA\n\n 2009 LFI I/TD I\n\nLICENCED BY UNIVERSITY OF SCIENCE MONASTIR\n\n SPECIAL THANKS FOR MR CHTEOUI\n");
    getch();
    }

    jadaing
    Débutant
    Débutant

    Nombre de messages : 1
    Age : 27
    Localisation : tunis
    Emploi : etudiant
    Date d'inscription : 23/12/2013

    default Re: application liste chainée en C

    Message par jadaing le Lun 23 Déc - 3:07

    svp...pouvez vous me donner l’énoncé de ce programme?? svpppp!!!

      La date/heure actuelle est Mer 22 Nov - 6:36