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

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

Travail en C

 
n°56323
Magniacx
Posté le 08-03-2007 à 15:27:44  profilanswer
 

Bonjour,  
 
J'ai reçu un petit travail à faire en C mais je vois pas du tout comment faire, voici les spécifications :
 
La question est d'implémenter ces fonctions ...
 

Code :
  1. //****************************************************************************
  2. //** Définition de Vélos
  3. //****************************************************************************
  4. #ifndef VELOS_H
  5. #define VELOS_H
  6. struct velonode { // noeud de la liste chaînée de vélos.
  7.   int numero; // numéro du vélo représenté par ce noeud
  8.   int nbtours; // nombre de tours effectués par le vélo
  9.   struct velonode *next; // noeud suivant de la liste
  10. };
  11. struct velolist { // liste chaînee de vélos
  12.   struct velonode *first; // premier noeud de la liste
  13. };
  14. // ARGUMENTS: liste - une liste chaînée de vélos
  15. // PRE: liste est un pointeur vers une zône de mémoire dûment allouée, mais
  16. //      non initialisée.
  17. // POST: liste représente la liste vide (liste pointe vers une  
  18. //       structure velolist a laquelle aucun velonode n'est attaché).
  19. void initList(struct velolist *liste);
  20. // ARGUMENTS: liste - une liste chaînée de vélos
  21. // PRE: liste a déjà été initialisée par le passé (via initList);  
  22. //      elle est ou n'est pas vide
  23. // POST: liste représente la liste vide. Attention aux pertes de mémoire...
  24. void emptyList(struct velolist *liste);
  25. // ARGUMENTS: liste - une liste chaînée de vélos
  26. //            num - un numéro de vélo
  27. // PRE: liste a déjà été initialisée par le passé (via initList)
  28. // POST: si num n'était pas dans la liste, un vélo de numéro num et  
  29. //       ayant effectué 1 tour est ajouté dans liste,
  30. //       sinon, 1 tour est ajouté au nombre de tours du vélo num
  31. void addVelo(struct velolist *liste, int num);
  32. // ARGUMENTS: liste - une liste chaînée de vélos
  33. //            num - un numéro de vélo
  34. // PRE: liste a déjà été initialisée par le passé (via initList)
  35. // POST: le vélo de numéro num ne fait pas partie de la liste chaînée liste
  36. void remove(struct velolist *liste, int num);
  37. // ARGUMENTS: liste - une liste chaînée de vélos
  38. // RETURN : le numéro du vélo ayant le plus de tours dans la liste, ou -1 si  
  39. //          la liste ne contient pas de vélo.
  40. // PRE: liste a deja été initialisée par le passé (via initList)
  41. // POST: liste reste inchangée
  42. int getFirst(struct velolist *liste);
  43. #endif // VELOS_H

n°56324
LostSoul
Manieur de hache
Posté le 08-03-2007 à 15:32:32  profilanswer
 

Oh le bel énoncé :love:


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56325
Ashe
reenignE esreveR
Posté le 08-03-2007 à 15:36:57  profilanswer
 

En gros tu veux savoir comment faire une liste chainee?
(parce que bon que ce soit un velo ou une Twingo tunee...)


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56326
LostSoul
Manieur de hache
Posté le 08-03-2007 à 15:44:53  profilanswer
 

Berlingo :o
 
velolist est une structure qui contient juste un pointeur first  
first pointe vers une structure velonode qui contient les caracs du vélo ET un pointeur vers une autre structure velonode qui est le vélo suivant
 
donc ...
 
dans la première fonction il te dit que liste est déjà allouée, donc liste pointe vers une structure velolist mais la zone mémoire en question est dans un "état indéterminé", poure représenter une liste vide, tu dois juste remplir first avec null
 
dans la 2e fonction, exemple classique de désallocation d'une liste : tu reçois un pointeur vers une structure velolist : si y'a un premier, tu lis le premier, tu regardes si y'a un next, si y'a un next tu désaloues tout ce qu'il y a dessous (ptite fonction annexe à écrire) puis tu désalloues le 1er et tu fous liste->first à null ...
 
Pour le reste tu réfléchis :p


Message édité par LostSoul le 08-03-2007 à 15:45:26

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56327
Magniacx
Posté le 08-03-2007 à 15:49:55  profilanswer
 

J'ai bien compri le fonctionnement, en Java je l'aurais fait avec un objet qui a comme données le numéro du vélo et un autre objet (le suivant), comment écrire ça en C ?
 
J'ai pensé à un tableau pour les éléments de vélonode ... mais dans un tableau tous les éléments doivent être du même type ... donc pas d'int et de pointeurs en même temps ?
 
Comment faire ?

n°56328
Ashe
reenignE esreveR
Posté le 08-03-2007 à 15:53:49  profilanswer
 

En java t'as deja des conteneurs et pas de pointeur donc on s'en fout...
Et y a pas de tableau non plus
T'as un premier velonode * qui est NULL quand la liste est vide, apres chaque fois que tu rajoutes un element tu utilises le next


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56329
LostSoul
Manieur de hache
Posté le 08-03-2007 à 16:01:56  profilanswer
 

en C faut faire des malloc(sizeof(velonode)) pour chaque noeud à créer et des mfree(pointeur) pour les jeter :sol:
 
NB : franchement comme méthode d'implémentation pour velolist / velonode cay un peu pourri (le pointeur next dans la structure même ...)
 
Fonction 3 spas compliqué tu parcours tes next next tant que t'arrives pas à la fin et que numero est différent du num passé. Quand tu sors de ta boucle, 2 cas possibles
- t'es arrivé en fin de liste, tu dois donc créer un nouvel élément (malloc) puis le lier au dernier
- t'est pas arrivé en fin de liste, tu pointes donc sur le bon vélo, tu incrémentes nbtours


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56330
Ashe
reenignE esreveR
Posté le 08-03-2007 à 16:05:27  profilanswer
 

(y a pas d'm devant free)
Et le next est toujours dans la structure meme, sinon spa une liste chainee


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56331
LostSoul
Manieur de hache
Posté le 08-03-2007 à 16:12:48  profilanswer
 

typedef struct {
   void *obj;
   NODE *next
} NODE;

 

NODE *first = null;

 

spas bon comme ca ?

 

comme ca dans le void* tu fous ce que tu veux c'est indépendant du mécanisme de la liste


Message édité par LostSoul le 08-03-2007 à 16:13:23

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56332
Ashe
reenignE esreveR
Posté le 08-03-2007 à 16:16:28  profilanswer
 

Si t'as envie de passer ton temps a devoir assigner a une autre variable ou caster + faire 2 allocations au lieu d'une...


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°56333
LostSoul
Manieur de hache
Posté le 08-03-2007 à 16:19:34  profilanswer
 

bah si j'veux faire une liste de bus demain pour The El ... j'pourrai même rajouter la liste chaînée de passagers :p
Sinon oui faut caster et faire 2 allocs et ca va prendre plus de place en mémoire ... Enfin on s'écarte du sujet initial


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64

Aller à :
Ajouter une réponse