Professional Documents
Culture Documents
PONMAR, CHENNAI-48
Lab Manual
1. Implement singly and doubly linked lists. 2. Represent a polynomial as a linked list and write functions for polynomial addition. 3. Implement stack and use it to convert infix to postfix expression 4. Implement a double-ended queue (dequeue) where insertion and deletion operations are possible at both the ends. 5. Implement an expression tree. Produce its pre-order, in-order, and postorder traversals. 6. Implement binary search tree. 7. Implement insertion in AVL trees. 8. Implement priority queue using binary heaps 9. Implement hashing with open addressing. 10. Implement Prim's algorithm using priority queues to find MST of an undirected graph. Total: 45
List of Equipments and components for A Batch of 30 students (1 per batch) 1. SOFTWARE REQUIRED TURBOC version 3 or GCC version 3.3.4. 2. OPERATING SYSTEM WINDOWS 2000 / XP / NT OR LINUX 3. COMPUTERS REQUIRED 30 Nos. (Minimum Requirement : Pentium III or 4.Pentium IV with 256 RAM and 40 GB harddisk)
Ex.no:1(a)
AIM:
To write a C program to create a singly linked list and to insert, delete, modify, display and count the elements in the list.
ALGORITHM:
If no,then print rollno doesnt exist Step 2.4: If choice is 2 then Step 2.4.0: if head==NULL then Print SLL is empty Step 2.4.1: if head!=NULL then Using for loop print the no of elements and rollno in the list. Step 2.5: if choice is 3 then Step 2.5.0: Assign memory for newnode and get data for it. Step 2.5.1: if head==NULL then Assign head=newnode Assign last=head Step 2.5.2 if head!=NULL then Assign newnode->link=head; Assign head=newnode; Step 2.6: if choice is 5 then Step 2.6.0: Assign memory for newnode and get data for it. Step 2.6.1: if head==NULL then Assign head=newnode Step 2.6.2: if head !=NULL then Using the for loop traverse the list till the last node If lastnode link field is NULL,then Assign newnode->link=NULL Assign last->link=newnode Step 2.7: if choice is 6 then Step 2.7.0: if head==NULL then Print SLL is empty Step 2.7.1: if head !=NULL then Get the rollno after which insertion to be made Using for loop check the given rollno is matching with rollno in the list If yes, get the newnode value then Assign newnode->link=curr->link
Assign curr->link=newnode If no, then print rollno not found Step 2.8: if choice is 7 then Step 2.8.0: if head==NULL then Print SLL is empty Step 2.8.1: if head!=NULL then Assign delnode=head and head=head->link print the deleted rollno from the list step 2.9: if choice is 8 then Step 2.9.0: if head==NULL then Print SLL is empty Step 2.9.1: if head!=NULL then Traverse the list till the last node using for loop Check whether the head->link==NULL If yes, assign delnode=head and head=NULL If no, assign last=head Using while loop check whether all nodes linkfield!=NULL in the list if yes, assign prev=last and last=last->link if no, assign delnode=last and prev->link=NULL print the rollno deleted from the list step 2.10: if choice is 9 then Step 2.10.0: if head==NULL then Print SLL is empty Step 2.10.1: assign curr=head Step 2.10.2: read the rollno for deletion Step 2.10.3: using for loop check whether the given rollno matching with the rollno in the list if yes, assign delnode=curr then check if curr==head if yes, assign head=head->link
if no, assign prev->link=curr->link print the rollno deleted from the list if no, print rollno not found step 2.11: print end of the program step 2.12: stop the program.
{ fflush(stdin); printf("\n\n?"); scanf("%d",&ch); switch(ch) { case 0:displaymenu(); break; case 1:head=NULL; do { newnode=getnode(); readnode(newnode); if(head==NULL) { head=newnode; last=head; } else { last->link=newnode; last=newnode; } printf("\nDo you wish to continue:"); ch=getch(); } while((ch=='Y')||(ch=='y')); break; case 2:if(head==NULL) { printf("\nSLL is empty"); break; } printf("\nEnter the roll no for modification:"); scanf("%d",&moddata); for(curr=head;curr!=NULL;curr=curr->link) if(curr->roll==moddata) { printf("\nEnter the new roll:"); scanf("%d",&curr->roll); break; } if(curr==NULL) printf("\nRoll not found"); break; case 3: if(head==NULL)
{ printf("\nSLL is empty"); break; } for(count=0,curr=head;curr!=NULL;curr=curr->link) printf("\n%d-->Roll No:%d",++count,curr->roll); printf("\nNo of elements:%d",count); break; case 4:newnode=getnode(); readnode(newnode); newnode->link=head; head=newnode; break; case 5:newnode=getnode(); readnode(newnode); if(head==NULL) { head=newnode; break; } for(last=head;last->link!=NULL;last=last->link); newnode->link=NULL; last->link=newnode; break; case 6:if(head==NULL) { printf("\nSLL is empty"); break; } printf("\nEnter the roll no after which the insertion is to be made:"); scanf("%d",&data); for(curr=head;curr!=NULL;curr=curr->link) if(curr->roll==data) { newnode=getnode(); readnode(newnode); newnode->link=curr->link; curr->link=newnode; break; } if(curr==NULL) printf("\nRoll No not found"); break; case 7:if(head==NULL) { printf("\nSLL is empty");
break; } delnode=head; head=head->link; printf("\nDeleted data is..."); printf("\nRoll No:%d",delnode->roll); releasenode(delnode); break; case 8:if(head==NULL) { printf("\nSLL is empty"); break; } for(curr=head;curr->link!=NULL;curr=curr->link); if(head->link==NULL) { delnode=head; head=NULL; } else { last=head; while(last->link!=NULL) { prev=last; last=last->link; } delnode=last; prev->link=NULL; } printf("\nDeleted data is...."); printf("\nRoll No:%d",delnode->roll); releasenode(delnode); break; case 9:if(head==NULL) { printf("\nSLL is empty"); break; } curr=head; printf("\nEnter the roll no for deletion:"); scanf("%d",&deldata); for(;curr!=NULL;prev=curr,curr=curr->link) { if(curr->roll==deldata) {
delnode=curr; if(curr==head) head=head->link; else prev->link=curr->link; printf("\nDeleted data is...."); printf("\nRoll No:%d",curr->roll); releasenode(delnode); break; } } if(curr==NULL) printf("\nRoll No not found"); break; default:releasenode(head); printf("\nEnd of the program"); exit(0); }}} void displaymenu() { printf("\nBasic operation in Singly Linked List"); printf("\n1.Create List"); printf("\n2.Modify List"); printf("\n3.View List"); printf("\n4.Insert First"); printf("\n5.Insert Last"); printf("\n6.Insert Middle"); printf("\n7.Delete First"); printf("\n8.Delete Last"); printf("\n9.Delete Middle"); printf("\n0.Show Menu"); printf("\n10.Exit"); } node *getnode() { return(node*)malloc(sizeof(node)); } void readnode(node *newnode) { printf("\nEnter the roll no:"); scanf("%d",&newnode->roll); newnode->link=NULL; } void releasenode(node *newnode) { free(newnode); }
10
Ex.no:1(b)
AIM:
To write a C program to create a singly linked list and to insert, delete, modify, display and count the elements in the list.
ALGORITHM:
11
Step 2.4.0: if head==NULL then Print DLL is empty Step 2.4.1: if head!=NULL then Using for loop print the no of elements and rollno in the list. Step 2.5: if choice is 4 then Step 2.5.0: Assign memory for newnode and get data for it. Step 2.5.1: assign newnode->flink=head Step 2.5.2 if head!=NULL then Assign newnode->blink=head Assign head=newnode Step 2.6: if choice is 4 then Step 2.6.0: Assign memory for newnode and get data for it. Step 2.6.1: if head==NULL then Assign head=newnode Assign last=newnode Step 2.6.2: if head !=NULL then Using the for loop traverse the list till the last node If lastnode link field is NULL,then Assign newnode->blink=last Assign last->flink=newnode Step 2.7: if choice is 6 then Step 2.7.0: if head==NULL then Print DLL is empty Step 2.7.1: if head !=NULL then Get the rollno after which insertion to be made Using for loop check the given rollno is matching with rollno in the list If yes, get the newnode value then Assign next=curr->flink Assign newnode->flink=next Assign newnode->blink=curr Assign curr->link=newnode
12
If next!=NULL then Assign next->blink=newnode If no, then print rollno not found Step 2.8: if choice is 7 then Step 2.8.0: if head==NULL then Print DLL is empty Step 2.8.1: Assign delnode=head and head=head->flink Step 2.8.2: if head!=NULL Assign head->blink=NULL Step 2.8.3: print the deleted rollno from the list Step 2.9: if choice is 8 then Step 2.9.0: if head==NULL then Print DLL is empty Step 2.9.1: if head!=NULL then Traverse the list till the last node using for loop Assign delnode=last Step 2.9.2: check whether last=head If yes, Assign head=NULL If no, assign prev=last->blink If yes, assign delnode=head and head=NULL If no, assign last=head Step 2.9.3: assign prev->flink=NULL Step 2.9.4: print the rollno deleted from the list
Step 2.10: if choice is 9 then Step 2.10.0: if head==NULL then Print DLL is empty Step 2.10.1: read the rollno for deletion Step 2.10.2: using for loop check whether the given rollno matching with the rollno in the list if yes, assign delnode=curr then
13
check if curr==head if yes, assign head=head->flink check if head!=NULL if yes, assign head->blink=NULL if no, assign prev=curr->blink assign next=curr->flink assign prev->flink=next print the rollno deleted from the list if next!=NULL then assign next->blink=prev print the deleted value step 2.11: print end of the program step 2.12: stop the program.
14
struct list *flink,*blink; }node; void displaymenu(); node *getnode(); void readnode(node*); void releasenode(node*); void main() { node *head=NULL; node *newnode,*delnode,*prev,*next,*curr,*last; int i,n,ch,count; int data,deldata,moddata; clrscr(); displaymenu(); while(1) { fflush(stdin); printf("\n\n ?"); scanf("%d",&ch); switch(ch) { case 0:displaymenu(); break; case 1:head=NULL; printf("\nEnter the limit:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("\nEnter the [%d] details:",(i+1)); newnode=getnode(); readnode(newnode); if(head==NULL) { head=newnode; last=head; } else { newnode->blink=last; last->flink=newnode; last=newnode; } } break; case 2:if(head==NULL) {
15
printf("\nDLL is empty"); break; } printf("\nEnter the roll no for modification:"); scanf("%d",&moddata); for(curr=head;curr!=NULL;curr=curr->flink) if(curr->roll==moddata) { printf("\nEnter the new roll:"); scanf("%d",&curr->roll); printf(\nEnter the new name:); scanf(%s,curr->name); break; } if(curr==NULL) printf("\nRoll not found"); break; case 3:if(head==NULL) { printf("\nDLL is empty"); break; } for(count=0,curr=head;curr!=NULL;curr=curr->flink) printf("\n%d-->Roll No:%d\tName:%s",++count,curr->roll,curr->name); printf("\nNo of elements:%d",count); break; case 4:newnode=getnode(); readnode(newnode); newnode->flink=head; if(head!=NULL) head->blink=newnode; head=newnode; break; case 5:newnode=getnode(); readnode(newnode); if(head==NULL) { head=newnode; last=newnode; break; } for(last=head;last->flink!=NULL;last=last->flink) newnode->blink=last; last->flink=newnode; break; case 6:if(head==NULL)
16
{ printf("\nDLL is empty"); break; } printf("\nEnter the roll no after which the insertion is to be made:"); scanf("%d",&data); for(curr=head;curr!=NULL;curr=curr->flink) if(curr->roll==data) { newnode=getnode(); readnode(newnode); next=curr->flink; newnode->flink=next; newnode->blink=curr; curr->flink=newnode; } if(next!=NULL) next->blink=newnode; break; } if(curr==NULL) printf("\nRoll No not found"); break; case 7:if(head==NULL) { printf("\nDLL is empty"); break; } delnode=head; head=head->flink; if(head!=NULL) head->blink=NULL; printf("\nDeleted data is..."); printf("\nRoll No:%d\tName:%s,delnode->roll,delnode->name); releasenode(delnode); break; case 8:if(head==NULL) { printf("\nDLL is empty"); break; } for(last=head;last->flink!=NULL;last=last->flink); delnode=last; if(last==head) head=NULL; else
17
prev=last->blink; prev->flink=NULL; printf("\nDeleted data is...."); printf("\nRoll No:%d\tName:%s",delnode->roll,delnode->name); releasenode(delnode); break; case 9:if(head==NULL) { printf("\nDLL is empty"); break; } printf("\nEnter the roll no for deletion:"); scanf("%d",&deldata); for(curr=head;curr!=NULL;curr=curr->flink) { if(curr->roll==deldata) { delnode=curr; if(curr==head) { head=head->flink; if(head!=NULL) head->blink=NULL; } else { prev=curr->blink; next=curr->flink; prev->flink=next; } if(next!=NULL) next->blink=prev; } printf("\nDeleted data is...."); printf("\nRoll No:%d",delnode->roll); releasenode(delnode); break; } } if(curr==NULL) printf("\nRoll No not found"); break; default:releasenode(head); printf("\nEnd of the program"); exit(0); }
18
} } void displaymenu() { printf("\nBasic operation in Doubly Linked List"); printf("\n1.Create List"); printf("\n2.Modify List"); printf("\n3.View List"); printf("\n4.Insert First"); printf("\n5.Insert Last"); printf("\n6.Insert Middle"); printf("\n7.Delete First"); printf("\n8.Delete Last"); printf("\n9.Delete Middle"); printf("\n0.Show Menu"); printf("\n10.Exit"); } node *getnode() { return(node*)malloc(sizeof(node)); } void readnode(node *newnode) { printf("\nEnter the roll no:"); scanf("%d",&newnode->roll); printf("\nEnter the Name:"); scanf("%d",newnode->name); newnode->flink=NULL; newnode->blink=NULL; } void releasenode(node *newnode) { free(newnode); }
19
Ex.no:2
AIM:To write a C program to perform polynomial addition using singly linked list.
ALGORITHM: Algorithm for main() function: Step 1: Initialize poly1, poly2 and poly3 as NULL Step 2: get the choice of the user Step 2.1: if choice is 1 then Step 2.1.1: call createpoly() function to get the first polynomial Step 2.1.2: call viewpoly() function to view the first polynomial Step 2.2: : if choice is 2 then Step 2.2.1: call createpoly() function to get the second polynomial Step 2.2.2: call viewpoly() function to view the second polynomial Step 2.3: if choice is 3 then Step 2.3.1: call viewpoly() function to view the first polynomial equation Step 2.3.2: call viewpoly() function to view the second polynomial equation Step 2.4: if choice is 4 then Step 2.4.1: call addpoly() function to add two polynomial equation Step 2.4.2: call again the viewpoly() function to see the resultant polynomial equation Step 2.5: if choice is 0 then Step 2.5.1: call viewmenu() function to view the menu Step 2.6: print end of program Step 3: stop the program. Algorithm for createpoly() function: Step 1:Initialize head=NULL Step 2: check whether (p->exp!=0) If yes, Get the exponent and coefficient values for the polynomial equation If no, return head
20
Algorithm for getnode() function: Step 1: Allocate memory for every node of a polynomial equation Algorithm for readnode() function: Step 1: Get the coefficient from user Step 2: Get the exponent value Step 3: Assign newnode->coef=coef Step 4: Assign newnode->exp=exp Step 5: Assign newnode->next=NULL Algorithm for insertnode() function: Step 1: if p->coef==0.0 Return head Step 2: if head==NULL Return p Step 3: else if(p->exp>head->exp) then Assign p->next=head Return p Step 4: else if (p->exp<head->exp) then Assign head->next=insertnode(head->next,p) Step 5: return head. Algorithm for viewpoly() function: Step 1: if(ply==NULL) Print the value is null Step 2: print the polynomial equation when ply!=NULL Algorithm for addpoly() function: Step 1: Initialize head=NULL Step 2: while poly1!=null Assign head=insertnode(head,copynode(poly1,positive)) Assign poly1=poly1->next Step 3: while poly2!=null Assign head=insertnode(head,copynode(poly2,positive)) Assign poly2=poly2->next
21
Step 4: return the value of head pointer Algorithm for copynode() function: Step 1: create newnode for copying Step 2: assign newnode->coef=sign*p->coef Step 3: assign newnode->exp=p->exp Step 4: assign newnode->next=NULL Step 5: assign newnode Algorithm for viewmenu() function Step 1: display all the menus like create first polynomial,create second polynomial etc.,
PROGRAM CODING: #include<stdio.h> #include<conio.h> #include<stdlib.h> #define positive 1 typedef struct node { float coef; int exp; struct node *next; }poly; poly *getnode(); poly *createpoly(); poly *addpoly(poly*,poly*); void viewmenu(); void readnode(poly*); void viewpoly(poly*); poly *insertnode(poly*,poly*); poly *copynode(poly*,int); main() { poly *poly1=NULL,*poly2=NULL,*poly3=NULL; intch; clrscr(); viewmenu(); while(1) { printf("\n ?"); fflush(stdin); scanf("%d",&ch); switch(ch)
22
{ case 1:printf("\nEnter the first polynomial:"); poly1=createpoly(); printf("\nFirst polynomial is..."); viewpoly(poly1); break; case 2:printf("\nEnter the second polynomial:"); poly2=createpoly(); printf("\nSecond polynomial is:"); viewpoly(poly2); break; case 3:printf("\nThe first polynomial is:"); viewpoly(poly1); printf("\nSecond polynomial is:"); viewpoly(poly2); break; case 4:poly3=addpoly(poly1,poly2); printf("\nResultant polynomial is:"); viewpoly(poly3); break; case 0: clrscr(); viewmenu (); break; default:printf("\nEnd of program:"); exit(0); }}} poly *createpoly() { poly *p,*head=NULL; do { p=getnode(); readnode(p); head=insertnode(head,p); } while(p->exp!=0); return head; } poly *getnode() { return(poly*)malloc(sizeof(poly)); } void readnode(poly *newnode) { int exp; float coef;
23
printf("\nEnter the coefficient:"); scanf("%f",&coef); printf("\nEnter the exponent:"); scanf("%d",&exp); newnode->coef=coef; newnode->exp=exp; newnode->next=NULL; } poly *insertnode(poly *head,poly *p) { if(p->coef==0.0f) return head; if(head==NULL) return p; else if(p->exp>head->exp) { p->next=head; return p; } else if(p->exp<head->exp) head->next=insertnode(head->next,p) ; else if((head->coef=head->coef+p->coef)==0.0f) return head->next; return head; } void viewpoly(poly *ply) { if(ply==NULL) printf("\nNULL"); while(ply!=NULL) { printf("%.2fx^%d",ply->coef,ply->exp); printf("%s",(ply->next==NULL)?"=0\n":"+"); ply=ply->next; }} poly *addpoly(poly *poly1,poly *poly2) { poly *head=NULL; while(poly1!=NULL) { head=insertnode(head,copynode(poly1,positive)); poly1=poly1->next; } while(poly2!=NULL) { head=insertnode(head,copynode(poly2,positive));
24
poly2=poly2->next; } return head; } poly *copynode(poly *p,int sign) { poly *newnode; newnode=getnode(); newnode->coef=sign*p->coef; newnode->exp=p->exp; newnode->next=NULL; return newnode; } void viewmenu() { printf("\nPolynomial Manipulation using Singly Linked List"); printf("\n0.Show Menu"); printf("\n1.Create First polynomial"); printf("\n2.Create Second polynomial"); printf("\n3.View First and second polynomial"); printf("\n4.Polynomial Addition"); printf("\n5.Exit"); }
25
Ex.no:3
AIM:-
To write a C program to implement stack and use it to convert infix to postfix expression. ALGORITHM:1. Start the program 2. Scan the Infix string from left to right. 3. Initialise an empty stack. 4. If the scannned character is an operand, add it to the Postfix string. If the scanned character is an operator and if the stack is empty Push the character to stack. If the scanned character is an Operand and the stack is not empty, compare the precedence of the character with the element on top of the stack (topStack). If topStack has higher precedence over the scanned character Pop the stack else Push the scanned character to stack. Repeat this step as long as stack is not empty and topStack has precedence over the character. Repeat this step till all the characters are scanned. 5. (After all characters are scanned, we have to add any character that the stack may have to the Postfix string.) If stack is not empty add topStack to Postfix string and Pop the stack. Repeat this step as long as stack is not empty. 6. Return the Postfix string. 7. Terminate the program.
26
int top=0,st[20]; void postfix(); void push(int); char pop(); voidmain() { clrscr(); printf("\nEnter the infix expression:"); scanf("%s",inf); postfix(); getch(); } void postfix() { inti,j=0; for(i=0;inf[i]!='\0';i++) { switch(inf[i]) {case '+':while(st[top]>=1) post[j++]=pop(); push(1); break; case '-':while(st[top]>=1) post[j++]=pop(); push(2); break; case '*':while(st[top]>=3) post[j++]=pop(); push(3); break; case '/':while(st[top]>=3) post[j++]=pop(); push(4); break; case '^':while(st[top]>=4) post[j++]=pop(); push(5); break; case '(':push(0); break; case ')':while(st[top]!=0) post[j++]=pop(); top--; break; default:post[j++]=inf[i]; }
27
} while(top>0) post[j++]=pop(); printf("\nPostfixexp:%s",post); } void push(intele) { top++; st[top]=ele; } char pop() { int e1; char e; e1=st[top]; top--; switch(e1) { case 1:e='+'; break; case 2:e='-'; break; case 3:e='*'; break; case 4:e='/'; break; case 5:e='^'; break; } return e; }
28
Ex.no:4
AIM:
To write a C program to implement linear double ended queue (deque) using arrays.
ALGORITHM:
Step 1: Initialize front=-1, rear=1 Step 2: Get the choice from the user Step 2.1: If choice is 0, call displaymenu() function to display the menus. Step 2.2: If choice is 1, then Step 2.2.1: get the data from the user Step 2.2.2: check if front==0 If yes, print deque overflow on enqueue at front Step 2.2.3: check if (front==-1 && rear==-1) If yes, assign front=rear=0 Step 2.2.4: If above two condition are false , then front Step 2.2.5: assign queue[front]=data Step 2.3: If choice is 2, then Step 2.3.1: Get the data from the user Step 2.3.2: if(rear=(qsize-1)), then Print dequeue overflow on enqueue at rear Step 2.3.3: if(front==-1 && rear==-1), then Assign front=rear=0 Step 2.3.4: if the above two conditions are false, then assign rear=rear+1 Step 2.3.5: Assign queue[rear]=data Step 2.4: if choice is 3, then Step 2.4.1: if(front==-1&&rear==-1), then
29
Print deque is empty Step 2.4.2: if(front==0) ,then Print deque full at front Step 2.4.3: if(rear==(qsize-1)) Print deque is full at rear Step 2.4.4: print the elements the queue using for loop Step 2.5: if choice is 4, then Step 2.5.1: if(front==-1&&rear==-1), then Print deque underflow on deque at front Step 2.5.2:else print the deleted value from front of the deque If(front==rear),then Assign front=rear=-1 Else Assign front=front+1 Step 2.6: if choice is 5, then Step 2.6.1: if(front==-1&&rear==-1), then Print deque underflow on deque at rear Step 2.5.2:else print the deleted value from rear end of the deque If(front==rear),then Assign front=rear=-1 Else Assign rear=rear-1 Step 2.7: if choice is 6, then Step 2.7.1: print the size of the deque Step 2.7.2: check whether the front and rear equals -1 If yes, print current queue element is 0 Step 2.7.3: if front and rear not equals -1,then Print the no of elements in the deque Step 2.8: if choice is 7 ,then Step 2.8.1: if(front==-1&&rear==-1), then Print deque is empty
30
Step 2.8.1: if front and rear not equals -1, then Print the value at the front end Step 2.9: if choice is 8 ,then Step 2.9.1: if(front==-1&&rear==-1), then Print deque is empty Step 2.9.1: if front and rear not equals -1, then Print the value at the front end Step 2.10: print end of the program Step 3: Stop the program
PROGRAM CODING:#include<stdio.h> #include<conio.h> #include<stdlib.h> #define qsize 5 voiddisplaymenu(); voidmain() { int front=-1,rear=-1,queue[qsize]; intf,data,ch; displaymenu(); while(1) { printf("\n\n?"); scanf("%d",&ch); switch(ch) { case 0:displaymenu(); break; case 1:fflush(stdin); printf("\nEnter the data:"); scanf("%d",&data); if(front==0) { printf("\nDeque overflow on enqueue at front"); break;} else if(front==-1&&rear==-1) front=rear=0; else front--; queue[front]=data;
31
break; case 2:fflush(stdin); printf("\nEnter the data:"); scanf("%d",&data); if(rear==(qsize-1)) { printf("\nDeque overflow on enqueue at rear"); break; } else if(front==-1&&rear==-1) front=rear=0; else rear++; queue[rear]=data; break; case 3:if(front==-1&&rear==-1) { printf("\nDeque is empty"); break; } if(front==0) printf("\nDeque full at front"); else if(rear==(qsize-1)) printf("\nTheDeque is full at rear"); printf("\nThe content of deque is:\nFRONT"); for(f=front;f!=rear+1;f++) printf("\n%d",queue[f]); printf("\nREAR"); break; case 4:if(front==-1&&rear==-1) printf("\nDeque Underflows on deque at front"); else { printf("\nThedequed value is %d",queue[front]); if(front==rear) front=rear=-1; else front++; } break; case 5:if(front==-1&&rear==-1) printf("\nDeque Underflows on deque at rear"); else { printf("\nThedequed value is %d",queue[rear]); if(front==rear) front=rear=-1; else rear--;
32
} break; case 6:printf("\nThedeque size is:%d",qsize); if(front==-1&&rear==-1) printf("\nCurren t Deque element:%d",0); else printf("\nThe current dequed value is %d",rear-front+1); break; case 7:if(front==-1&&rear==-1) printf("\nDeque is empty"); else printf("\nThe value at front: %d",queue[front]); break; case 8:if(front==-1&&rear==-1) printf("\nDeque is empty"); else printf("\nThe value at rear: %d",queue[rear]); break; default:printf(\nEnd of the program); exit(0); }}} void displaymenu() { printf("\nBasic operation in Deque"); printf("\n1.Enque at front"); printf("\n2.Enqueat rear"); printf("\n3.View"); printf("\n4.Deque at Front"); printf("\n5.Deque at rear"); printf("\n6.Size"); printf("\n7.Value at front"); printf("\n8.Value at rear"); printf("\n9.exit"); printf("\n0.Show Menu"); }
33
Ex.no:5
AIM:-
To write a C program to implement an expression tree. Produce its pre-order, inorder, and post-order traversals.
ALGORITHM: Algorithm for main() program: Step 1: Start the process. Step 2: Initialize and declare variables. Step 3: Get the expression from the user as postfix expression. Step 4: call create() function to create expression tree. Step 5: call display() function to display the tree. Step 6: call inorder() function to find the inorder traversal path Step 7: call preorder() function to find the preorder traversal path Step 8: call postorder() function to find the postorder traversal path Step 9: stop the program Algorithm for inorder() function: Step 1: If root is not equal to NULL, then o Traverse the left subtree in inorder. o Process the root node. o Traverse the right subtree in inorder.
Algorithm for preorder() function: Step 1: If root is not equal to NULL, then o Process the root node. o Traverse the left subtree in preorder. o Traverse the right subtree in preorder.
34
Algorithm for postorder() function: Step 1: If root is not equal to NULL, then o Traverse the left subtree in postorder. o Traverse the right subtree in postorder. o Process the root node. Algorithm for create() function: Step 1: Get the postfix string as character by character from left to right using while loop. Step 1.1: For each character(operator/operand) node will be created. Step 1.2: If the character is alphabetical letter(operand) , then push into stack. Step 1.3: If the character is operator then pop two operator out of the stack. Step 1.4: If the character is not an operator/operand then print invalid expression Step 2: If no more character is available for checking, then pop all the characters out of the stack. Algorithm for push() function: Step 1: Check whether (top+1)>=stack size, Step 1.1: If yes, then print stack overflow. Step 1.2: If no, then increment the top value of stack and push the new value into the stack. Algorithm for pop() function: Step 1: Check whether top==-1 Step 1.1: If yes, then print the stack is empty. Step 1.2: If no, then decrement the top value of stack and pop the symbol out of the stack. Algorithm for display() function: Step 1: check whether the roo is equal to NULL Step 1.1: If yes, return the NULL value. Step 1.2: If no, display the expression tree as o Traverse the right subtree. o Process the root node. o Traverse the left subtree.
35
PROGRAM CODING:#include<stdio.h> #include<conio.h> #include<ctype.h> #include<stdlib.h> #define size 30 typedefstruct node { char data; struct node *left,*right; }btree; void display(btree*,int); void push(btree*); btree *create(char exp[20]); btree *pop(); btree *stack[size]; int top=-1; void main() { btree *root=NULL; charexp[20]; btree *create(char expr[20]); void preorder(btree *root); voidpostorder(btree *root); voidinorder(btree *root); clrscr(); printf("\nEnter the expression:"); scanf("%s",exp); root=create(exp); printf("\nTree created"); display(root,0); printf("\nInorder:"); inorder(root); printf("\nPreorder:"); preorder(root); printf("\nPostorder:"); postorder(root); getch(); } void preorder(btree *root) { if(root!=NULL) { printf("%c",rootdata); preorder(rootleft); preorder(rootright);
36
} } voidinorder(btree *root) { if(root!=NULL) { inorder(rootleft); printf("%c",rootdata); inorder(rootright); } } voidpostorder(btree *root) { if(root!=NULL) { postorder(rootleft); postorder(rootright); printf("%c",rootdata); } } btree *create(char exp[20]) { btree *temp; int i=0; charch; ch=exp[i]; while((ch=exp[i++])!='\0') { temp=(btree*)malloc(sizeof(btree)); templeft=tempright=NULL; tempdata=ch; if(isalpha(ch)) push(temp); else if(ch=='+'||ch=='-'||ch=='*'||ch=='/') { tempright=pop(); templeft=pop(); push(temp); } elseprintf("\nInvalid expression"); } temp=pop(); return(temp); } void push(btree *newnode) {
37
if((top+1)>=size) printf("\nStack Overflow"); else stack[++top]=newnode; } btree *pop() { btree *temp; if(top==-1) printf("\nStack is empty"); else temp=stack[top--]; return temp;} void display(btree *root,int level) { int k; if(root==NULL) return; display(rootright,level+1); printf("\n\n"); for(k=0;k<level;k++) printf(" "); printf("%c",rootdata); display(rootleft,level+1); }
38
Ex.no:6
AIM:-
ALGORITHM:Algorithm for main() function: Step 1: Start the program. Step 2: Initialize and declare variables. Step 3: Get the choice from the user: Step 3.1: If choice is 0, then call displaymenu() function Step 3.2: If choice is 1, then call create() function. Step 3.3: if choice is 2, then call insert() function. Step 3.4: If choice is 3, then call find() function Step 3.5: if choice is 4, then call findmin() function Step 3.6: If choice is 5, then call findmax() function Step 3.7: If choice is 6, then call delete1() function Step 3.8: If choice is 7, then call display() function Step 3.9: If choice is 8, then exit Step 3.10: if choice is other than 0-8,then print invalid choice Step 4: Stop the program. Algorithm for create() function: Step 1: Get the number of elements Step 2: Using for loop get the elements one by one
39
Step 3:call insert() function to insert data into the tree. Algorithm for insert() function: Step 1: Check whether t==NULL If yes, Allocate the memory space for t Step 1.1: Check whether t==NULL If yes, then print out of space If no, then assign t->no=x and t->left=t->right=NULL. Step 2: Check whether x<t->no Step 2.2: If yes, then Assign t->left=insert(x,t->left) // call insert() function Step 3: Check whether x>t->no Step 3.3: If yes, then Assign t->right=insert(x,t->right) Step 4: Return the value of t. Algorithm for delete1() function: Step 1: Check whether t==NULL, then Step 1.1: If yes, then print element is not found Step 2: Check whether x<t->no, then Step 2.1: If yes, then Assign t->left=delete1(x,t->left) Step 3: Check whether x>t->no, then Step 3.1: If yes, then Assign t->right=delete1(x,t->right) Step 4: Check whether t->left and t->right has node(i.e., node with two child) Step 4.1: If yes, then
40
Assign k=findmin(t->right) Assign temp->no=k Assign t->no=temp->no Assign t->right=delete1(t->no,t->right) Step 5: Assign temp=t Step 5.1: check whether t->left==NULL If yes, then assign t=t->right Step 5.2: check whether t->right==NULL If yes, then assign t=t->left Step 6: Return the value of t Algorithm for findmin() function: Step 1: When root not equal to NULL, traverse in the left subtree to find which node left Link field is NULL. That node is considered to be the minimum value node. Algorithm for findmax() function: Step 1: When root not equal to NULL, traverse in the Right subtree to find which node Right Link field is NULL. That node is considered to be the maximum value node. Algorithm for find() function: Step 1: Check whether t==NULL, then Step 1.1: If yes, then return NULL Step 2: Check whether x<t->no, then Step 2.1: If yes, then return find(x,t->left) Step 3: Check whether x>t->no, then Step 3.1: If yes, then return find(x,t->right)
41
Step 4: Return the value of t Algorithm for display() function: Step 1: check whether the roo is equal to NULL Step 1.1: If yes, return the NULL value. Step 1.2: If no, display the expression tree as o Traverse the right subtree. o Process the root node. o Traverse the left subtree. PROGRAM CODING:#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<process.h> typedef struct tree { int no; struct tree *right,*left; }*node; node insert(intx,node t); node find(intx,node t); int findmin(node t); int findmax(node t); void create(); void displaymenu(); node delete1(intx,node t); void display(node t,int level); node t=NULL; intn,i,data,x; void main() {
42
inta,min,max,n; node val; clrscr(); displaymenu(); while(1) { printf("\nEnter your choice:"); scanf("%d",&a); switch(a) { case 0:displaymenu(); break; case 1:create(); break; case 2:printf("\nEnter the element for insertion:"); scanf("%d",&x); t=insert(x,t); break; case 3:printf("\nEnter the searching element:"); scanf("%d",&x); val=find(x,t); if(val!=NULL) printf("\nElement found"); elseprintf("\Element not found"); break; case 4:min=findmin(t); printf("\nMinimum value:%d",min); break; case 5:max=findmax(t); printf("\nMinimum value:%d",max); break;
43
case 6:printf("\nEnter the element to be deleted:"); scanf("%d",&x); delete1(x,t); printf("Elements after deletion"); display(t,1); break; case 7:display(t,1); break; case 8:exit(0); break; default:printf("\nInvalid choice"); break; }}} void create() { printf("\nEnter the no of elements:"); scanf("%d",&n); printf("\nEnter the elements:"); for(i=0;i<n;i++) { scanf("%d",&data); t=insert(data,t); } } node insert(intx,node t) { if(t==NULL) { t=(tree*)malloc(sizeof(struct tree)); if(t==NULL) printf("\nOut of space");
44
else{ tno=x; tleft=tright=NULL; }} else if(x<tno) tleft=insert(x,tleft); else if(x>tno) tright=insert(x,tright); return t; } node find(intx,node t) { if(t==NULL) return NULL; else if(x<tno) return find(x,tleft); else if(x>tno) return find(x,tright); else return t; } int findmin(node t) { if(t!=NULL) { if(tleft==NULL) return tno; else return findmin(tleft); } return 0;} int findmax(node t) {
45
if(t!=NULL) { if(tright==NULL) return tno; else return findmax(tright); } return 0;} node delete1(intx,node t) { node temp; int k; if(t==NULL) printf("\nElement is not found"); else if(x<tno) tleft=delete1(x,tleft); else if(x>tno) tright=delete1(x,tright); else if(tleft&&tright) { k=findmin(tright); tempno=k; tno=tempno; tright=delete1(tno,tright); } else { temp=t; if(tleft==NULL) t=tright; else if(tright==NULL) t=tleft;
46
free(temp); } return t; }
void display(node t,int level) { int k; if(t==NULL) return; display(tright,level+1); printf("\n\n"); for(k=0;k<level;k++) printf(" "); printf("%d",tno); display(tleft,level+1); void displaymenu() { printf("\nBinary search tree"); printf("\n0.show menu); printf(\n1.Create); printf(\n2.Insert); printf(\n3.Find); printf(\n4.Find Minimum); printf(\n5.Find Maximum); printf(\n6.Delete); printf(\n7.Display); printf(\n8.Exit"); } }
47
Ex.no:7:
AIM:
ALGORITHM:
Step 1: Check whether p==NULL Step1.1: If yes, then return -1 Step1.2: If no, then return p->height
Step 1: Check whether h1>h2 Step 1.1: If yes, then return h1 Step 1.2: If no, then return h2 Algorithm for singlerotatewithleft() function:
Step 1: Assign k1=k2->left Step 2: Assign k2->left=k1->right Step 3: Assign k1->right=k2 Step 4: Assign k2->height=maximum height of left and right subtree Step 5: Assign k1->height=max(height(k1->left),k2->height)+1 Step 6: Return k1
48
Step 4: Assign k1->height=maximum height of left and right subtree Step 5: Assign k2->height=max(height(k2->right),k1->height)+1 Step 6: Return k2
Step 1: Assign k3->right=singlerotatewithleft(k3->right) Step 2: Return singlerotatewithright(k3) Algorithm for insertnode() function: Step 1: Check whether t==NULL If yes, Allocate the memory space for t Step 1.1: Check whether t==NULL If yes, then print out of space If no, then assign t->element=x , t->left=t->right=NULL and t->height=0. Step 2: Check whether x<t->element Step 2.1: If yes, then Assign t->left=insertnode(x,t->left) // call insert() function Step2.1.1: Check whether (height(t->left)-height(t->right)==2) If yes, then check x<t->left->element If true, then call singlerotatewithleft() function If false, then call doublerotatewithleft() function
49
Step 3: Check whether x>t->element Step 2.1: If yes, then Assign t->right=insertnode(x,t->right) // call insert() function Step2.1.1: Check whether (height(t->right)-height(t->left)==2) If yes, then check x>t->right->element If true, then call singlerotatewithright() function If false, then call doublerotatewithright() function Step 4: print x is already in tree Step 5: calculate the height of the resultant tree Step 6: Return the height of the root
Step 3: Check whether x>t->no Step 3.3: If yes, then Assign t->right=insert(x,t->right) Step 4: Return the value of t. Algorithm for view() function: Step 1: check whether the root is equal to NULL Step 1.1: If yes, return the NULL value. Step 1.2: If no, display the expression tree as o Traverse the right subtree. o Process the root node. o Traverse the left subtree. Algorithm for main() function: Step 1: Get the choice from the user
50
Step 1.1: If choice is 1, then Get the value from the user call insertnode() function to insert the values in the tree Step 1.2: If choice is 2, then If t is true, then call view() function to display the AVL tree If t is not true, then print tree is empty Step 1.3: If choice is 3, then Exit from the menu
PROGRAM CODING:#include<stdio.h> #include<conio.h> #include<alloc.h> #include<stdlib.h> structtreenode; typedef structtreenode *position; typedef structtreenode *avltree; typedef structtreenodeptrtonode; typedef int elementtype; avltree insert node(elementtypeX,avltree t); void view(avltreet,int level); structtreenode { elementtype element; avltree left; avltree right; int height; }; int height(position p) { if(p==NULL) return -1; else return pheight; } int max(int h1,int h2) { if(h1>h2) return h1; else return h2;
51
} positionsinglerotatewithleft(position k2) { position k1; k1=k2left; k2left=k1right; k1right=k2; k2height=max(height(k2left),height(k2right))+1; k1height=max(height(k1left),k2height)+1; return k1; } positionsinglerotatewithright(position k1) { position k2; k2=k1right; k1right=k2left; k2left=k1; k1height=max(height(k1left),height(k1right))+1; k2height=max(height(k2right),k1height)+1; return k2; } positiondoublerotatewithleft(position k3) { k3left=singlerotatewithright(k3left); returnsinglerotatewithleft(k3); } positiondoublerotatewithright(position k3) { k3right=singlerotatewithleft(k3right); returnsinglerotatewithright(k3); } avltreeinsertnode(elementtypeX,avltree t) { if(t==NULL) { t=(ptrtonode*)malloc(sizeof(structtreenode)); if(t==NULL) printf("\nOut of space"); else { telement=X; tleft=tright=NULL; theight=0; } } else if(X<telement)
52
{ tleft=insertnode(X,tleft); if(height(tleft)-height(tright)==2) if(X<tleftelement) t=singlerotatewithleft(t); else t=doublerotatewithleft(t); } else if(X>telement) { t->right=insertnode(X,tright); if(height(tright)-height(tleft)==2) if(X>trightelement) t=singlerotatewithright(t); else t=doublerotatewithright(t); } else printf("\nX is already in tree"); theight=max(height(tleft),height(tright))+1; return t; } void view(avltreet,int level) { int k; if(t==NULL) return; view(tright,level+1); printf("\n\n"); for(k=0;k<level;k++) printf(" "); printf("%d",tlement); view(tleft,level+1); } int main() { intch,item; position p; avltree t; t=NULL; clrscr(); do { printf("\n1.Insertion\n2.View\n3.Exit"); printf("\n\n?"); scanf("%d",&ch);
53
switch(ch) { case 1:printf("\nEnter the item to be inserted:"); scanf("%d",&item); t=insertnode(item,t); printf("\nitem inserted"); break; case 2:if(t) { printf("\AVL tree is"); view(t,1); } elseprintf("\nTree is empty"); break; default:exit(0); } } while(1); }
54
Ex.no:8
ALGORITHM:
Step 1: Get the choice from the user Step 1.1: If the choice is 1, then Get the data from the user Call insert() function to insert the datas into the heap Step 1.2: If the choice is 2, then Delete the data from the heap Step 1.3: If the choice is 3, then Display the heap using view() function Step 1.4: print end of program
Step 1: Check whether n==maxsize If yes, then heap is full Step 2: If n!=maxsize, then Step 2.1: using for loop construct the heap for the given values
55
Step 2: If n!=0, then Step 2.1: Assign del=heap[0] Step 2.2: Assign t=heap[n-1] Step 2.3: Decrement the value n Step 2.4: using for loop reconstruct the heap excluding the deleted values Step 3: Return the deleted value
Algorithm for view() function: Step 1:Using for loop display the values in the heap.
PROGRAM CODING:#include<stdio.h> #include<conio.h> #include<stdlib.h> #define maxsize 30 int *heap; int n=0; void insert(int data); void view(); int delete1(); void main() { intch,data; clrscr(); printf("\nMENU"); printf("\n1.Insert\n2.Delete\n3.View\n4.Exit"); while(1) { printf("\n\n?"); scanf("%d",&ch); switch(ch) { case 1:printf("\nEnter the data"); scanf("%d",&data); insert(data); break; case 2:data=delete1(); printf("\nThe deleted data is:%d",data); break;
56
case 3:view(); break; default:printf("\nEnd of program"); exit(0); } } } void insert(int data) { int i; if(n==maxsize) { printf("\nHeap is full"); return; } for(i=n;1;) { if(i==0) break; if(data<=heap[i/2]) break; heap[i]=heap[i/2]; i=i/2; } heap[i]=data; n++; } int delete1() { intdel,t,i=0,j=1; if(n==0) { printf("\nBinary Heap is empty"); return 0; } del=heap[0]; t=heap[n-1]; n--; for(;j<=n;) { if(j<n) if(heap[j]<heap[j+1]) j++; if(t>heap[i]) break; heap[i]=heap[j];
57
i=j; j=j*2; } heap[i]=t; return del; } void view() { int i=0; for(;i<n;i++) printf("\t%d",heap[i]); }
58
Ex.no:9
AIM: To write a C program to create hash table and handle the collision using open addressing.
ALGORITHM:
Step 0: Start the program. Step 1: Initialize the hash table with -1,using for loop till the maxsize Step 2: Open the do-while loop Step 2.1:Get the element to be placed in the hash table. Step 2.2: Generate the key for the elements using create() function Step 2.3: call linear_prob() function to place the value in the hah table And handle the collision Step 2.4: continue the loop till user press n Step 3: display the hash table Step 4: stop the program
Step 1: The hash key is generated using the formula key=num%10 Step 2: Return the hash key
Step 1: Check whether a[key]==-1 If yes, then assign a[key]=num Step 2: Check whether i<max using while loop
59
Step 2.1: If yes, check a[i]!=-1 Assign count=count+1 Increment the value of i Step 2.2: If count==max, then Print hash table is full Display the hash table Step 2.3: for(i=key;i<max;i++ Step 2.3.1: check whether a[i]==-1 If yes, then assign a[i]=num and flag=1 Step 2.4: for (i=0;i<key&&flag==0;i++) Step 2.4.1: check whether a[i]==-1 If yes, then assign a[i]=num and flag=1
PROGRAM CODING:#include<stdio.h> #include<conio.h> #include<stdlib.h> #define max 10 voidlinear_prob(int a[max],intkey,intnum); void display(int a[max]); int create(intnum); void main() { int a[max],num,key,i; charans; clrscr(); printf("\nCollision Handling technique by linear probing"); for(i=0;i<max;i++) a[i]=-1; do
60
{ printf("\nEnter the element:"); scanf("%d",&num); key=create(num); linear_prob(a,key,num); printf("\nDo u wish to continue:"); scanf(%c,&ans); } while(ans=='y'||ans=='Y'); display(a); getch(); } int create(intnum) { int key; key=num%10; return key; } voidlinear_prob(int a[max],intkey,intnum) { intflag,i,count=0; void display(int a[]); flag=0; if(a[key]==-1) a[key]=num; else { i=0; while(i<max) { if(a[i]!=-1) count++; i++; } if(count==max) { printf("\nHash table is full"); display(a); getch(); exit(1); } for(i=key+1;i<max;i++) if(a[i]==-1) { a[i]=num; flag=1;
61
break; } for(i=0;i<key&&flag==0;i++) if(a[i]==-1) {a[i]=num; flag=1; break; }}} void display(int a[max]) { printf("\nThe Hash table is:"); for(int i=0;i<max;i++) printf("\n[%d]---->%d\n",i,a[i]); }
62
Ex.no:10
AIM: To write a C program to find the Minimum Spanning Tree (MST) using PRIMS algorithm.
ALGORITHM:
Step 1: start the program Step 2: Get the number of vertices Step 3: print the adjacency matrix using the weight of the edge of the graph Step 4: Call prims() function to find the minimum spanning tree Step 5: stop the program
Step 1: Initialize all vertices variables known=0, dist=infinity, path=0 Step 2: Consider the any node as first node and assign known=1, path=0, dist=0 Step 3: Consider the other adjacent nodes of first node and add the edge to the tree which Has least cost among the adjacent nodes Step 4: Again the next adjacent node will be added with the second least value Step 5: Step 4,5 will be repeated till we get the minimum spanning tree.
Step 1: Check whether t[i].known==0 If yes, then return 0 If no, then return 1
63
PROGRAM CODING:#include<stdio.h> #include<conio.h> #include<stdlib.h> #define max 10 #define infinity 999 typedefstruct { ints,e; }spantree; typedefstruct { int known,dist,path; }table; int adjmat[max][max],n; void prims(); int visitedall(table[max],int); void main() { int src,dest,i,j,n; clrscr(); printf("\nEnter the number of vertices:"); scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i==j) adjmat[i][j]=0; else { printf("\n%d to %d:",i,j); scanf("%d",&adjmat[i][j]); } } printf("\nTheadjecency matrix of the given graph is..."); for(i=1;i<=n;i++) { printf("\n\n"); for(j=1;j<=n;j++) printf("\t%d",adjmat[i][j]); } prims(); getch(); } void prims()
64
{ int s,e; int i,j,newlen,current,small,minlen=0,tot=0; table t[10]; spantreesptree[10]; for(i=1;i<=n;i++) { t[i].known=0; t[i].dist=infinity; t[i].path=0; } t[1].known=1; t[1].dist=0;t[1].path=0; current=1; while(visitedall(t,n)!=1) { for(i=1;i<=n;i++) { if(t[i].known==0&&adjmat[current][i]>0) { if(adjmat[current][i]<t[i].dist) { t[i].dist=adjmat[current][i]; t[i].path=current; } } } small=infinity; current=0; for(j=1;j<=n;j++) if(t[j].known==0&&t[j].dist<small) { small=t[j].dist; current=j; } t[current].known=1; s=t[current].path=0; e=current; tot++; sptree[tot].s=s; sptree[tot].e=e; minlen=minlen+adjmat[s][e]; } printf("\nNo of edges:%d",tot); getch(); printf("\nThe MST edges are:");
65
for(i=1;i<=tot;i++) printf("\n%d%d\t%d",sptree[i].s,sptree[i].e,adjmat[sptree[i].s][sptree[i].e]); printf("\nthe spanning tree minimum length is= %d",minlen); } int visitedall(table t[10],int n) { for(int i=1;i<=n;i++) if(t[i].known==0) return 0; return 1; }
66
67