|
|
@@ -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 */
|
|
|
|