You must have seen this or a similar algorithm in CS171:
/* ==================================================== delete(h): delete the first elem from the list h return new list ==================================================== */ public static List delete (List h) { if ( h != null ) return (h.next); // Return new list that starts at h.next else // deleting from empty list returns an empty list return null; } |
I will include this delete method in the last Java program to do inserts + deletions
class List // I want to use 1 prgram file for this example { int value; List next; } public class demo { public static void main(String[] args) { List head = null; // Empty list List p; for ( int i = 0; i < 10; i++ ) { p = new List( ); p.value = i; head = insert(head, p); // Insert p print(head); } for ( int i = 0; i < 10; i++ ) { head = delete(head); // Delete first element print(head); } } /* ========================================= insert(h, e): insert e at tail of list h return new list ========================================= */ public static List insert( List head, List e ) { /* -------------------------------------------- Base case: insert at the tail of an empty -------------------------------------------- */ if ( head == null ) { e.next = null; // Mark e as the last list elem return(e); // e is the first list elem ! } else { /* =========================================================== Solve the problem USING the solution of a smaller problem =========================================================== */ head.next = insert( head.next, e ); // Link directly to helpSol return head; // Return MY solution } } /* ==================================================== delete(h): delete the first elem from the list h return new list ==================================================== */ public static List delete (List h) { if ( h != null ) return (h.next); // Return new list that starts at h.next else // deleting from empty list returns an empty list return null; } // Print the list public static void print(List h) { while (h != null) { System.out.printf("%d ", h.value); h = h.next; } System.out.printf("\n"); } } |
I will show you the how to translate the Java method in class:
/* ==================================================== delete(h): delete the first elem from the list h return new list ==================================================== */ struct List *delete (struct List *h) { if ( h != NULL ) return (h->next); // Return new list that starts at h.next else // deleting from empty list returns an empty list return NULL; } |
I will include this delete method in the last C program to do inserts + deletions
#include <stdio.h> #include <stdlib.h> struct List // This is the List class definition in C { int value; struct List *next; }; struct List *insert( struct List *head, struct List *e ); struct List *delete (struct List *h); void print(struct List *h); // We must declare print to avoid compile error void main(int argc, char *argv[]) { struct List *head = NULL; // Nul pointer NULL instead of null struct List *p; int c = 0; while (1) { for ( int i = 0; i < 10; i++ ) { p = malloc( sizeof(struct List) ); p->value = i; head = insert(head, p); // Insert p in head print(head); } for ( int i = 0; i < 10; i++ ) { head = delete(head); // Insert p in head print(head); } printf("%d\n", ++c); } } struct List *insert( struct List *head, struct List *e ) { /* -------------------------------------------- Base case: insert at the tail of an empty -------------------------------------------- */ if ( head == NULL ) { e->next = NULL; // Mark e as the last list elem return(e); // e is the first list elem ! } else { /* =========================================================== Solve the problem USING the solution of a smaller problem =========================================================== */ head->next = insert( head->next, e ); // Link directly to helpSol return head; // Return MY solution } } /* ==================================================== delete(h): delete the first elem from the list h return new list ==================================================== */ struct List *delete (struct List *h) { if ( h != NULL ) return (h->next); // Return new list that starts at h.next else // deleting from empty list returns an empty list return NULL; } // Print the list void print(struct List *h) { while (h != NULL) { printf("%d ", h->value); h = h->next; } printf("\n"); } |
|
The first list element is "considered" as deleted:
/* ==================================================== delete(h): delete the first elem from the list h return new list ==================================================== */ struct List *delete (struct List *h) { if ( h != NULL ) { // Delete the 1st list element // by returning the 2nd element // as "head"return (h->next); else // deleting from empty list returns an empty list return NULL; } |
You must explicitly de-allocate memory obtained using malloc( ) in C !!!
|
The original delete( ) function:
/* ==================================================== delete(h): delete the first elem from the list h return new list ==================================================== */ struct List *delete (struct List *h) { if ( h != NULL ) { return (h->next); } else // deleting from empty list returns an empty list return NULL; } |
We must explicitly free(h) when we delete the 1st list element:
/* ==================================================== delete(h): delete the first elem from the list h return new list ==================================================== */ struct List *delete (struct List *h) { if ( h != NULL ) { free(h); // Caveat: free(h) may modify h->next ! return (h->next); } else // deleting from empty list returns an empty list return NULL; } |
We must explicitly free(h) when we delete the 1st list element:
/* ==================================================== delete(h): delete the first elem from the list h return new list ==================================================== */ struct List *delete (struct List *h) { if ( h != NULL ) { struct List *retVal = h->next; // Save return value free(h); // Caveat: free(h) may modify h->next ! return (retVal); } else // deleting from empty list returns an empty list return NULL; } |