The need:
This is a program to show almost all basic operations on linked lists. This program is just a combination of various programs of linked lists written by me. This is written in a way that you can pick data and function definitions and can use as-it-is in other programs.
The code:
------------------------------------------------------------
This is a program to show almost all basic operations on linked lists. This program is just a combination of various programs of linked lists written by me. This is written in a way that you can pick data and function definitions and can use as-it-is in other programs.
The code:
------------------------------------------------------------
#include<stdio.h> #include<stdlib.h> // defining data-type node struct linked_list { int num; struct linked_list *next; }; typedef struct linked_list node ; //defining datatype node //declaration of functions node *create_list(node *p); node *reverse(node *p); int count (node *p); void print(node *p); node *insert(node *p); node *find(node *p,int a); node *hatana(node *p); node *insert_sort(node *head,int n); void sort(node *p); node *rearrange(node *p); main() { int i; node *head=NULL ; printf("This is a program to do with linked list .\n\n"); lebel: printf("Options :\n(1)Create linked list.\n(2)view list.\n(3)Insert element.\n(4)Delete Element.\n"); printf("(5)To arrange list in increasing order.\n"); printf("(6)To remove double entries .\n(7)to reverse the list\n(8)Exit program.\n"); scanf("%d",&i); switch(i) { case 1 : printf("Enter element numbers .\n"); printf("Type -999 to end :\n"); head=create_list(head); printf("List created successfully .\nNumber of items in the list are %d.\n\n\n",count(head)); goto lebel; case 2 : print(head); goto lebel ; case 3 : head=insert(head); goto lebel ; case 4 : head=hatana(head); goto lebel ; case 5 : sort(head); printf("\nsorted in increasing order\n\n"); goto lebel; case 6 : rearrange(head); printf("\nduplicate entries deleted\n\n"); goto lebel; case 7 : head=reverse(head); printf("\nList reversed\n\n"); goto lebel; case 8 : exit (0); break; default: printf("Invalid Choice !!!.\n"); goto lebel ; break; } return 0; } //main ends here node *create_list(node *list) { int i; list=NULL; scanf("%d",&i); if(i!=-999) { list=(node*)malloc(sizeof(node)); list->num=i; list->next=create_list(list->next); } return list; } node *reverse(node *p) { node *temp=NULL,*rev=NULL; while(p) { temp=p; p=p->next; temp->next=rev; rev=temp; } return(rev); } int count (node *list) { if(list==NULL) return 0; else return (1+count(list->next)); //recursion } void print(node *list) { if(list==NULL) printf("The list is empty.\n\n"); else { printf("%d-->",list->num); if(list->next==NULL) printf("END\n\n\n"); else print(list->next); //recursion } } node *find(node *list, int key) //This function returns the node after which { if(list->next) { //the key is found . if(list->next->num == key) /* key found */ return(list); else if(list->next->next == NULL) /* end */ return(NULL); else find(list->next, key); } else return NULL; } node *insert(node *head) { node *new_node; /* pointer to new node */ node *n1=head; /* pointer to node preceding key node */ int key; int x; /* new item (number) to be inserted */ if(!head) { printf("\nlist is not created yet.\n\n"); return head; } printf("What value you want to insert?"); scanf("%d", &x); printf("before which key item ? (type -999 if to be inserted last) "); scanf("%d", &key); if(key==-999) /* insert new node at last*/ { while(n1->next) n1=n1->next; //navigate to last node new_node = (node *)malloc(sizeof(node)); new_node->num = x; new_node->next = n1->next; n1->next = new_node; } else if(head->num == key) /* new node is first */ { new_node = (node *)malloc(sizeof(node)); new_node->num = x; new_node->next = head; head = new_node; } else /* find key node and insert new node */ { /* before the key node */ n1 = find(head, key); /* find key node */ if(n1 == NULL&&key!=-999) printf("\n key is not found !!!\n\n"); else /* insert new node */ { new_node = (node *)malloc(sizeof(node)); new_node->num = x; new_node->next = n1->next; n1->next = new_node; } } return head; } node *hatana(node *list) { void delete_node(node *); node *n1,*n2; int key; if(!list) { printf("\nlist is not created yet.\n\n"); return list; } printf("What value do you want to delete ?"); scanf("%d",&key); if(key==list->num) //key is the first node { n2=list->next; free(list); list=n2; printf("\n%d is deleted successfully .\n\n",key); } else { n1=find (list ,key); if(n1) { delete_node(n1); //This function deletes n1->next printf("\n%d is deleted successfully .\n\n",key); } else printf("\nItem is not in the list !!! \n\n\n"); } return(list); } void delete_node(node *list) //This function deletes list->next { node *n2; n2=list->next->next; free(list->next); list->next=n2; } node *rearrange(node *list) { node *p1; sort(list); for(p1=list;p1->next!=NULL;p1=p1->next) { if(p1->num==p1->next->num) delete_node(p1); } return(list); } void sort(node *list) { void exchange(int *s1,int *s2); node *p,*q; for(p=list;(p->next)!=NULL;p=p->next) for(q=list;(q->next)!=NULL;q=q->next) { if(q->num > q->next->num) //simple bubble sort exchange(&(q->num),&(q->next->num)); } } void exchange(int *s1,int *s2) { int temp; temp =*s1; *s1=*s2; *s2=temp; }------------------------------------------------------------
Remarks:
This program has a small bug try and find out.
in the funtion create_list what is the use of parameter as we are passing null everytime and then again setting it to null
ReplyDelete