Просмотр исходного кода

Implemented faster remove_block() for doubly linked lists.

Ioannis Koutras лет назад: 14
Родитель
Сommit
0042ec6b35
1 измененных файлов с 28 добавлено и 6 удалено
  1. 28 6
      src/linked_lists/linked_lists.c

+ 28 - 6
src/linked_lists/linked_lists.c

@@ -49,6 +49,7 @@ void push_block(void *block, void *starting_node) {
     starting_node = block;
 }
 
+#ifdef BLOCKS_IN_SLL
 void remove_block(void *block, void *starting_node) {
 
     void *current_node, *previous_node;
@@ -59,18 +60,39 @@ void remove_block(void *block, void *starting_node) {
         if(current_node == block) {
             if(current_node == starting_node) {
                 starting_node = get_next(block);
-#ifdef BLOCKS_IN_DLL
-                set_previous(starting_node, NULL);
-#endif /* BLOCKS_IN_DLL */
             } else {
                 set_next(previous_node, get_next(block));
-#ifdef BLOCKS_IN_DLL
-                set_previous(get_next(block), previous_node);
-#endif /* BLOCKS_IN_DLL */
             }
             break;
         }
         previous_node = current_node;
     }
 }
+#endif
+
+#ifdef BLOCKS_IN_DLL
+void remove_block(void *block, void *starting_node) {
+    void *previous_block, *next_block;
+
+    /* No need to traverse the list, just check if the block is the starting
+     * node of the list.
+     */
+
+    previous_block = get_previous(block);
+    next_block = get_next(block);
+
+    if(block == starting_node) {
+        starting_node = previous_block;
+    }
+
+    if(previous_block != NULL) {
+        set_next(previous_block, next_block);
+    }
+
+    if(next_block != NULL) {
+        set_previous(next_block, previous_block);
+    }
+
+}
+#endif /* BLOCKS_IN_DLL */