1+ //AN IMPROVED IMPLEMENTATION OF LINKED LISTS WITH SEPARATE FUNCTIONS FOR OPERATIONS// 
2+ #include <stdio.h> 
3+ #include <stdlib.h> 
4+ struct  node {
5+ int  i ;
6+ struct  node  * next ;
7+ };
8+ struct  node  * insertNodeEnd (struct  node * , int );
9+ struct  node  * insertNodeBeg (struct  node * , int );
10+ struct  node  * insertAfter (struct  node * , int ,int );
11+ struct  node  * deleteNode (struct  node * , int );
12+ struct  node  * reverseList (struct  node  * head );
13+ void  displayList (struct  node * );
14+ void  deleteList (struct  node * );
15+ 
16+ int  main (){
17+ struct  node *  head  =  NULL ; //HEADER FOR LIST 
18+ int  n ,data ;
19+ printf ("Enter the number of nodes you want to create: " );
20+ scanf ("%d" ,& n );
21+ while (n -- ){
22+ printf ("Enter the data: " );
23+ scanf ("%d" ,& data );
24+ head  =  insertNodeEnd (head ,data );
25+ }
26+ //head = insertNodeBeg(head,100); 
27+ //displayList(head); 
28+ //head = insertAfter(head,3,89); 
29+ displayList (head );
30+ //head = deleteNode(head,5); 
31+ head  =  reverseList (head );
32+ displayList (head );
33+ deleteList (head );
34+ return  0 ;
35+ }
36+ 
37+ struct  node  * insertNodeEnd (struct  node *  head ,int  data ){
38+ struct  node *  temp ,p ;
39+ temp  =  head ;
40+ struct  node *  newNode  =  (struct  node * )malloc (sizeof (struct  node ));
41+ newNode -> i  =  data ;
42+ newNode -> next  =  NULL ;
43+ if (head == NULL ){
44+ head  =  newNode ;
45+ }else {
46+ while (temp -> next != NULL ){
47+ temp = temp -> next ;
48+ }
49+ temp -> next  =  newNode ;
50+ }
51+ return  head ;
52+ }
53+ struct  node  * insertNodeBeg (struct  node  * head , int  data ){
54+ struct  node  * newNode  =  (struct  node  * )malloc (sizeof (struct  node ));
55+ newNode -> next  =  head ;
56+ newNode -> i  =  data ;
57+ head  =  newNode ;
58+ return  head ;
59+ }
60+ struct  node  * insertAfter (struct  node  * head , int  pos , int  data ){
61+ struct  node  * newNode  =  (struct  node  * )malloc (sizeof (struct  node ));
62+ struct  node  * temp  =  head ;
63+ newNode -> i  =  data ;
64+ int  i  = 0 ;
65+ while (i < (pos - 1 )){
66+ temp  =  temp -> next ;
67+ i ++ ;
68+ }
69+ newNode -> next  =  temp -> next ;
70+ temp -> next  =  newNode ;
71+ return  head ;
72+ }
73+ void  displayList (struct  node *  head ){
74+ struct  node *  temp ;
75+ temp  =  head ;
76+ if (temp != NULL ){
77+ printf ("%d -> " ,temp -> i );
78+ displayList (temp -> next );
79+ }
80+ }
81+ void  deleteList (struct  node  * head ){
82+ struct  node  * temp ;
83+ while (head -> next != NULL ){
84+ temp  =  head ;
85+ free (temp -> next );
86+ head  =  head -> next ;
87+ }
88+ free (head -> next );
89+ }
90+ struct  node  * deleteNode (struct  node *  head , int  pos ){
91+ struct  node  * temp  =  head ;
92+ struct  node  * pp  =  NULL ;
93+ ////// IF 1st node is deleted 
94+ if (pos == 1 ){
95+ head  =  head -> next ;
96+ free (temp );
97+ }else {
98+ int  i  =  0 ;
99+ while (i < (pos - 2 )){
100+ temp = temp -> next ;
101+ i ++ ;
102+ }
103+ if ((temp -> next )-> next  !=  NULL ){
104+ pp  =  (temp -> next )-> next ;
105+ free (temp -> next );
106+ temp -> next  =  pp ;
107+ }else {
108+ free (temp -> next );
109+ temp -> next  =  NULL ;
110+ }
111+ }
112+ return  head ;
113+ }
114+ struct  node  * reverseList (struct  node  * curr ){
115+ struct  node  * prev  =  NULL , * nextNode  =  NULL ;
116+ while (curr ){
117+ nextNode  =  curr -> next ;
118+ curr -> next  =  prev ;
119+ prev  =  curr ;
120+ curr  =  nextNode ;
121+ }
122+ return  prev ;
123+ }
0 commit comments