aboutsummaryrefslogtreecommitdiff
path: root/semestre 3/structures des données/tme/tme3-5/exo1/biblioLC.c
blob: 8635b931fa94e17cb2457ccde0a106a3e18402b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "biblioLC.h"

Livre* creer_livre(int num,char* titre,char* auteur){
    Livre* l = (Livre*) malloc(sizeof(Livre));
    l->num = num;
    l->titre = strdup(titre);
    l->auteur = strdup(auteur);
    l->next = NULL;
    return l;
}

void liberer_livre(Livre* l){
    free(l->titre);
    free(l->auteur);
    free(l);
}

Biblio* creer_biblio(){
    Biblio* b = malloc(sizeof(Biblio));
    b->L = NULL;
    return b;
}

void liberer_biblio(Biblio* b){
    Livre* l = b->L;
    while (l) {
        l = l->next;
        liberer_livre(l);
    }
    free(b);
}

void inserer_en_tete(Biblio* b,int num,char* titre,char* auteur){
    Livre* l = creer_livre(num, titre, auteur);
    l->next = b->L;
    b->L = l;
}

void afficher_livre(Livre* l){
    printf("%d %s %s\n", l->num, l->titre, l->auteur);
}

void afficher_biblio(Biblio* b){
    Livre* l = b->L;
    while (l){
        afficher_livre(l);
        l = l->next;
    }
}

Livre* rechercher_biblio_num(Biblio* bib, int num){
    Livre* l = bib->L;
    while (l){
        if (l->num == num) return l;
        l = l->next;
    }
    return NULL;
}

Livre* rechercher_biblio_titre(Biblio* bib, char* titre){
    Livre* l = bib->L;
    while (l){
        if (strcmp(l->titre, titre) == 0) return l;
        l = l->next;
    }
    return NULL;
}

Biblio* rechercher_biblio_auteur(Biblio* bib, char* auteur){
    Biblio* b = creer_biblio();
    Livre* l = bib->L;
    while (l){
        if (strcmp(l->auteur, auteur) == 0) inserer_en_tete(b, l->num, l->titre, l->auteur);
        l = l->next;
    }
    return b;
}

void suppression_livre(Biblio* bib, int num, char* titre, char* auteur){
    Livre* l = bib->L;
    Livre* prec = NULL;
    while (l && l->num != num){
        prec = l;
        l = l->next;
    }
    if (!l) return;
    if (strcmp(l->auteur, auteur) != 0 || strcmp(l->titre, titre) != 0) return;

    if (!prec) bib->L = l->next;
    else prec->next = l->next;
    
    liberer_livre(l);
}

Biblio* rechercher_doublons(Biblio* bib){
    Biblio* b = creer_biblio();
    Livre* l1 = bib->L;
    Livre* l2 = bib->L;
    while (l1){
        Livre* l2 = bib->L;
        while (l2){
            if (l1->num != l2->num) {
                if (strcmp(l1->auteur, l2->auteur) == 0 && strcmp(l1->titre, l2->titre) == 0) 
                    inserer_en_tete(b, l1->num, l1->titre, l1->auteur);
            }
            l2 = l2->next;
        }
        l1 = l1->next;
    }
    return b;
}