//fonction permettant d'insérer un processus dans la liste occupee selon une taille et une adresse int insere_occupe_nf(int a, int t, liste *l_occupe){ liste it_occupe = *l_occupe; //si la liste est vide alors on créé simplement un noeud sans suivant if(it_occupe == NULL){ *l_occupe = creer_noeud(a, t, NULL, NULL); return 1; } //si la premiere cellule de la liste a déjà une adresse supérieure à celle qu'on veut mettre, alors on créé un noeud au tout début de la liste else if(it_occupe->adresse >= a){ *l_occupe = creer_noeud(a, t, NULL, it_occupe); return 1; } else{ //sinon on parcours notre liste tant qu'on est pas arrivé à la fin et que l'adresse est inférieure while(it_occupe->suivant != NULL && (it_occupe->suivant)->adresse < a){ it_occupe = it_occupe->suivant; } //on est arrivé à la fin de la liste, on rajoute donc une cellule if(it_occupe->suivant == NULL){ it_occupe->suivant = creer_noeud(a, t, NULL, NULL); return 1; } //sinon on insere une noeud entre it_occupe et it_occupe->suivant else{ it_occupe->suivant = creer_noeud(a, t, NULL, it_occupe->suivant); return 1; } } }
NodePtr saisie_expression() { Pile* stack = creer_pile(); char c = '\0'; NodePtr tmp; while (c != '\n') { c = getchar(); switch (c) { case '+': case '*': tmp = creer_noeud(c, '\0'); tmp->right = depiler(stack); tmp->left = depiler(stack); empiler(stack, tmp); break; default: if (c >= '0' && c <= '9') // Si le caract�re saisi est un chiffre empiler(stack, creer_noeud('\0', c - '0')); // On l'empile on le convertissant en entier else if (c >= 'a' && c <= 'z') // Le caract�re est une variable empiler(stack, creer_noeud(c, '\0')); else if (c != '\n' && c != ' ') printf("Erreur de saisie.\n"); break; } } return depiler(stack); }
//fonction permettant d'ajouter une liste libre selon une adresse, une taille, une liste libre et une liste occupée liste liberer_nf(int a, int t, liste *l_libre){ liste it_libre = *l_libre; liste it_libre2 = NULL; //si la liste libre est vide alors on créé simplement un noeud if(it_libre == NULL){ *l_libre = creer_noeud(a, t, NULL, NULL); return *l_libre; } //sinon si la première cellule a déjà une adresse supérieure à celle qu'on veut mettre, on créé un zone libre au tout début de la liste else if(it_libre->adresse >= a){ *l_libre = creer_noeud(a, t, NULL, it_libre); //on fusionne éventuellement les zones libres adjacents fusion_nf(NULL, *l_libre, (*l_libre)->suivant); return *l_libre; } else{ //on se déplace pour trouver l'endroit ou il faut mettre notre zone while(it_libre->suivant != NULL && (it_libre->suivant)->adresse < a){ it_libre = it_libre->suivant; } //si le suivant est null on est à la fin de la liste donc on rajoute simplement un noeud à la fin de la liste libre et on fusionne les zone libres adjacents if(it_libre->suivant == NULL){ it_libre->suivant = creer_noeud(a, t, it_libre, NULL); fusion_nf(it_libre, it_libre->suivant, NULL); return it_libre->suivant; } else{ //sinon on insere une zone libre entre deux noeuds et on fusionne éventuellement les zones libres adjacents it_libre2 = it_libre->suivant; it_libre->suivant = creer_noeud(a, t, it_libre, it_libre2); fusion_nf(it_libre, it_libre->suivant, (it_libre->suivant)->suivant); return it_libre->suivant; } } }
// Cette fonction recherche si le noeud existe dans l'arbre, si il existe le retourne // sinon l'ajoute au réseau et à l'insere dans l'arbre Noeud* recherche_cree_noeud_abr(Reseau *R, ABRe **abr, double x, double y) { Noeud *n=creer_noeud(R->nbNoeuds++); n->x=x; n->y=y; *abr=insertion(*abr,&n); if(n->u == R->nbNoeuds-1) ajoute_au_reseau(R, n); else R->nbNoeuds--; return n; }
//fonction permettant d'ajouter une zone libre dans la liste libre donnée selon une adresse et une taille donnée liste liberer_nf(int a, int t, liste *l_libre){ liste it_libre = *l_libre; liste noeud = NULL; liste fin = NULL; //si la liste libre est vide alors on créé simplement un noeud, on fait pointer le suivant et le precedent sur lui-même puis on le retourne if(it_libre == NULL){ *l_libre = creer_noeud(a, t, NULL, NULL); (*l_libre)->precedent = *l_libre; (*l_libre)->suivant = *l_libre; return *l_libre; } //sinon si la première cellule a déjà une adresse supérieure à celle qu'on veut mettre, on créé un zone libre au tout début de la liste else if(it_libre->adresse >= a){ //on créé un noeud et on met à jour les suivant et les precedent, puis on modifie la liste libre de telle sorte qu'elle pointe sur notre nouveau noeud noeud = creer_noeud(a, t, NULL, NULL); noeud->precedent = it_libre->precedent; noeud->suivant = it_libre; it_libre->precedent = noeud; (noeud->precedent)->suivant = noeud; *l_libre = noeud; //on fusionne éventuellement les zones libres adjacents fusion_nf((*l_libre)->precedent, *l_libre, (*l_libre)->suivant); return *l_libre; } else{ //on construit un pointeur qui nous permettra d'arrêter notre boucle fin = it_libre; //on se déplace pour trouver l'endroit ou il faut mettre notre zone while(it_libre->suivant != fin && (it_libre->suivant)->adresse < a){ it_libre = it_libre->suivant; } //si le suivant est la fin, alors on ajoute un noeud à la fin de notre liste circulaire if(it_libre->suivant == fin){ noeud = creer_noeud(a, t, NULL, NULL); noeud->suivant = fin; noeud->precedent = it_libre; it_libre->suivant = noeud; fin->precedent = noeud; fusion_nf(it_libre, noeud, fin); return noeud; } else{ //sinon on insere une zone libre entre deux noeuds et on fusionne éventuellement les zones libres adjacents noeud = creer_noeud(a, t, NULL, NULL); noeud->suivant = it_libre->suivant; noeud->precedent = it_libre; it_libre->suivant = noeud; (noeud->suivant)->precedent = noeud; fusion_nf(it_libre, noeud, noeud->suivant); return noeud; } } }
int ajouterMot(ArbreBr* a, char* mot, int ligne, int ordre, int numphrase){ // Chercher si le mot est déjà présent dans l'arbre (fonciton existante) NoeudABR* noeud_temp = rechercher_noeud(a, mot); if (noeud_temp != NULL){ // Si oui, il existe ajouter position (fonction existante) if(ajouter_position(noeud_temp->positions, ligne, ordre, numphrase)) return 1; } else{ // Sinon créer nouveau noeud grâce à la fonction creer_noeud et inrecrementer nomre de mots differents a->nb_mots_differents = a->nb_mots_differents+1; noeud_temp= creer_noeud(); strcpy(noeud_temp->mot,mot); // Lui attribue le mot actuellement traité ajouter_position(noeud_temp->positions, ligne, ordre, numphrase); noeud_temp->filsGauche=NULL; noeud_temp->filsDroit=NULL; //l'insérer dans l'arbre if (a->racine==NULL){ //en tant que racine de l'arbre a->racine=noeud_temp; return 1; } else{ //insérer dans arbre en tant que noeud different de la racine NoeudABR* noeud_arbre = a->racine; NoeudABR* noeud_y = NULL; while(noeud_arbre!=NULL){ noeud_y=noeud_arbre; if(stricmp(noeud_temp->mot,noeud_arbre->mot)<0){ noeud_arbre=noeud_arbre->filsGauche; } else{ noeud_arbre=noeud_arbre->filsDroit; } } if(noeud_y==NULL){ a->racine=noeud_temp; } else{ if(stricmp(noeud_temp->mot,noeud_y->mot)<0){ noeud_y->filsGauche=noeud_temp; } else{ noeud_y->filsDroit=noeud_temp; } } //noeud_temp->filsGauche //noeud_temp->filsDroit return 1; } } }