Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1699 connectés 

  FORUM HardWare.fr
  Programmation
  C

   Liste Chainée [DS niveau premiere année ingé]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Liste Chainée [DS niveau premiere année ingé]

n°1562254
thepsgman9​2
Posté le 18-05-2007 à 23:57:25  profilanswer
 

Bonjour. Alors voila j'ai bientot un DS [lundi] et j'ai jusque la tout tenté pour me familiariser avec les listes chainées mais il me reste un gros morceau.
J'ai compris comment les déclarer, comment les remplir (à peu pres). Je sais réaliser une fonction d'ajout en tete et d'ajout en queue.
Cependant je ne sais pas coder la fonction d'ajout a la bonne place ainsi que répondre au deux derniers exos. Je ne suis pas quelqun qui cherche a avoir les réponses et puis basta mais avoir des réponses me permettrait de comprendre beaucoup mieux les mécanismes.
Pour le dernier exercice j'ai quelques notions comme la méthode par bloc qui permet un gain en rapidité mais qui stocke des infos inutilement mais ca en reste la .
Si jamais vous pouviez m'éclaircir sur différents points qui me permmetrait d'avancer a mon ryhtme, voici le DS.
 
http://img515.imageshack.us/img515/1779/dshg2.th.jpg
 
Merci d'avance

mood
Publicité
Posté le 18-05-2007 à 23:57:25  profilanswer
 

n°1562259
thepsgman9​2
Posté le 19-05-2007 à 00:16:26  profilanswer
 

je continue a chercher et je pense avoir bon pour la question 2 de l'exercice 2:
 
// Sous-structure
typedef struct date
{
int jour;
int mois;
int année;
}t_date;
 
//infos utiles
typedef struct infos
{
char titre [50];
char auteur[25];
t_date date;
char style [20];
}t_infos;
 
//infos chainage
typedef struct chainage
{
t_infos infos;
struct chainage * suiv;
}t_chainage;
 
ainsi cela donnerait pour les questions de l'exo 3:
 
FILE *fp;
 
t_infos * pt;
pt=ancre;
 
fwrite(&(pt->infos),sizeof(t_infos),1,fp);
 
fread(&(pt->infos),sizeof(t_infos),1,fp);


Message édité par thepsgman92 le 19-05-2007 à 00:25:31
n°1562287
Taz
bisounours-codeur
Posté le 19-05-2007 à 03:48:41  profilanswer
 

ON FAIT PAS LES DEVOIRS :o

n°1562309
thepsgman9​2
Posté le 19-05-2007 à 09:58:05  profilanswer
 

oula mais je ne demande pas du tout ca, juste un peu d'aide car je bloque sur plusieurs points.
 
Par exemple comment faire l'ajout a la bonne place. Je sais deja faire l'ajout en tete et en queue:
 
t_cell * ajout_tete (t_cell* ancre, t_cell * nouvo)
{
/*Valable dans tout les cas*/
nouvo->suiv=ancre ;
ancre=nouvo ;
return ancre ;
}
 
Ajout en queue:
 
t_cell * ajout_queue (t_cell* ancre, t_cell * nouvo)
{
/*Liste Vide*/
if(ancre==NULL) ancre=nouvo ;
/*Si Liste non Vide*/
else {
pt=ancre ;
while(pt->suiv!=NULL)
{
pt=pt->suiv;
}
pt->suiv=nouvo ;
}
return ancre  
 
voila

n°1562315
Trap D
Posté le 19-05-2007 à 10:58:27  profilanswer
 

Pour l'ajout à la bonne place, tu dois travailler avec le noeud suivant du noeud courant.

n°1562323
matafan
Posté le 19-05-2007 à 11:38:21  profilanswer
 

Pour l'ajout à la bonne place, c'est exactement comme l'ajout en fin de liste à deux détails près : 1) à chaque itération tu te souviens de l'élément précédent et 2) dès que la valeur de l'élement courant dépasse celle de l'élément à insérer, tu t'arrêtes et tu insères après l'élément précédent l'élément courant.

n°1562342
thepsgman9​2
Posté le 19-05-2007 à 13:07:47  profilanswer
 

