IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

probleme avec une liste chainée


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 0
    Points
    0
    Par défaut probleme avec une liste chainée
    bonjour a tous j'ai un probléme avec une liste chainée. ma liste contient un champs de type char et un pointeur vers l'element suivant, a chaque fois que je veux inserer une chaine je dois controller si cette chaine existe deja dans la liste. si elle existe je ne l'ajoute pas et je passe au mot suivant. les mots a inserer sont de longueur 7 et sont deja memorisés dans une matrice statique contenant par exemple l ligne. voici ce que j'ai ecrit mais ca donne rien. a la fin quand j'affiche ma liste, j'obtien juste le premier element.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    // declaration de la chaine
    typedef struct lista
    {
        char stringa[9];
        struct lista *next;
    }list;
        // les mots sont memorisés dans une matrice mat
    }
    int main(int agrc, char *argv[])
    {
       list *tete;
       tete=NULL;
       list *nouveau,*courant;
       int i,trouver=0//variable d'aide;
       for(i=0;i<l;i++)
       {
          if(tete==NULL)
          {
             nouveau=(list *)malloc(sizeof(list));
             if(nouveau==NULL)
             {// ajout en tete de la liste
                printf(stderr,"erreur allocation memoire");
                return EXIT_FAILURE;
             }
             strcpy(nouveau->stringa,mat[i]);
             nouveau->next=tete;
             tete=nouveau;
          }
          else
          {
             courant= tete;
             if(strcmp(courant->stringa,mot[i])==0)
                trouver=1;
             while(courant->next!=null)
             {
                 courant=courant->next;
                  if(strcmp(courant->stringa,mot[i])==0)
                     trouver=1;
             }
             if(trouver==0)
             { /*ca veut dire qu'on n'a pas trouve un elemetn qui se repetent donc on peut inserer mat[i]*/
                strcpy(nouveau->stringa,mat[i]);
                nouveau->next=null;
                courant->next=nouveau;
             }
          }
       }
    }
    NB: je n'obtient aucun probleme de compilation la partie de code je l'ai inseré manuellement.

    ou ai je commis l'erreur. s vous avez une idée faites moi savoir svp

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Rassure moi, ça ne compile pas ?

    Il serait bien de mettre un peu d'indentation dans ton code, ça serait un peu plus lisible.

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu ferais mieux de poster le vrai code que tu exécutes. Celui-ci ne peut pas fonctionner (une } de trop, mat[] et mot[] non défini (avec certainement en plus une confusion entre les deux) )

    PS : Si tu ne proposes pas un code correctement présenté, tu n'auras aucune réponse. J'ai fait l'indentation de ton code mais seulement pour cette fois.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 0
    Points
    0
    Par défaut voici le bon code
    Citation Envoyé par Lucien63 Voir le message
    Rassure moi, ça ne compile pas ?

    Il serait bien de mettre un peu d'indentation dans ton code, ça serait un peu plus lisible.
    voici le code merci d'avance de ton aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    typedef struct lista{
    char stringa[8];
    struct lista *next;
    }list;
    int main(int argc, char *argv[])
    { int i,j,k,l,m,n,o,trouver=0;// 7 variables int pour les 7 boucles for
    list *testa;
    testa=NULL;// tete de la liste
    list *nouveau; // pour inserer un nouveau element dans la liste
    list *courant;// pour parcourir la liste
    int s[7]; // tableau de int pour memoriser les elements entrés en ligne de commande qui ne doivent pas contenir 1 ou 0
    int count =0;//conteur pour geneere les mots
    char c[8];// chaine d'aide
        char mat[8][5]={"ABC","DEF","GHI","JKL","MNO","PQRS","TUW","WXYZ"};// matrice statique a partir de laquelle on genere tous les mots
     
    if(argc!=3){ // les arguments  doivent etre 3 le dernier  est un fichier que j'ai pas fait encore
    printf(stderr,"errore parametri");
    return EXIT_FAILURE;
    }
    for(i=0;i<strlen(argv[1]);i++)
    {
     if(argv[1][i]=='1' || argv[1][i]=='0')
     return EXIT_FAILURE;
    }
    for(i=0;i<7;i++){
    s[i]=argv[1][i]-'0';
    printf("%d\n",s[i]);}
     
     
    for(i=0;i<strlen(mat[s[0]-2]);i++){
        c[count]=mat[s[0]-2][i];
    for(j=0;j<strlen(mat[s[1]-2]);j++){
    c[count+1]=mat[s[1]-2][j];
    for(k=0;k<strlen(mat[s[2]-2]);k++){
    c[count+2]=mat[s[2]-2][k];
    for(l=0;l<strlen(mat[s[3]-2]);l++){
    c[count+3]=mat[s[3]-2][l];
    for(m=0;m<strlen(mat[s[4]-2]);m++){
    c[count+4]=mat[s[4]-2][l];
    for(n=0;n<strlen(mat[s[5]-2]);n++){
    c[count+5]=mat[s[5]-2][n];
    for(o=0;o<strlen(mat[s[6]-2]);o++){
    c[count+6]=mat[s[6]-2][o];
    c[count+7]='\0';
    if(testa==NULL){
    nouveau=(list *)malloc(sizeof(list));
    if(nouveau==NULL){
    printf(stderr,"errore allocazione memoria");
    return EXIT_FAILURE;
    }
    strcpy(nouveau->stringa,c);
    nouveau->next=testa;
    testa=nouveau;
    } // aggiungo in testa
    if(testa!=NULL){
    courant=testa;
     
    while(courant->next!=NULL){
        courant=courant->next;
        if(strcmp(courant->stringa,c)==0) trouver=1; /*je parcours la liste et je compare le champs stringa avec la chaine c si c deja existe je met trouver à 1*/}
    if(strcmp(courant->stringa,c)==0) trouver=1;// de meme
     
    if(trouver==0){//si trouver=0 ca veut dire que le mot c n'existe pas dans la liste donc je peux l'inserer
    nouveau=(list *)malloc(sizeof(list));
    strcpy(nouveau->stringa,c);
    courant->next=nouveau;
    nouveau->next=NULL;}
     
    }
     
    }
     
    }
     
     
    }
     
     
     
    }
     
     
     
     
    }
     
    }
     
    }
    // quand j'affiche la liste ca donne rien
    courant=testa;
    while(courant->next!=NULL){
    printf("%s ",courant->stringa);
    courant=courant->next;
     
    }
    return 0;
    }

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Mets-y un peu de bonne volonté : indente ton code ! C'est la deuxième fois déjà...

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par simpatico Voir le message
    voici le code merci d'avance de ton aide
    Bon, ton code non indenté est imbitable donc je ne cherche même pas à le lire. Juste 2 trucs qui m'ont sauté aux yeux

    Citation Envoyé par simpatico Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nouveau=(list *)malloc(sizeof(list));
    strcpy(nouveau->stringa,c);
    courant->next=nouveau;
    nouveau->next=NULL;
    Donc ici tu dis "insérer" un nouveau maillon. Mais si ce nouveau maillon "s'insère" (sous-entendu "au milieu"), pourquoi son next est-il à NULL ?

    Citation Envoyé par simpatico Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // quand j'affiche la liste ca donne rien
    courant=testa;
    while(courant->next!=NULL){
    printf("%s ",courant->stringa);
    courant=courant->next;
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (courant=testa; courant->next != NULL; courant=courant->next)
    	printf("%s ",courant->stringa);

    Ca ne change rien au résultat mais au moins c'est déjà plus propre quoi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 0
    Points
    0
    Par défaut
    bonjour,
    moi je n'insere pas au milieu mais seulement à la fin



    Citation Envoyé par Sve@r Voir le message
    Bon, ton code non indenté est imbitable donc je ne cherche même pas à le lire. Juste 2 trucs qui m'ont sauté aux yeux


    Donc ici tu dis "insérer" un nouveau maillon. Mais si ce nouveau maillon "s'insère" (sous-entendu "au milieu"), pourquoi son next est-il à NULL ?



    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (courant=testa; courant->next != NULL; courant=courant->next)
    	printf("%s ",courant->stringa);

    Ca ne change rien au résultat mais au moins c'est déjà plus propre quoi...

  8. #8
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Mais nom de dieu c'est quoi ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    for(i=0;i<strlen(mat[s[0]-2]);i++){
        c[count]=mat[s[0]-2][i];
    for(j=0;j<strlen(mat[s[1]-2]);j++){
    c[count+1]=mat[s[1]-2][j];
    for(k=0;k<strlen(mat[s[2]-2]);k++){
    c[count+2]=mat[s[2]-2][k];
    for(l=0;l<strlen(mat[s[3]-2]);l++){
    c[count+3]=mat[s[3]-2][l];
    for(m=0;m<strlen(mat[s[4]-2]);m++){
    c[count+4]=mat[s[4]-2][l];
    for(n=0;n<strlen(mat[s[5]-2]);n++){
    c[count+5]=mat[s[5]-2][n];
    for(o=0;o<strlen(mat[s[6]-2]);o++){
    c[count+6]=mat[s[6]-2][o];
    c[count+7]='\0';
    Je serais toi je ferais trois choses :

    1. Jeter à la poubelle ton code.
    2. Te prendre un bon tutoriel sur les listes chainées pour l'algorithmique de celle-ci.
    3. Et pour finir aller voir la documentation des manipulations de chaines en C.


    Quand t'as fait ça, tu recommences à coder tout. Met toi bien en tête que là, tu es à mille lieu d'avoir une base d'algorithmie décente.

    Bon courage

    PS : Et en option, si tu as le temps, je te conseille de lire un livre comme ça : http://www.pearson.fr/livre/?GCOI=27440100643800

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 0
    Points
    0
    Par défaut copier le contenu d'une liste dans une matrice dinamique
    aprés avoir rempli ma liste. je dois copier son contenu dans une matrice char dinamique.

    ma liste est defini ainsi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct lista{
    char stringa[8];
    struct lista *next;
    }list;
    pour copier le contenu dans une matrice vett j'ai implementé la fonction copia
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void copia(char **vett,list **testa){
    int i=0;
    list *lis;
    lis=(*testa);
    vett[i]=(char *)malloc(sizeof(char));
    if(vett[i]==NULL){
    printf("erreur allocatione memoire");
    exit(EXIT_FAILURE);
    }
    while(lis!=NULL){
    strcpy(vett[i],lis->stringa);
    i++;
    vett[i]=(char *)malloc(sizeof(char));
    lis=lis->next;
     
     
    }
    return;
    }
    dans la fonction main je definie la matrice **vett et j'appelle la fonction
    copia(vett, &testa); // testa est le pointeur sur le premier element de la liste.

    je n'obtient aucun probleme de compilation, mais a l'execution le programme se bloque. une aide svp

  10. #10
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Mais sérieusement tu te fous de qui ?

    Les personnes qui ont répondu avant t'ont demandé 2 fois d'indenter ton code et tu ne le fais toujours pas ? Et si tu ne sais pas ce que ça veut dire indenter tu prends un dictionnaire.

    Le pire chez toi c'est qu'il n'y a pas que l'indentation qui fait défaut mais c'est aussi des noms de variable qui ne veulent rien dire ( lis ? vett ? ).

    Tu ne t'es toujours pas dit que regarder l'algorithmique générale d'une liste chainée serait un gros plus ? Parce que ta structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct lista{
    char stringa[8];
    struct lista *next;
    }list;
    que tu appelles "list" et bien ce n'en est pas une ! C'est un nœud de la liste.

    Si tu codes comme TOI tu le penses sans écouter les avis des autres, tu ne produiras qu'un code d'amateur du dimanche toute ta vie. Donc INDENTE, NOMME correctement et LIS ...

    Mais pourquoi je m'embête à répondre à des membres égoïstes qui n'ont aucun respects pour les autres...

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Le pire chez toi c'est qu'il n'y a pas que l'indentation qui fait défaut mais c'est aussi des noms de variable qui ne veulent rien dire ( lis ? vett ? ).
    Ben si c'est évident. lis c'est le petit de la liste. Et vett c'est un vêtement.

    Citation Envoyé par simpatico Voir le message
    Mais pourquoi je m'embête à répondre à des membres égoïstes qui n'ont aucun respects pour les autres...
    Bah, probablement parce qu'un bon programmeur ne peut pas regarder ça sans bondir.

    Citation Envoyé par simpatico Voir le message
    aprés avoir rempli ma liste. je dois copier son contenu dans une matrice char dynamique.
    ...
    je n'obtiens aucun probleme de compilation, mais a l'execution le programme se bloque. une aide svp
    Bon, je vais faire l'effort de m'imaginer que tu es ici dans un but de t'améliorer. Ben tu vois, manipuler une liste se fait toujours mieux si tu crées aussi l'élément "liste". Donc déjà je te proposerai la structure suivante
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct s_noeud {
        char nom[8];
        struct s_noeud *next;
    } t_noeud;
     
    typedef struct {
        t_noeud *tete;
    } t_liste

    Ca peut paraitre idiot de définir une structure pour juste un seul membre mais dans les faits ça apporte un avantage indéniable
    1) dans le futur tu peux rajouter d'autres trucs comme le nombre d'éléments ou un pointeur sur l'élément courant
    2) la fonction qui aura charge d'insérer un élément (et qui peut donc modifier la tête) recevra un simple pointeur et non un pointeur double

    C'est comme pour une chemise. On peut la tenir par le col mais on la manipule mieux si on la met sur un cintre. Et le temps que tu passeras à recoder ton programme plus proprement tu le regagneras au centuple plus tard.

    Mais pour le code pourri que tu nous présentes => poubelle. Tu ne seras pas le premier à faire ça (c'est aussi là où a fini le tout premier système Unix avant d'être refait de zéro en 1968 pour donner la merveille qu'on a aujourd'hui...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Problème avec une liste chainée
    Par 0v3rb1t dans le forum C
    Réponses: 3
    Dernier message: 08/05/2007, 19h27
  2. Probleme avec une liste
    Par Papri dans le forum ANT
    Réponses: 3
    Dernier message: 14/02/2007, 15h18
  3. Probleme avec une liste chainée
    Par apen2k2 dans le forum C
    Réponses: 7
    Dernier message: 14/12/2006, 16h31
  4. petit probleme avec une liste chainée
    Par kamouminator dans le forum C
    Réponses: 26
    Dernier message: 06/11/2006, 20h18
  5. [MySQL] Problème avec une liste déroulante
    Par leloup84 dans le forum SQL Procédural
    Réponses: 19
    Dernier message: 24/01/2006, 12h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo