TP_9 exo1: split the linked list implementation into reusable code
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 28 Feb 2017 14:46:15 +0000 (15:46 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 28 Feb 2017 14:46:15 +0000 (15:46 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
TP_9/exo1/Makefile [new file with mode: 0644]
TP_9/exo1/clist.c [new file with mode: 0644]
TP_9/exo1/clist.h [new file with mode: 0644]
TP_9/exo1/exo1.c [new file with mode: 0644]

diff --git a/TP_9/exo1/Makefile b/TP_9/exo1/Makefile
new file mode 100644 (file)
index 0000000..4db03fb
--- /dev/null
@@ -0,0 +1,31 @@
+TARGET = exo1
+LIBS =
+CC = gcc
+# Enforce C11 ISO standard for now
+CFLAGS = -std=c11 -g -Wall -Wextra
+LDFLAGS = -g -Wall -Wextra
+
+.PHONY: default all clean
+
+default: $(TARGET)
+all: default
+
+OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
+HEADERS = $(wildcard *.h)
+
+%.o: %.c $(HEADERS)
+       $(CC) $(CFLAGS) -c $< -o $@
+
+.PRECIOUS: $(TARGET) $(OBJECTS)
+
+$(TARGET): $(OBJECTS)
+       $(CC) $(OBJECTS) $(LDFLAGS) $(LIBS) -o $@
+
+clean:
+       -rm -f $(TARGET) $(OBJECTS) 
+
+disassemble: $(TARGET)
+       objdump -d $< | less
+
+symbols: $(TARGET)
+       objdump -t $< | sort | less
diff --git a/TP_9/exo1/clist.c b/TP_9/exo1/clist.c
new file mode 100644 (file)
index 0000000..69fd8cc
--- /dev/null
@@ -0,0 +1,51 @@
+#include <stdlib.h>
+
+#include "clist.h"
+
+link_t* list_new(int value) {
+    link_t* link_t_new;        
+    link_t_new = malloc(sizeof(link_t));
+    link_t_new->value = value;
+    link_t_new->next = NULL;
+    return link_t_new;
+}
+
+void list_append(link_t* head, int value) {
+       
+    while (head->next != NULL) {
+       head = head->next; 
+    }
+    head->next = list_new(value);
+}
+
+unsigned list_count(link_t* head) {
+    // And if head is not defined? 
+    int count = 1;
+
+    while (head->next != NULL) {
+        ++count;
+        head = head->next;
+    } 
+    return count;
+}
+
+int list_get(link_t* head, unsigned index) {
+    
+    if (index < list_count(head)) {
+        for (unsigned i = 0; i < index; i++) {
+            head = head->next; 
+        }
+        return head->value;
+    } else { 
+        return -1;
+    }
+}
+
+void list_clear(link_t* link) {
+
+    while (link != NULL) {
+        link_t* next_link = link;
+        free(link);
+        link = next_link;
+    }
+}
diff --git a/TP_9/exo1/clist.h b/TP_9/exo1/clist.h
new file mode 100644 (file)
index 0000000..02a59be
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef CLIST_H
+#define CLIST_H
+
+/** Linked list of int */
+typedef struct link_s {
+    int value;
+    struct link_s* next;
+} link_t;
+
+link_t* list_new(int value); 
+void list_append(link_t* head, int value); 
+unsigned list_count(link_t* head);
+int list_get(link_t* head, unsigned index);
+void list_clear(link_t* link);
+
+#endif /* CLIST_H */
diff --git a/TP_9/exo1/exo1.c b/TP_9/exo1/exo1.c
new file mode 100644 (file)
index 0000000..e70d29b
--- /dev/null
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+#include "clist.h"
+
+int main() {
+    link_t* head = list_new(1);
+    printf("Longueur de la liste: %d\n", list_count(head));
+    list_append(head, 2);
+    list_append(head, 3);
+    list_append(head, 4);
+    printf("Longueur de la liste: %d\n", list_count(head));
+    printf("Valeur a index %d: %d\n", 2, list_get(head, 2));
+    printf("Valeur a index %d: %d\n", 3, list_get(head, 3));
+    printf("Valeur a index %d: %d\n", 4, list_get(head, 4));
+    list_clear(head);
+
+    return 0;
+}