ca y est j'ai réussi a faire tout ce qui était demandé ou quasiment :)
 
Il me manque plus que la fonction supprimer  :(

n°1562353
Dumbledore
Posté le 19-05-2007 à 13:40:40  profilanswer
 

c'est comme la fonction d'ajout, mais ça fait l'inverse. spa trop dur. tu garde un pointeur sur l'élément précédent celui à supprimer, tu fais pointer le suivant de cet élément vers le noeud suivant celui à supprimer pis tu libère la mémoire occupée par le noeud à supprimer.
 
c'est niveau 1ère année de DUT Info ou DUT télécom&réseau.
 
la programmation, c'est simple : suffit de savoir faire des dessins  ;)


Message édité par Dumbledore le 19-05-2007 à 13:41:55
n°1562489
Dead Psych​o
Pika pika
Posté le 19-05-2007 à 22:39:06  profilanswer
 

héhé ca sent l'ece tout ca >< non ?
 
J'ai également un problème avec l'ajout à la bonne place je sais pas comment faire l'insertion en fait.  
T'as trouvé ?

n°1562552
thepsgman9​2
Posté le 20-05-2007 à 10:39:11  profilanswer
 

Ajout a la bonne place :
 
t_cell * ajout_bonneplace (t_cell * ancre, t_cell * nouvo)
{
t_cell * tmp ;
if(ancre==NULL) ancre=nouvo ;
else if(ancre->suiv==NULL)
{
if(ancre->val<nouvo->val) ancre->suiv=nouvo;
else ajout_tete(ancre,nouvo) ;
}
else
{
tmp=ancre ;
while ((tmp->suiv->val<nouvo->val)&&(tmp->suiv !=NULL)  
{
tmp=tmp->suiv ;
if(tmp->suiv==NULL) tmp->suiv=nouvo;
else
{
nouvo->suiv=tmp->suiv ;
tmp->suiv=nouvo ;
}


Message édité par thepsgman92 le 20-05-2007 à 10:41:00
mood
Publicité
Posté le 20-05-2007 à 10:39:11  profilanswer
 

n°1562569
exhortae
Membre du Cartel des Médecins
Posté le 20-05-2007 à 11:38:38  profilanswer
 

je ne sais pas si tu aurais le droit, mais il y aurait moyen de creer une fonction inserer (qui prend comme parametre une position p) et de le reutiliser dans les 3 fonctions de l'exo 1
 
genre ce que je faisait :
 

Code :
  1. /* --------------------------------------------------------------------------
  2.    inserer_element ()
  3.    --------------------------------------------------------------------------
  4.    Role : insere un element a la position p + 1
  5.    -------------------------------------------------------------------------- */
  6. void inserer_element (noeud_s *p_position, int x)
  7. {
  8.    /* Declaration de l'element a inserer */
  9.    noeud_s *p_element = malloc (sizeof *p_element);
  10.    if (p_element == NULL)
  11.    {
  12.       printf ("Probleme d'allocation memoire\nInsertion impossible\n" );
  13.       system ("pause" );
  14.    }
  15.    else
  16.    {
  17.       /*On lui assigne sa valeur */
  18.       p_element->val = x;
  19.       /* On fait pointer l'element a inserer sur son suivant */
  20.       p_element->p_suivant = p_position->p_suivant;
  21.       /* On fait pointer l'element precedent sur l'element a inserer */
  22.       p_position->p_suivant = p_element;
  23.    }
  24. }


 
puis appeller cette fonction a chauqe fois que t'en a besoin :
 

Code :
  1. /* --------------------------------------------------------------------------
  2.    inserer_en_tete ()
  3.    --------------------------------------------------------------------------
  4.    Role : insere un element en tete de liste
  5.    -------------------------------------------------------------------------- */
  6. void inserer_en_tete (noeud_s *p_header, int x)
  7. {
  8.    inserer_element (p_header, x);
  9. }
  10. /* --------------------------------------------------------------------------
  11.    inserer_en_fin ()
  12.    --------------------------------------------------------------------------
  13.    Role : insere un element en fin de liste
  14.    -------------------------------------------------------------------------- */
  15. void inserer_en_fin (noeud_s *p_header, int x)
  16. {
  17.    noeud_s *p_tmp = p_header;
  18.    /* on parcours la liste jusqu'au dernier element */
  19.    while (p_tmp->p_suivant != NULL)
  20.    {
  21.       p_tmp = p_tmp->p_suivant;
  22.    }
  23.    inserer_element (p_tmp, x);
  24. }
  25. /* --------------------------------------------------------------------------
  26.    inserer_ordonne ()
  27.    --------------------------------------------------------------------------
  28.    Role : Insere un element dans une liste croissante en respectant l'ordre
  29.    -------------------------------------------------------------------------- */
  30. void inserer_ordonne (noeud_s *p_header, int valeur)
  31. {
  32.    /* pointeurs temporaire pour parcourir la liste */
  33.    noeud_s *p_tmp = p_header;
  34.    while (p_tmp != NULL)
  35.    {
  36.       if (p_tmp->p_suivant == NULL || p_tmp->p_suivant->val >= valeur)
  37.       {
  38.          /* Si la liste est vide ou si on est arrive au dernier element ou
  39.             si l'element qui suit est superieur a l'element a inserer, on
  40.             doit inserer */
  41.          inserer_element (p_tmp, valeur);
  42.          /* On a effectue le traitement on sort */
  43.          break;
  44.       }
  45.       else
  46.       {
  47.          /* traitement non effectue => on avance dans la liste */
  48.          p_tmp = p_tmp->p_suivant;
  49.       }
  50.    }
  51. }


 
 
ça te simplifierait grandement la tâche (surtout que t'a pas besoin (d'après ton énoncé) de faire l'allocation ni l'affectation des valeurs du noeud.

Message cité 1 fois
Message édité par exhortae le 20-05-2007 à 12:10:06
n°1562611
Sve@r
Posté le 20-05-2007 à 13:56:40  profilanswer
 

exhortae a écrit :

je ne sais pas si tu aurais le droit, mais il y aurait moyen de creer une fonction inserer (qui prend comme parametre une position p) et de le reutiliser dans les 3 fonctions de l'exo 1
 
genre ce que je faisait :
 

Code :
  1. /* --------------------------------------------------------------------------
  2.    inserer_element ()
  3.    --------------------------------------------------------------------------
  4.    Role : insere un element a la position p + 1
  5.    -------------------------------------------------------------------------- */
  6. void inserer_element (noeud_s *p_position, int x)
  7. {
  8.    /* Declaration de l'element a inserer */
  9.    noeud_s *p_element = malloc (sizeof *p_element);
  10.    if (p_element == NULL)
  11.    {
  12.       printf ("Probleme d'allocation memoire\nInsertion impossible\n" );
  13.       system ("pause" );
  14.    }
  15.    else
  16.    {
  17.       /*On lui assigne sa valeur */
  18.       p_element->val = x;
  19.       /* On fait pointer l'element a inserer sur son suivant */
  20.       p_element->p_suivant = p_position->p_suivant;
  21.       /* On fait pointer l'element precedent sur l'element a inserer */
  22.       p_position->p_suivant = p_element;
  23.    }
  24. }


 
puis appeller cette fonction a chauqe fois que t'en a besoin :


Moi je dissocierais même l'insertion de la création histoire d'être le plus atomique possible...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

   Liste Chainée [DS niveau premiere année ingé]

 

Sujets relatifs
in array) Comment limiter une liste de newsletter aux numéros publiés?Visual Basic : copier le contenu d'une liste dans un tableau
Charger une liste à partir d'un fichierAfficher liste des mois
meilleur conteneur niveau temps d'accès[Python]Suppresion de doublons dans une liste
Traitement d'une fonction Ping avec une liste de PC ds un fichier exlliste déroulante dans sous-formulaire avec access
liste déroulante dans sous formulaire avec accesscomparer une liste de date sql avec la date today
Plus de sujets relatifs à : Liste Chainée [DS niveau premiere année ingé]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR