Tom's Guide > Forum > Programmation > Besoin d'aide pour la résolution d'un problème en algorithmique

Besoin d'aide pour la résolution d'un problème en algorithmique

Forum Programmation : Besoin d'aide pour la résolution d'un problème en algorithmique

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Voici le Sujet:
On se propose d'écrire une fonction appelée Supprimer qui prend en argument une Liste L et retourne la liste L privée de son premier élément de tête.

Et moi ma solution :

Fonction SUPPRIMER_X(X:entier;L:liste):liste
Variable
A,B : liste
Début
Si L= NULL alors
Début
A <= NULL
Fin
Sinon
Début
Si L^.Val=X alors
Début
A <= SUPPRIMER_X(X ;L^.lien)
Fin
Sinon
Début
NOUVEAU (B)
B^.Val <= L^.Val
B^.Lien <= SUPPRIMER_X(X ;L^.lien)
A <= B
Fin
Fin
Retourner (A)
Fin

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Oulala...Ce qui est bien c'est que tu sembles faire les questions et les réponses, ce qui est moins bien c'est ta réponse. Pourquoi préciser dans le prototype X:entier, si tu veux seulement enlevé le premier élément de la liste ? Pourquoi faire un traitement récursif, qui va exploser ta mémoire si la liste est longue ? Enfin pourquoi recopier ta liste dans une aurte pour ne jamais la retourner ? Peut être que ta question c'est de supprimer le 1er élément X rencontré dans la liste ? Ma réponse dépendrait du fait que la liste soit simplement chaînée ou doublement chaînée...
Si tu précises ta question je reviendrai t'apporter une réponse plus "algorithmique".

------------------------------ A commune is where people join together to share their lack of wealth.
-- R. Stallman

 

Répondre à icecat


Attention !!! Il ya une erreur dans le sujet. Voici le bon:
On se propose d'écrire une fonction appelée Supprimer_x qui prend en argument un élément X et L une Liste et retourne la liste L privée de toutes les occurrences de X.

C’est une liste simplement liée.

Répondre à shaici

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Element {
  4.   int value;
  5.   struct Element *suivant;
  6. }Element;
  7. typedef struct Liste {
  8.         Element *debut;
  9.         Element *fin;
  10. }Liste;
  11. void addToList(Liste * liste, int num) {
  12.   Element *e = (Element*)malloc(sizeof(Element));
  13.   e->value = num;
  14.   if (liste->debut == NULL) { //La liste est vide, ajout premier element
  15.     liste->debut = e;
  16.     liste->fin = e;
  17.   } else {                    //La liste est non vide, insertion en fin
  18.     liste->fin->suivant = e;
  19.     liste->fin = e;
  20.   }
  21. }
  22. void printList(Liste * liste) {
  23.   if (liste == NULL || liste->debut == NULL) return;
  24.   Element * c = liste->debut;
  25.   while (c != NULL) {
  26.     printf("'%d'", c->value);
  27.     c = c->suivant;
  28.     if (c != NULL) {
  29.       printf(", " );
  30.     } else {
  31.       printf("\n" );
  32.     }
  33.   }
  34.   if (liste->debut != NULL)
  35.     printf("Debut = %d",liste->debut->value);
  36.   if (liste->fin != NULL)
  37.     printf(" Fin = %d",liste->fin->value);
  38.   printf("\n" );
  39. }
  40. void freeList(Liste * liste) {
  41.   if (liste == NULL) return;
  42.   Element * c = liste->debut;
  43.   while (c != NULL) {
  44.     c = c->suivant;
  45.     if (c != NULL) {
  46.       free(c);
  47.     }
  48.   }
  49.   free(liste);
  50. }
  51. void supprimerX(Liste * liste, int num) {
  52.   if (liste == NULL) return;
  53.   Element * temp = NULL;
  54.   Element * current = liste->debut;
  55.   while (liste->debut != NULL && liste->debut->value == num) {
  56.     temp = liste->debut->suivant;
  57.     free(liste->debut);
  58.     liste->debut = temp;
  59.   }
  60.   if (liste->debut == NULL || liste->debut->suivant == NULL) {
  61.     liste->fin = liste->debut;
  62.   }
  63.   while (current != NULL && current->suivant != NULL) {
  64.     if (current->suivant->value == num) {
  65.       free(current->suivant);
  66.       current->suivant = current->suivant->suivant;
  67.     }
  68.     if (current->suivant == NULL) { //Je redresse la fin au cas ou on l'ait supprimée
  69.       liste->fin = current;
  70.     }
  71.     current = current->suivant;
  72.   }
  73. }
  74. int main () {
  75.   Liste *list = (Liste*)malloc(sizeof(Liste));
  76.  
  77.   addToList(list, 2);
  78.   addToList(list, 3);
  79.   addToList(list, 5);
  80.   addToList(list, 6);
  81.   addToList(list, 2);
  82.   addToList(list, 3);
  83.   addToList(list, 8);
  84.   addToList(list, 3);
  85.   addToList(list, 2);
  86.   printList(list);
  87.   supprimerX(list, 2);
  88.   printList(list);
  89.   freeList(list);
  90.   return 0;
  91. }



Bon voilà une implémentation possible, je ne dis pas que c'est la plus clean, cependant elle a le mérite de fonctionner correctement.
Pour construire le programme je compile avec gcc : gcc -Wall list.c -o list
et je lance avec ./list sous linux.

La fonction qui t'interresse est :

Code :
  1. void supprimerX(Liste * liste, int num)


Il y a un cas particulier si le premier élément de la liste contient le nombre a supprimer. Ensuite dans le cas général on garde le pointeur sur l'élément précédent celui testé afin d'affecter l'élément suivant comme successeur au prédésseur de celui qui contient le nombre (relit lentement la phrase précédente tu verras c'est pas si compliqué que ca :)).

Bon courage.


Message édité par icecat le 10-03-2009 à 15:25:23
------------------------------ A commune is where people join together to share their lack of wealth.
-- R. Stallman

 

Répondre à icecat

Tom's Guide > Forum > Programmation > Besoin d'aide pour la résolution d'un problème en algorithmique
Aller à :

Il y a 1540 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens