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**) <, (node**) &rt);
PrintList((node**) <);
PrintList((node**) &rt);
destroySinglyLinkedList((node**) &head);
return 0;
}