begin process at 2012 05 29 05:00:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Fonction recherche (listes chainées)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Fonction recherche (listes chainées)

vendredi 6 mai 2011 à 22:55:12 | Fonction recherche (listes chainées)

adri10

Bonjour à tous,

Bon voilà j'ai un gros problème avec ma fonction recherche en liste chainées. Je pensais que mon programme était correct puisqu'en le lançant une première fois, il tournait. Puis j'ai fermé mon programme et réouvert et là...plus rien, du moins pour la fonction recherche. J'ai beau chercher, je ne vois pas comment corriger ma (mes) erreur(s).

Je précise simplement que je ne fais pas de C depuis longtemps et que c'est le tout dernier programme que je ferai pour cette année, et surement le dernier tout court, vu que j'ai ce cours pour la dernière fois.

Autre précision sur le code, je sais que les prototypes de fonctions ne se mettent normalement pas dans une fonction mais mon prof avait fait comme ca pour le début de ce code et j'ai donc continué comme ça.

Merci d'avance!

Voici le code:

Code C/C++ :
#include<stdio.h>
#include<stdlib.h>

struct liste
{
       int info;
       struct liste *suiv;
};




int main()
{
   int option;
   struct liste * tete;
   int element;
   int menu();
   int creationok=0;
   int compteur;
   struct liste*creation(void);
   struct liste*ajout(struct liste*p,int n);
   struct liste * suppression (struct liste * p,int n);
   void affiche(struct liste*p);
   int comptage (struct liste * p);
   void recherche(struct liste * p,int pointeur);
   do
   {
              option=menu();
              switch(option)
              {
                            /* Création de la liste */
                             case 1 :
                                  if(!creationok)
                             {
                                  
                                  tete=creation();
                                  creationok=1;
                             }
                             break;
                             /* Encodage */
                             case 2 :
                                  if(creationok)
                                  {
                                                 printf("Entrez un element : ");
                                                 scanf("%d",&element);
                                                 tete=ajout(tete,element);
                                  }
                                  else
                                  printf("Creez d'abord une liste\n");
                                  system("pause");
                             break;
                             /* Affichage */
                             case 3 :
                                  if(creationok)
                                  {
                                                 affiche(tete);
                                                 system("pause");
                                  }
                             break;
                             /* Suppression */
                             case 4 :
                                  printf("Entrez un element a supprimer de la liste : ");
                                  scanf("%d",&element);
                                  tete=suppression(tete,element);
                             break;
                             /* Comptage */
                             case 5 :
                                  if(creationok)
                                  printf("il y a %d elements multiples du premier\n",comptage(tete));
                                  system("pause");
                                  break;
                              /* Recherche d'éléments */    
                             case 6 :
                                  printf("Entrez l'element a rechercher");
                                  scanf("%d",&element);
                                  recherche(tete,element);
                                  system("pause");
                                  break;
                                  
                             /* Fermeture */
                             case 0 :
                                  printf("Ce programme va terminer\n\n");
                                  system("pause");
                                  break;
              }
              
   }while(option !=0);
        
}

int menu(void)
{
    int option;
    do
    {
        system("cls");
        printf("0 : Terminer le programme\n");
        printf("1 : Creation d une liste\n");
        printf("2 : Ajout d'un element dans la liste\n");
        printf("3 : Affichage de la liste dans l'ordre croissant\n");
        printf("4 : Suppression d'un element de la liste\n");
        printf("5 : Comptage des elements multiples du premier\n");
        printf("6 : Recherche d'elements\n");
        scanf("%d",&option);
    }while (option>6);
    return option;
}

struct liste*creation(void)
{
       return NULL;
};

/* Ajouter un élément à la liste */

struct liste*ajout (struct liste*p, int n)
{
       struct liste*q;
       if(p!=NULL)
       {
            if(n>p->info)
            {
                            p->suiv=ajout(p->suiv,n);
                            q=p;
            }
            else
            {
                q=(struct liste*)malloc(sizeof(struct liste));
                q->info=n;
                q->suiv=p;
            }
       }
            else
            {
                q=(struct liste*)malloc(sizeof (struct liste));
                q->info=n;
                q->suiv=p;
            }
            return q;
}

/* Affichage des éléments */
void affiche(struct liste*p)
{
     if(p!=NULL)
     {
                printf("\n");
          printf(" %d ",p->info);
          affiche (p->suiv);
          printf("\n");
     }
}
            
/* Suppression d'un élément*/

struct liste * suppression (struct liste * p,int n)
{
       struct liste * q;
       
       if(p!=NULL)
       {
                  if (n>p->info)
                  {
                                p->suiv=suppression(p->suiv,n);
                                q=p;
                  }
                  else
                  if(n==p->info)
                  {
                                q=p->suiv;
                                free(p);
                  }
                  else
                  q=p;
                  return q;
       }
}

/* Comptage des éléments */

