Skip to content
Snippets Groups Projects
Commit b9f46a0f authored by 20041679's avatar 20041679
Browse files

added Esercizi n. 4

parent 20c6ef67
No related branches found
No related tags found
No related merge requests found
CC = clang
CFLAGS = -Wall -Wextra -g
objects = list.o person.o main.o
build: $(objects)
$(CC) $(CFLAGS) $(objects) -o main
list.o: list.c list.h
$(CC) -c $(CFLAGS) $< -o $@
person.o: person.c person.h
$(CC) -c $(CFLAGS) $< -o $@
main.o: main.c
$(CC) -c $(CFLAGS) $< -o $@
clean:
rm $(objects) main
#include <stdlib.h>
#include "list.h"
List node_alloc(void) {
return malloc(sizeof(Head));
}
void list_insert_tail(List *list, Data data) {
while (*list) {
list = &(*list)->next;
}
*list = node_alloc();
(*list)->data = data;
(*list)->next = NULL;
}
void list_insert_head(List *list, Data data) {
List next = *list;
*list = node_alloc();
(*list)->data = data;
(*list)->next = next;
}
List *list_find_ref(List *list, int (*predicate) (Data *, Data *), Data *key) {
if (*list) {
return predicate(&(*list)->data, key)
? list
: list_find_ref(&(*list)->next, predicate, key);
}
return NULL;
}
List list_filter(List list, int (*predicate) (Data *, Data *), Data *key) {
if (list) {
if (predicate(&list->data, key)) {
List new = node_alloc();
new->data = list->data;
new->next = list_filter(list->next, predicate, key);
return new;
}
return list_filter(list->next, predicate, key);
}
return NULL;
}
void list_output(List list, void (*print) (Data *)) {
if (list) {
print(&list->data);
list_output(list->next, print);
}
}
#ifndef LIST_H
#define LIST_H
#include "person.h"
typedef Person Data;
typedef struct Head {
Person data;
struct Head *next;
} Head;
typedef Head *List;
List node_alloc(void);
void list_insert_tail(List *list, Data data);
void list_insert_head(List *list, Data data);
List list_filter(List list, int (*predicate) (Data *, Data *), Data *key);
List *list_find_ref(List *list, int (*predicate) (Data *, Data *), Data *key);
void list_output(List list, void (*print) (Data *));
#endif
#include <stdio.h>
#include "person.h"
#include "list.h"
int person_is_minor_adj(Person *person, Person *_) {
(void)_;
return person_is_minor(person);
}
int person_is_adult_adj(Person *person, Person *_) {
(void)_;
return !person_is_minor_adj(person, NULL);
}
void insert(List *list) {
Person person;
puts("inserire persona");
person_input(&person);
int (*predicate) (Person *, Person *) = person_is_minor(&person)
? person_is_minor_adj
: person_is_adult_adj;
List *found;
if ((found = list_find_ref(list, predicate, NULL))) {
List next = *found;
*found = node_alloc();
(*found)->data = person;
(*found)->next = next;
} else {
list_insert_head(list, person);
}
}
List filter_relatives(List list, Person *relative) {
return list_filter(list, person_is_relative, relative);
}
int main(void) {
List list = NULL;
Person tmp;
puts("persona da inserire in fondo");
person_input(&tmp);
list_insert_tail(&list, tmp);
list_output(list, person_output);
puts("persona da inserire in testa");
person_input(&tmp);
list_insert_head(&list, tmp);
insert(&list);
list_output(list, person_output);
puts("persona parente");
person_input(&tmp);
List relatives = filter_relatives(list, &tmp);
puts("parenti");
list_output(relatives, person_output);
}
#include "person.h"
#include <string.h>
#include <stdio.h>
void person_input(Person *person) {
scanf(
"%63s %63s %u",
person->first_name,
person->last_name,
&person->age
);
}
int person_is_relative(Person *p1, Person *p2) {
return strcmp(p1->last_name, p2->last_name) == 0;
}
void person_output(Person *person) {
printf(
"nome: %s, cognome: %s, anni: %u\n",
person->first_name,
person->last_name,
person->age
);
}
int person_is_minor(Person *person) {
return person->age < 18;
}
#ifndef PERSON_H
#define PERSON_H
typedef struct {
char first_name[64];
char last_name[64];
unsigned int age;
} Person;
void person_input(Person *person);
int person_is_relative(Person *p1, Person *p2);
void person_output(Person *person);
int person_is_minor(Person *person);
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment