Group project
Alone because I have not friend haha (jk)
This commit is contained in:
parent
d35439f7d3
commit
2649bc9a54
3
bac2/os/.gitignore
vendored
Normal file
3
bac2/os/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ex[0-9]
|
||||||
|
group
|
||||||
|
*.o
|
@ -2,7 +2,7 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -g -Wall
|
CFLAGS = -g -Wall
|
||||||
|
|
||||||
all: ex3 ex4
|
all: ex3 ex4 ex5 group
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
@ -16,11 +16,14 @@ ex4: ex4.o
|
|||||||
ex5: ex5.o
|
ex5: ex5.o
|
||||||
$(CC) $(CFLAGS) -o $@ $+
|
$(CC) $(CFLAGS) -o $@ $+
|
||||||
|
|
||||||
|
group: group.o
|
||||||
|
$(CC) $(CFLAGS) -o $@ $+
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o core.*
|
rm -f *.o core.*
|
||||||
|
|
||||||
mrproper: clean
|
mrproper: clean
|
||||||
rm -f ex3 ex4 ex5
|
rm -f ex3 ex4 ex5 group
|
||||||
|
|
||||||
run: ex5
|
run: group
|
||||||
./ex5
|
./group
|
||||||
|
90
bac2/os/chap2/group.c
Normal file
90
bac2/os/chap2/group.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
typedef struct node {
|
||||||
|
struct node* next;
|
||||||
|
int data;
|
||||||
|
} node_t;
|
||||||
|
|
||||||
|
//could be only `last`; by definition, `head = last->next;`
|
||||||
|
typedef struct{
|
||||||
|
node_t* head;
|
||||||
|
node_t* last;
|
||||||
|
} CIRC;
|
||||||
|
|
||||||
|
//exo
|
||||||
|
CIRC mkcircular();
|
||||||
|
void insert(CIRC* cycle, int el);
|
||||||
|
node_t* extract(CIRC* cycle);
|
||||||
|
node_t* rotateToEven(CIRC* cycle);
|
||||||
|
node_t* rotateToOdd(CIRC* cycle);
|
||||||
|
|
||||||
|
void rotate(CIRC* cycle);
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
CIRC circ = mkcircular();
|
||||||
|
insert(&circ, 42);
|
||||||
|
insert(&circ, 21);
|
||||||
|
insert(&circ, 12);
|
||||||
|
|
||||||
|
printf("rotateToEven -> %d\n", rotateToEven(&circ)->data);
|
||||||
|
printf("rotateToOdd -> %d\n", rotateToOdd(&circ)->data);
|
||||||
|
printf("rotateToOdd -> %d\n", rotateToOdd(&circ)->data);
|
||||||
|
printf("rotateToEven -> %d\n", rotateToEven(&circ)->data);
|
||||||
|
|
||||||
|
printf("--------------------------\n");
|
||||||
|
printf("extract -> %d\n", extract(&circ)->data);
|
||||||
|
printf("extract -> %d\n", extract(&circ)->data);
|
||||||
|
printf("extract -> %d\n", extract(&circ)->data);
|
||||||
|
assert(!extract(&circ));
|
||||||
|
}
|
||||||
|
|
||||||
|
CIRC mkcircular(){
|
||||||
|
return (CIRC){};
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert(CIRC* cycle, int el){
|
||||||
|
node_t* new = malloc(sizeof(node_t));
|
||||||
|
if(cycle->head == NULL)
|
||||||
|
cycle->head = cycle->last = new;
|
||||||
|
new->next = cycle->head;
|
||||||
|
new->data = el;
|
||||||
|
|
||||||
|
cycle->last->next = new;
|
||||||
|
cycle->last = new;
|
||||||
|
}
|
||||||
|
|
||||||
|
//problem with return node_t, it is the user that has to free the memory
|
||||||
|
//that he did not explicitly allocated...
|
||||||
|
node_t* extract(CIRC* cycle){
|
||||||
|
if(cycle->head == NULL || cycle->last == NULL)
|
||||||
|
return NULL;
|
||||||
|
node_t* ret = cycle->head;
|
||||||
|
if(cycle->head == cycle->last){
|
||||||
|
cycle->head = cycle->last = NULL;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
cycle->head = cycle->head->next;
|
||||||
|
cycle->last->next = cycle->head;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rotate(CIRC* cycle){
|
||||||
|
cycle->last = cycle->head;
|
||||||
|
cycle->head = cycle->head->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
node_t* rotateToEven(CIRC* cycle){
|
||||||
|
while(cycle->head->data % 2 != 0)
|
||||||
|
rotate(cycle);
|
||||||
|
return cycle->head;
|
||||||
|
}
|
||||||
|
|
||||||
|
node_t* rotateToOdd(CIRC* cycle ){
|
||||||
|
while(cycle->head->data % 2 == 0)
|
||||||
|
rotate(cycle);
|
||||||
|
return cycle->head;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user