int comptage (struct liste * p)
{
    int compteur=0;
    int element=p->info;
    
    
    while (p)
    {
          if((p->info) % (element) == 0)
          compteur++;
          p=p->suiv;
    }
    return compteur;
}

/* Recherche d'un élément */

void recherche(struct liste * p,int pointeur)
{
    pointeur=0;
     while (((pointeur)!=(p->info)) || ((p->suiv) != NULL))
     {
           if ((pointeur)==(p->info))
           {
                                  p=p->suiv;
                                  printf("l'element se trouve en position %d",(pointeur));
           }
           else if((pointeur)>(p->info))
           (pointeur)++;
           else
           printf("Le nombre ne se trouve pas dans la liste mais devrait etre entre la place %d et %d\n",pointeur,(pointeur)+1);
    }
}
    
samedi 7 mai 2011 à 12:09:09 | Re : Fonction recherche (listes chainées)

patatalo

Membre Club Administrateur CodeS-SourceS
salut,

Il y a effectivement pas mal d'erreur et d'omissions. Je ne vais pas réinventer la roue, tu trouveras pas mal de code avec des exemples de listes chainées simples sur internet.

Vite fait:
initialiser la tête de liste à NULL et remplacer créationok par une fonction is_empty().

remplacer le nom de structure liste par noeud.

Si la liste n'est pas crée, la fonction recherche plantera. (fonction a revoir complètement: paramètre pointeur modifié dans la fonction ???)

Souvent, une liste est initialisée avec un noeud par défaut, cela évite pas mal de code de vérification.

Il faut vider la liste avant de quitter.

Ceci est faux:
tete=ajout(tete,element);
Tu mélanges le point d'entrée avec un noeud. Tu devrais avoir deux fonctions si tu ne crée pas un noeud par défaut dans la liste:
liste_push(struct noeud **entry, int info);
liste_ajoute(struct noeud *n, int info);

@++
samedi 7 mai 2011 à 19:34:18 | Re : Fonction recherche (listes chainées)

adri10

Bonjour et merci pour la réponse,

En fait toutes autres fonctions écrites (à part le comptage des nombres et la recherche) ont été écrites par mon prof en classe, donc en principe je n'ai pas besoin d'autres fonctions. La consigne qui nous avait été donnée était de faire ce code sans élément sentinelle.

Bref, il n'y a que la fonction recherche qui me pose problème en réalité.
lundi 9 mai 2011 à 18:18:35 | Re : Fonction recherche (listes chainées)

patatalo

Membre Club Administrateur CodeS-SourceS
re,

Je ne sais pas si ton prof se rend bien compte du gaspillage de mémoire qu'il pourrait obtenir en gerant une liste par récursivité.

Code C/C++ :
void recherche(struct noeud *p, int n)
{
    struct noeud *c = p;
    
    while (c != NULL && (n < (c->info)))
        c = c->suiv;

    if (c != NULL && n == c->info)
        printf("l'element se trouve en position %d", n);
}


@++


Cette discussion est classée dans : int, liste, printf, element, struct


Répondre à ce message

Sujets en rapport avec ce message

Passage par adresse d'un tableau de structures. [ par alekine ] Bonjour, j'ai un problème pour passer par adresse un tableau de structures. Voilà mon code:#include #define L_MAX 2struct point //la structure d'un p Comment imprimer le contenu d'une structure? [ par madalf17 ] Salut, j'aimerai savoir comment imprimer le contenu d'une structure.Voici une partie du code dont la fonction affichage, je voudrai imprimer ce que ce Trier une structure indexée [ par RootASM ] Bonjour,J'ai écrit un programme qui permet de faire des recherches, ajout, suppression sur une liste de membres.Je dois trier cette liste de nom, lors Probleme de reception dans un serveur visual C++ pour windows [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi.voici les source du client et du serveurLe Serveur Liste chainéés [ par anek971 ] Bonjour a tousEnfaite il y a déà eu un poste sur le site sur ce sujet mais ayant le mm tp a faire je me suis rendu compte ke sa fonction quitter ne ma aide petit prog c [ par mayapour ] Bonjour, Débutant en C, je souhaiterai savoir comment changer ce programme initiale (liste chainée) qui demande à l'utilisateur de choisir les optio Problème avec liste chainée [ par MasterShadows ] Bonjour à tous ,alors voilà dans le cadre de mon tp de C je dois créer une liste simplement chainée tout ce qu'il y'a de plus générique.donc on nous d probleme affichage structure [ par lil_adriano ] Slt tous le monde j'ai un souci avec l'affichage de mes structures. je dois faire la gestion d'une pizzeria.j'ai cree les structure et quelques proced Trier une liste chainée [ par ango973 ] Bonjour,J'ai un probleme avec une fonction qui doit me trier une liste chainée selon le nom mais apres le passage dans ma fonction la liste reste iden ajout d'un element à la fin d'une liste chainée [ par beatkof ] bonsoir je voudrai faire une fonction qui ajout un element à la fion d'une liste chainée et je n'y arrive pas voila ma fonction: #include #include s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales