/* Details: Single linked list manipulation functions
* Author : Vinod Sasidharan
* Date : Monday, March 21, 2011, 11.41 am
* Remarks: reverse, findNthNodeFromLast,deletedata
*/
/* Include files */
#include <stdio.h>
#include <malloc.h>
Tested on: Visual C++ 2008 Express Edition, Windows XP
* Author : Vinod Sasidharan
* Date : Monday, March 21, 2011, 11.41 am
* Remarks: reverse, findNthNodeFromLast,deletedata
*/
/* Include files */
#include <stdio.h>
#include <malloc.h>
/* typedef for meaningful name */ typedef struct singlelink node; /* The single linked list structure */ struct singlelink { int data; node *link; }; /* Function: append() * Appends the input data to the end of the linked list. * If it's the 1st node, then process it separately. */ void append(node **q, int num) { node *temp = *q,*r; r = (node *)malloc(sizeof(node)); r->data = num; r->link = NULL; //This would be the last node in list if(NULL == temp) // If it's going to be the 1st node... *q = r; else { //Traverse through the list to reach the last node while(NULL != temp->link) temp = temp->link; temp->link = r; } } /* Function: display() * Displays the linked list data on the standard output */ void display(node *temp) { printf("\nThe list: "); while(temp) { printf("%d ",temp->data); temp = temp->link; } printf("\n"); getchar(); // Wait for user. } /* Function delatbeg() * Deletes the node at the beginning of the list */ void delatbeg(node **q) { node *temp = *q; *q = temp->link; free(temp); } /* Function: addatbeg() * Adds a node at the beginning of the list with input data. */ void addatbeg(node **q,int num) { node *r; r = (node *)malloc(sizeof(node)); r->data = num; r->link = *q; *q = r; } /* Function: findNthNodeFrmLast() * Find the data in the Nth node(input) from last pos in * the list. */ void findNthNodeFrmLast(node *temp,int pos) { node *Nth = temp; int i = 0; while(temp) { if(i++ >= pos) //The core logic Nth = Nth->link; temp = temp->link; } printf("Data in position %d node from last: %d\n", pos,Nth->data); getchar(); //Wait for user... } /* Function: reverse() * Reverse the linked list. */ void reverse(node **q) { node *temp1 = *q; node *temp2 = NULL; node *temp3 = NULL; if(!temp1) return; //Sanity check while(temp1) { temp2 = temp1->link; // Save the next pointer temp1->link = temp3; // Save the previous temp3 = temp1; // Update the previous temp1 = temp2; // Update the next } *q = temp3; // Update the head node pointer. } /* Function: deletedata() * Deletes a particular data(input) from the list */ void deletedata(node **q,int data) { node *temp = *q, *old = NULL; while(temp) { if(data == temp->data) { if(*q == temp) *q = temp->link; else old->link = temp->link; free(temp); // Free the node using the free(). return; // Expected exit. } else { old = temp; temp = temp->link; } } } /* Function: Main() * Calls the single linked list manipulation functions */ int main() { /* Initialize the head node */ node *head = NULL; int i; /* Append 10 nos of data to the linked list */ for(i=0; i<10; i++) append(&head,i); /* Display the linked list */ display(head); /* Reverse the linked list & display it. */ reverse(&head); printf("The reversed list: "); display(head); /* Find Nth node from last */ findNthNodeFrmLast(head,3); /* delete a particular data */ deletedata(&head,4); printf("Delete data 4: "); display(head); /*Delete the node at the beginning of the list */ delatbeg(&head); delatbeg(&head); printf("Delete 1st two data: "); display(head); /* Add a data at the beginning of the list */ addatbeg(&head,22); addatbeg(&head,25); printf("Add 22 & 25 at beginning: "); display(head); }
Tested on: Visual C++ 2008 Express Edition, Windows XP
No comments:
Post a Comment