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

Liste Chainée [DS niveau premiere année ingé] - C - Programmation

Marsh Posté le 18-05-2007 à 23:57:25    

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

Reply

Marsh Posté le 18-05-2007 à 23:57:25   

Reply

Marsh Posté le 19-05-2007 à 00:16:26    

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
Reply

Marsh Posté le 19-05-2007 à 03:48:41    

ON FAIT PAS LES DEVOIRS :o

Reply

Marsh Posté le 19-05-2007 à 09:58:05    

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

Reply

Marsh Posté le 19-05-2007 à 10:58:27    

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

Reply

Marsh Posté le 19-05-2007 à 11:38:21    

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.

Reply

Marsh Posté le 19-05-2007 à 13:07:47    

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

Reply

Marsh Posté le 19-05-2007 à 13:40:40    

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
Reply

Marsh Posté le 19-05-2007 à 22:39:06    

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é ?

Reply

Marsh Posté le 20-05-2007 à 10:39:11    

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
Reply

Marsh Posté le 20-05-2007 à 10:39:11   

Reply

Marsh Posté le 20-05-2007 à 11:38:38    

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
Reply

Marsh Posté le 20-05-2007 à 13:56:40    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed