Advertisement
FiddleComputers

Doubly linked list essentials C

Jan 12th, 2020
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.21 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. struct noeud {
  6.    int donnees;
  7.    int id;
  8.    
  9.    struct noeud *suivant;
  10.    struct noeud *precedent;
  11. };
  12.  
  13. struct noeud *premier = NULL;
  14.  
  15. struct noeud *dernier = NULL;
  16.  
  17. struct noeud *actuel = NULL;
  18.  
  19. int taille() {
  20.    int taille = 0;
  21.    struct noeud *actuel;
  22.    
  23.    for(actuel = premier; actuel != NULL; actuel = actuel->suivant){
  24.       taille++;
  25.    }
  26.    
  27.    return taille;
  28. }
  29.  
  30. void afficherAvant() {
  31.  
  32.    struct noeud *ptr = premier;
  33.    
  34.    printf("\n[ ");
  35.    
  36.    while(ptr != NULL) {        
  37.       printf("(%d,%d) ",ptr->id,ptr->donnees);
  38.       ptr = ptr->suivant;
  39.    }
  40.    
  41.    printf(" ]");
  42. }
  43.  
  44. void afficherDerriere() {
  45.  
  46.    struct noeud *ptr = dernier;
  47.    
  48.    printf("\n[ ");
  49.    
  50.    while(ptr != NULL) {    
  51.    
  52.       printf("(%d,%d) ",ptr->id,ptr->donnees);
  53.        
  54.       ptr = ptr ->precedent;
  55.      
  56.    }
  57.    
  58. }
  59.  
  60. void insererPremier(int id, int donnees) {
  61.  
  62.    struct noeud *lien = (struct noeud*) malloc(sizeof(struct noeud));
  63.    lien->id = id;
  64.    lien->donnees = donnees;
  65.    
  66.    if(premier == NULL) {
  67.       dernier = lien;
  68.    } else {
  69.       premier->precedent = lien;
  70.    }
  71.  
  72.    lien->suivant = premier;
  73.    
  74.    premier = lien;
  75. }
  76.  
  77. void insererDernier(int id, int donnees) {
  78.  
  79.    struct noeud *lien = (struct noeud*) malloc(sizeof(struct noeud));
  80.    lien->id = id;
  81.    lien->donnees = donnees;
  82.    
  83.    if(premier == NULL) {
  84.       dernier = lien;
  85.    } else {
  86.       dernier->suivant = lien;    
  87.      
  88.       lien->precedent = dernier;
  89.    }
  90.  
  91.    dernier = lien;
  92. }
  93.  
  94. struct noeud* supprimerPremier() {
  95.  
  96.    struct noeud *tempLien = premier;
  97.    
  98.    if(premier->suivant == NULL){
  99.       dernier = NULL;
  100.    } else {
  101.       premier->suivant->precedent = NULL;
  102.    }
  103.    
  104.    premier = premier->suivant;
  105.    return tempLien;
  106. }
  107.  
  108. struct noeud* supprimerDernier() {
  109.    struct noeud *tempLien = dernier;
  110.    
  111.    if(premier->suivant == NULL) {
  112.       premier = NULL;
  113.    } else {
  114.       dernier->precedent->suivant = NULL;
  115.    }
  116.    
  117.    dernier = dernier->precedent;
  118.    
  119.    return tempLien;
  120. }
  121.  
  122.  
  123. struct noeud* supprimer(int id) {
  124.  
  125.    struct noeud* actuel = premier;
  126.    struct noeud* precedentious = NULL;
  127.    
  128.    if(premier == NULL) {
  129.       return NULL;
  130.    }
  131.  
  132.    while(actuel->id != id) {
  133.        
  134.       if(actuel->suivant == NULL) {
  135.          return NULL;
  136.       } else {
  137.          precedentious = actuel;
  138.            
  139.          actuel = actuel->suivant;            
  140.       }
  141.    }
  142.  
  143.    if(actuel == premier) {
  144.       premier = premier->suivant;
  145.    } else {
  146.       actuel->precedent->suivant = actuel->suivant;
  147.    }    
  148.  
  149.    if(actuel == dernier) {
  150.       dernier = actuel->precedent;
  151.    } else {
  152.       actuel->suivant->precedent = actuel->precedent;
  153.    }
  154.    
  155.    return actuel;
  156. }
  157.  
  158. int insererApres(int id, int nouvId, int donnees) {
  159.    struct noeud *actuel = premier;
  160.    
  161.    if(premier == NULL) {
  162.       return 0;
  163.    }
  164.  
  165.    while(actuel->id != id) {
  166.    
  167.       if(actuel->suivant == NULL) {
  168.          return 0;
  169.       }
  170.       else {
  171.          actuel = actuel->suivant;
  172.       }
  173.    }
  174.    
  175.    struct noeud *nouvLien = (struct noeud*) malloc(sizeof(struct noeud));
  176.    nouvLien->id = nouvId;
  177.    nouvLien->donnees = donnees;
  178.  
  179.    if(actuel == dernier) {
  180.       nouvLien->suivant = NULL;
  181.       dernier = nouvLien;
  182.    } else {
  183.       nouvLien->suivant = actuel->suivant;        
  184.       actuel->suivant->precedent = nouvLien;
  185.    }
  186.    
  187.    nouvLien->precedent = actuel;
  188.    actuel->suivant = nouvLien;
  189.    return 1;
  190. }
  191.  
  192. void main() {
  193.    insererPremier(1,10);
  194.    insererPremier(2,20);
  195.    insererPremier(3,30);
  196.    insererPremier(4,1);
  197.    insererPremier(5,40);
  198.    insererPremier(6,56);
  199.  
  200.    printf("\nListe (premier au dernier) : ");  
  201.    afficherAvant();
  202.    
  203.    printf("\n");
  204.    printf("\nListe (dernier au premier) : ");
  205.    afficherDerriere();
  206.  
  207.    printf("\nListe, apres suppression du premier element : ");
  208.    supprimerPremier();        
  209.    afficherAvant();
  210.  
  211.    printf("\nListe, apres suppression du dernier element : ");  
  212.    supprimerDernier();
  213.    afficherAvant();
  214.  
  215.    printf("\nListe, apres insertion apres l'id 4: ");  
  216.    insererApres(4,7, 13);
  217.    afficherAvant();
  218.  
  219.    printf("\nListe, apres suppression de l'id 4 : ");  
  220.    supprimer(4);
  221.    afficherAvant();
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement