Structures de données élémentaires dans le contexte du TP #1
Liste chaînée (Linked List) La liste chaînée permet d’insérer un élément dans une liste ordonnée d’éléments. L’ajout peut se faire n’importe où. On peut retirer n’importe lequel des éléments de la liste à tout moment.
Liste chaînée (suite) et utilisation dans le TP #1 A roger SIF1015 A ben SIF1015 A joe SIF1015 L 1-10 T joe SIF1015 Le tp1 requiert-il de la concurrence T ben SIF1015 Oui! Puisque l'accès a la liste chainée est concurrent T roger SIF1015 C'est surtout que chaque transaction est threadée A max SIF1053 A kim SIF1053 T kim SIF1053 L'énonce du tp1 est-il sur le site ftp? T max SIF1053 Non pas encore E joe SIF1015 A jim SIF1015 M 2 tiben SIF1015
Liste chaînée (suite) Initialisation des pointeurs de tête et queue de la liste chaînée head queue NULL
Liste chaînée (suite) Ajout d’un membre d’un groupe de discussion dans la liste chaînée queue head 1 roger SIF1015
Liste chaînée (suite) Ajout d’un second membre d’un groupe de discussion dans la liste chaînée head queue 1 2 ben SIF1015 roger SIF1015
Liste chaînée (suite) Ajout d’un troisième membre d’un groupe de discussion dans la liste chaînée queue head 1 2 3 ben SIF1015 roger SIF1015 joe SIF1015
Liste chaînée (suite) Ajout d’un autre membre d’un groupe de discussion dans la liste chaînée head queue 1 2 3 4 ben SIF1015 max SIF1053 roger SIF1015 joe SIF1015
Liste chaînée (suite) Ajout d’un autre membre d’un groupe de discussion dans la liste chaînée head 1 2 3 4 ben SIF1015 max SIF1053 joe SIF1015 roger SIF1015 queue 5 kim SIF1053
Liste chaînée (suite) Effacement du noeud 2 dans la liste chaînée ben head 1 2 2 3 ben SIF1015 max SIF1053 joe SIF1015 roger SIF1015 queue 4 kim SIF1053
Liste chaînée en code struct noeud { struct infoMembre membre; struct noeud *suivant; }; struct infoMembre { char ptrNick[100]; char ptrGroupe[100]; } ;
Liste chaînée en code struct noeud * findPrevCHAT(const char* ptrNick, const char* ptrGroupe){ if ((head==NULL)&&(queue==NULL)) return NULL; // liste vide struct noeud * ptr = head; //Tant qu'un item suivant dans la liste while (ptr->suivant!=NULL){ //Est-ce le predecesseur de l'item recherche? if((strcmp(ptr->suivant->membre.ptrNick,ptrNick) == 0) && (strcmp(ptr- >suivant->membre.ptrGroupe,ptrGroupe) == 0) ){ return ptr; //On retourne un pointeur sur l'item precedent } ptr=ptr->suivant; return NULL; //On retourne un pointeur NULL item non trouve
Liste chaînée en code void addItemCHAT(const char* ptrNick, const char* ptrGroupe){ //Creation de l'enregistrement en memoire struct noeud* ni = (struct noeud*)malloc(sizeof(struct noeud)); //Affectation des valeurs des champs strcpy(ni->membre.ptrNick, ptrNick); strcpy(ni->membre.ptrGroupe, ptrGroupe); if(head == NULL){ // ajout au debut de la liste vide // premier noeud ni->suivant= NULL; queue = head = ni; } else { // ajout a la fin de la liste struct noeud* tptr = queue; queue = ni; tptr->suivant = ni;
Liste chaînée en code void removeItemCHAT(const char* ptrNick, const char* ptrGroupe){ struct noeud * ptr, optr; if ((head==NULL)&&(queue==NULL)) // Voir si la liste est vide return; if((strcmp(head->membre.ptrNick,ptrNick) == 0) && (strcmp(head->membre.ptrGroupe,ptrGroupe) == 0) ){ ptr = head; // suppression du premier element de la liste } else{ ptr = findPrevCHAT(ptrNick,ptrGroupe); // Selection de l’element precedent if (ptr!=NULL){ // element trouve if(head == ptr){ // suppression de l'element de tete if(head==queue){ // un seul element dans la liste free(ptr); // Suppression du seul element de la liste queue = head = NULL; head = ptr->suivant; free(ptr);
Liste chaînée en code (suite …) else if (queue==ptr->suivant){ // suppression de l'element de queue queue=ptr; free(ptr->suivant); ptr->suivant=NULL; return; } else{ // suppression d'un element dans la liste { optr = ptr->suivant; // Pointeur sur l’element a supprimer ptr->suivant = ptr->suivant->suivant; // Brancher l’element precedent // a l’element suivant free(optr);
Liste chaînée en code void modifyItemCHAT(const int noNickGroupe, const char* ptrNick, const char* ptrGroupe){ int noentree=1; // Verification sommaire (no>0 et liste non vide) if ((noNickGroupe<1)||((head==NULL)&&(queue==NULL))) return; //Recherche de l'element a modifier struct noeud * ptr = head; //premier element while (ptr!=NULL){ //Element a modifier if (noentree==noNickGroupe){ strcpy(ptr->membre.ptrNick, ptrNick); //Affectation des valeurs des champs strcpy(ptr->membre.ptrGroupe, ptrGroupe); printf("%d: %s \t\t %s\n",noentree, ptr->membre.ptrNick, ptr->membre.ptrGroupe); } else{ ptr = ptr->suivant; noentree++;
Application gestionCHAT séquentielle
Fichier gestionCHAT_MAIN.c
Fichier gestionCHAT.c (Fonction readTransCHAT())
Fichier gestionCHAT.c (Fonction readTransCHAT())
Fichier gestionCHAT.c (Fonction readTransCHAT())
Exécution du fichier gestionCHAT_MAIN Ajout de 3 membres au groupe SIF1015 Transmission d’un message au groupe SIF1015 Transmission d’un message au groupe SIF1015
Exécution du fichier gestionCHAT_MAIN Transmission d’un message au groupe SIF1015 Transmission d’un message au groupe SIF1053 Ajout de 2 membres au groupe SIF1053 Transmission d’un message au groupe SIF1053
Exécution du fichier gestionCHAT_MAIN Suppression de joe Ajout de jim
Exécution du fichier gestionCHAT_MAIN Modification du nick de ben