scosant
12/17/2012 - 12:37 PM

singlylinkedlist_insert_and_delete

singlylinkedlist_insert_and_delete

// Copyright 2009, Scott Santarromana
// @file singlylinkedlist_insert_and_delete.c
// @created Aug 26, 2009
// @author Scott Santarromana
 
#include <stdio.h>
#include <stdlib.h>
 
/*************************
 * CONSTANTS AND STRUCTS *
 *************************/
 
const int true = 1;
const int false = 0;
 
typedef struct node {
  struct node* next;
  int data;
} node;
 
/**************
 * PROTOTYPES *
 **************/
 
// Creates and initializes a singly-linked linked list.
int createSinglyLinkedList (node** head);
 
// Destroys and deallocates the singly-linked linked list.
int destroySinglyLinkedList (node** head);
 
// Appends a new node containing "data" at the end of the list.  Returns
// "1" if successful and "0" otherwise.
int Insert (node** head, int data);
 
// Deletes the first encountered occurrence of "deleteMe".  Returns
// "1" if successful and "0" otherwise.
int Delete (node** head, int deleteMe);
 
// Prints the list contents.
void PrintList (node** head);
 
/*******************
 * IMPLEMENTATIONS *
 *******************/
 
int createSinglyLinkedList (node** head) {
  *head = NULL;
  return true;
}
 
int destroySinglyLinkedList (node** head) {
  node* next;
  while (*head) {
    next = (*head)->next;
    free(*head);
    *head = next;
  }
  return true;
}
 
int Insert (node** head, int data) {
  node* newhead = (node*) malloc(sizeof(node));
  if (!newhead) { // memory allocation for new element failed.
    return false;
  }
  newhead->data = data;
  newhead->next = *head;
  *head = newhead;
  return true;
}
 
int Delete (node** head, int deleteMe) {
  node* previousnode = *head;
  node* currentnode = previousnode->next;
  if (previousnode->data == deleteMe) { // first node contains value
    *head = previousnode->next;
    free(previousnode);
    return true;
  }
  while (currentnode) { // other node contains value
    if (currentnode->data == deleteMe) {
      previousnode->next = currentnode->next;
      free(currentnode);
      return true;
    }
    previousnode = currentnode;
    currentnode = currentnode->next;
  }
  return false;
}
 
void PrintList (node** head) {
  printf("List:  ");
  node* currentnode = *head;
  printf("%i", currentnode->data);
  currentnode = currentnode->next;
  while (currentnode) {
    printf(", %i", currentnode->data);
    currentnode = currentnode->next;
  }
 
  printf("\n\n");
}
 
/********
 * MAIN *
 ********/
 
int main (int argc, char** argv) {
  node** head;
  node **lt, **rt;
 
  createSinglyLinkedList((node**) &head);
 
  printf("Insert elements 1 through 5\n");
  Insert((node**) &head, 1);
  Insert((node**) &head, 2);
  Insert((node**) &head, 3);
  Insert((node**) &head, 4);
  Insert((node**) &head, 5);
  PrintList((node**) &head);
 
  printf("Delete occurrence of 3 (middle node)\n");
  Delete((node**) &head, 3);
  PrintList((node**) &head);
 
  printf("Add two additional occurrences of 9\n");
  Insert((node**) &head, 9);
  Insert((node**) &head, 9);
  PrintList((node**) &head);
   
  printf("Delete occurrence of 9 (first node)\n");
  Delete((node**) &head, 9);
  PrintList((node**) &head);
 
  printf("Delete occurrence of 9 (first node)\n");
  Delete((node**) &head, 9);
  PrintList((node**) &head);
 
  printf("Delete occurrence of 1 (last node)\n");
  Delete((node**) &head, 1);
  PrintList((node**) &head);
 
  printf("Delete occurrence of 2 (last node)\n");
  Delete((node**) &head, 2);
  PrintList((node**) &head);
 
  printf("Delete occurrence of 20 (nonexistent node)\n");
  Delete((node**) &head, 20);
  PrintList((node**) &head);
   
  printf("Add elements 1 through 10\n");
  int i;
  for (i = 0; i < 10; i++) {
    Insert((node**) &head, i);
  }
  PrintList((node**) &head);
 
  printf("Split at element number 5\n");
  Split((node*) head, 5, (node**) &lt, (node**) &rt);
  PrintList((node**) &lt);
  PrintList((node**) &rt);
   
  destroySinglyLinkedList((node**) &head);
  return 0;
}