SlideShare a Scribd company logo
1 of 120
Advanced C Programming

Introduction to Data Structures
Data Structures:
A data structure is an arrangement of data in a computer's memory or even disk storage.
Data structures can be classified into two types
•

Linear Data Structures

•

Non Linear Data Structures

Linear Data Structures:
Linear data structures are those data structures in which data elements are accessed (read and
written) in sequential fashion ( one by one)
Eg: Stacks , Queues, Lists, Arrays
Non Linear Data Structures:
Non Linear Data Structures are those in which data elements are not accessed in sequential
fashion.
Eg: trees, graphs

Algorithm:
Step by Step process of representing solution to a problem in words is called an Algorithm.
Characteristics of an Algorithm:
•
•

Output: An algorithm should have one or more outputs

•

Finiteness: Every step in an algorithm should end in finite amount of time

•

Unambiguous: Each step in an algorithm should clearly stated

•

1

Input : An algorithm should have zero or more inputs

Effectiveness: Each step in an algorithm should be effective
Advanced C Programming

Characteristics of Data Structures
Data Structure Advantages

Disadvantages

Array

Slow search
Slow deletes
Fixed size

Quick inserts
Fast access if index known

Ordered Array Faster search than unsorted array

Slow inserts
Slow deletes
Fixed size

Stack

Last-in, first-out acces

Slow access to other items

Queue

First-in, first-out access

Slow access to other items

Linked List

Quick inserts
Quick deletes

Slow search

Binary Tree

Quick search
Quick inserts
Quick deletes
(If the tree remains balanced)

Deletion algorithm is complex

Red-Black Tree Quick search
Quick inserts
Quick deletes
(Tree always remains balanced)

Complex to implement

2-3-4 Tree

Quick search
Quick inserts
Quick deletes
(Tree always remains balanced)
(Similar trees good for disk
storage)

Complex to implement

Hash Table

Very fast access if key is known
Quick inserts

Slow deletes
Access slow if key is not known
Inefficient memory usage

Heap

Quick inserts
Quick deletes
Access to largest item

Slow access to other items

Graph

Best models real-world situations

Some algorithms are slow and very
complex

2
Advanced C Programming

Stack :
Stack is a Linear Data Structure which follows Last in First Out mechanism.
It means: the first element inserted is the last one to be removed
Stack uses a variable called top which points topmost element in the stack. top is incremented
while pushing (inserting) an element in to the stack and decremented while poping (deleting) an
element from the stack

A

top

Push(A)

B
A
Push(B)

C
B
A

top

top

Push(C)

D
C
B
A
Push(D)

top

top

C
BA
Pop()

Valid Operations on Stack:
•

Inserting an element in to the stack (Push)

•

Deleting an element in to the stack (Pop)

•

Displaying the elements in the queue (Display)

Note:
While pushing an element into the stack, stack is full condition should be checked
While deleting an element from the stack, stack is empty condition should be checked

Applications of Stack:
•
•

Stacks are used in function calls

•

3

Stacks are used in recursion programs

Stacks are used in interrupt implementation
Advanced C Programming

Queue:
Queue is a Linear Data Structure which follows First in First out mechanism.
It means: the first element inserted is the first one to be removed
Queue uses two variables rear and front. Rear is incremented while inserting an element into the
queue and front is incremented while deleting element from the queue

rear
front

A
Insert(A)

B
A
Insert(B)

rear
front

C
B
A
Insert(C)

rear
front

D
C
B
A
Insert(D)

rear

D
C
B

front

Delete()

Valid Operations on Queue:
•

Inserting an element in to the queue

•

Deleting an element in to the queue

•

Displaying the elements in the queue

Note:
While inserting an element into the queue, queue is full condition should be checked
While deleting an element from the queue, queue is empty condition should be checked
Applications of Queues:
•

Real life examples
•
•

•

Waiting in line
Waiting on hold for tech support

Applications related to Computer Science
•
•

4

Threads
Job scheduling (e.g. Round-Robin algorithm for CPU allocation)

rear
front
Advanced C Programming

Linked List:
To overcome the disadvantage of fixed size arrays linked list were introduced.
A linked list consists of nodes of data which are connected with each other. Every node consist
of two parts data and the link to other nodes. The nodes are created dynamically.
NODE

bat 
Data

link

bat



cat



Types of Linked Lists:
•

Single linked list

•

Double linked list

•

Circular linked list

Valid operations on linked list:
•
•

Deleting an element at first position

•

Inserting an element at end

•

Deleting an element at end

•

Inserting an element after given element

•

Inserting an element before given element

•

5

Inserting an element at first position

Deleting given element

sat 

vat

NULL
Advanced C Programming

Trees :
A tree is a Non-Linear Data Structure which consists of set of nodes called vertices and set of
edges which links vertices

Terminology:
•

Root Node: The starting node of a tree is called Root node of that tree

•

Terminal Nodes: The node which has no children is said to be terminal node or leaf .

•

Non-Terminal Node: The nodes which have children is said to be Non-Terminal Nodes

•

Degree: The degree of a node is number of sub trees of that node

•

Depth: The length of largest path from root to terminals is said to be depth or height of
the tree

•

Siblings: The children of same parent are said to be siblings

•

Ancestors: The ancestors of a node are all the nodes along the path from the root to the
node

A

Property

C

B

D

E

F

G
H

6

I

Number of nodes
Height
Root Node
Leaves
Interior nodes
Number of levels
Ancestors of H
Descendants of B
Siblings of E

Value
:
:
:
:
:
:
:
:
:

9
4
A
ED, H, I, F, C
D, E, G
5
I
D,E, F
D, F
Advanced C Programming

Binary Trees:
Binary trees are special class of trees in which max degree for each node is 2
Recursive definition:
A binary tree is a finite set of nodes that is either empty or consists of a root and two disjoint
binary trees called the left subtree and the right subtree.
Any tree can be transformed into binary tree. By left child-right sibling representation.

A
B
C

E
K

F

G

D

Binary Tree Traversal Techniques:
There are three binary tree traversing techniques
• Inorder
• Preorder
• Postorder
Inorder: In inorder traversing first left subtree is visited followed by root and right subtree
Preorder: In preorder traversing first root is visited followed by left subtree and right subtree.
Postorder: In post order traversing first left tree is visited followed by right subtree and root.

7
Advanced C Programming

Binary Search Tree:
A Binary Search Tree (BST) is a binary tree which follows the following conditons
•

Every element has a unique key.

•

The keys in a nonempty left subtree are smaller than the key in the root of subtree.

•

The keys in a nonempty right subtree are grater than the key in the root of subtree.

•

The left and right subtrees are also binary search trees.

63

89

41

34

56

Valid Operations on Binary Search Tree:
•
•

Deleting an element

•

Searching for an element

•

8

Inserting an element

Traversing

72

95
Advanced C Programming

Avl Tree:
If in a binary search tree, the elements are inserted in sorted order then the height will be n,
where n is number of elements. To overcome this disadvantage balanced trees were introduced.
•

Balanced binary search trees

•

An AVL Tree is a binary search tree such that for every internal node v of T, the
heights of the children of v can differ by at most 1.

44

4

2
17

78
1

2

32

88

50
1
48

Operations of Avl tree:
•

Inserting an element

•

Deleting an element

•

Searching for an element

•

Traversing

•

9

3

Height balancing

62

1

1
Advanced C Programming

Graphs
A graph is a Non-Linear Data Structure which consists of set of nodes called vertices V and set
of edges E which links vertices
Note: A tree is a graph with out loops

0

0
1

1

2

3
Graph

3

2
5

4

6

Tree

Graph Traversal:
•

Problem: Search for a certain node or traverse all nodes in the graph

•

Depth First Search
•

•

Breadth First Search
•

10

Once a possible path is found, continue the search until the end of the path

Start several paths at a time, and advance in each one step at a time
Advanced C Programming

Introduction to Object Oriented Programming

Object Oriented Programming:
You've heard it a lot in the past several years. Everybody is saying it.

What is all the fuss about objects and object-oriented technology? Is it real? Or is it hype? Well,
the truth is--it's a little bit of both. Object-oriented technology does, in fact, provide many
benefits to software developers and their products. However, historically a lot of hype has
surrounded this technology, causing confusion in both managers and programmers alike. Many
companies fell victim to this hardship (or took advantage of it) and claimed that their software
products were object-oriented when, in fact, they weren't. These false claims confused
consumers, causing widespread misinformation and mistrust of object-oriented technology.

Object:
As the name object-oriented implies, objects are key to understanding object-oriented
technology. You can look around you now and see many examples of real-world objects: your
dog, your desk, your television set, your bicycle.
Definition: An object is a software bundle of variables and related methods

Class:

11
Advanced C Programming

In the real world, you often have many objects of the same kind. For example, your bicycle is
just one of many bicycles in the world. Using object-oriented terminology, we say that your
bicycle object is an instance of the class of objects known as bicycles. Bicycles have some state
(current gear, current cadence, two wheels) and behavior (change gears, brake) in common.
However, each bicycle's state is independent of and can be different from other bicycles.
Definition: A class is a blueprint or prototype that defines the variables and methods common to
all objects of a certain kind.

Inheritance:
Acquiring the properties of one class in another class is called inheritance

The Benefits of Inheritance
•

Subclasses provide specialized behaviors from the basis of common elements provided
by the super class. Through the use of inheritance, programmers can reuse the code in the
superclass many times.

•

Programmers can implement superclasses called abstract classes that define "generic"
behaviors. The abstract superclass defines and may partially implement the behavior but
much of the class is undefined and unimplemented. Other programmers fill in the details
with specialized subclasses.

Data Abstraction:
The essential element of object oriented programming in abstraction. The complexity of
programming in object oriented programming is maintained through abstraction.
For example, the program consist of data and code which work over data. While executing a
program we don’t thing in which location that data is being stored how the input device is
transferring the input to the memory etc. this abstraction allows us to execute the program
without thinking deeply about the complexity of execution of program.

Encapsulation:

12
Advanced C Programming

Encapsulation is the mechanism that binds together code and the data and keeps them safe from
outside world. In the sense it is a protective wrapper that prevents the code and data from being
accessed by other code defied outside the wrapper. Access is controlled through a well defined
interface.

Polymorphism:
Existing in more that one form is called polymorphism.
Polymorphism means the ability to take more that one form. For example an operation may
exhibit different behavior in different behavior in different instances.
For example consider operation of addition. For two numbers the operation will generate a sum.
If the operands are string the operation would produces a third string by concatenation.
C++ supports polymorphism through method overloading and operator overloading

Method overloading:
if the same method name used for different procedures that the method is said to be overloaded.

Dynamic Binding:
Binding refer to the linking of a procedure call to the code to be executed in response to the call.
Dynamic binding means that the code associated with a given procedure call is not know until
the time of the call at runtime. It is associated with a polymorphism reference depends on the
dynamic type of that reference.

Message communication:
An object oriented program consists of objects that communicate with each other. The process
of programming in an object oriented language therefore involves the following basic steps:
1. creating classes that define objects and their behaviors.
2. creating objects from class definitions.
3. establishing communication among objects.

13
Advanced C Programming

Abstract Data Types:
An Abstract Data Type (ADT) is more a way of looking at a data structure: focusing on what it
does and ignoring how it does its job. A stack or a queue is an example of an ADT. It is
important to understand that both stacks and queues can be implemented using an array. It is also
possible to implement stacks and queues using a linked list. This demonstrates the "abstract"
nature of stacks and queues: how they can be considered separately from their implementation.
To best describe the term Abstract Data Type, it is best to break the term down into "data type"
and then "abstract".
Data type:
When we consider a primitive type we are actually referring to two things: a data item with
certain characteristics and the permissible operations on that data. An int in Java, for example,
can contain any whole-number value from -2,147,483,648 to +2,147,483,647. It can also be used
with the operators +, -, *, and /. The data type's permissible operations are an inseparable part of
its identity; understanding the type means understanding what operations can be performed on it.
In C++, any class represents a data type, in the sense that a class is made up of data (fields) and
permissible operations on that data (methods). By extension, when a data storage structure like a
stack or queue is represented by a class, it too can be referred to as a data type. A stack is
different in many ways from an int, but they are both defined as a certain arrangement of data
and a set of operations on that data.
abstract
Now lets look at the "abstract" portion of the phrase. The word abstract in our context stands for
"considered apart from the detailed specifications or implementation".
In C++, an Abstract Data Type is a class considered without regard to its implementation. It can
be thought of as a "description" of the data in the class and a list of operations that can be carried
out on that data and instructions on how to use these operations. What is excluded though, is the
14
Advanced C Programming

details of how the methods carry out their tasks. An end user (or class user), you should be told
what methods to call, how to call them, and the results that should be expected, but not HOW
they work.
We can further extend the meaning of the ADT when applying it to data structures such as a
stack and queue. In Java, as with any class, it means the data and the operations that can be
performed on it. In this context, although, even the fundamentals of how the data is stored should
be invisible to the user. Users not only should not know how the methods work, they should also
not know what structures are being used to store the data.
Consider for example the stack class. The end user knows that push() and pop() (amoung other
similar methods) exist and how they work. The user doesn't and shouldn't have to know how
push() and pop() work, or whether data is stored in an array, a linked list, or some other data
structure like a tree.

15
Advanced C Programming

Stack ADT Algorithms
Push(item)
{
If (stack is full) print “ stack over flow”
else
Increment top ;
Stack [top]= item;
}
Pop()
{
If( stack is empty) print” stack under flow”
else
Decrement top
}
Display()
{
If ( stack is empty) print” no element to display”
else
for i= top to 0 step -1
Print satck[i];
}

16
Advanced C Programming

Stack ADT
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class stack
{
int stk[5];
int top;
public:
stack()
{
top=-1;
}
void push(int x)
{
if(top > 4)
{
cout <<"stack over flow";
return;
}
stk[++top]=x;
cout <<"inserted" <<x;
}
void pop()
{
if(top <0)
{
cout <<"stack under flow";
return;
}
cout <<"deleted" <<stk[top--];
}
void display()
{
if(top<0)
{
cout <<" stack empty";
return;
}

17
Advanced C Programming

for(int i=top;i>=0;i--)
cout <<stk[i] <<" ";
}
};
void main()
{
int ch;
stack st;
clrscr();
while(1)
{
cout <<"n1.push 2.pop 3.display 4.exitnEnter ur choice";
cin >> ch;
switch(ch)
{
case 1: cout <<"enter the element";
cin >> ch;
st.push(ch);
break;
case 2: st.pop(); break;
case 3: st.display();break;
case 4: exit(0);
}
}
}
OUTPUTS
1.push 2.pop 3.display
Enter ur choice2
stack under flow
1.push 2.pop 3.display
Enter ur choice1
enter the element2
inserted2
1.push 2.pop 3.display
Enter ur choice1
enter the element3
inserted3
1.push 2.pop 3.display
Enter ur choice2
deleted3
1.push 2.pop 3.display
Enter ur choice1
enter the element5
18

4.exit
4.exit

4.exit

4.exit
4.exit
Advanced C Programming

Queue ADT Algorithms
Insert ( item)
{
If rear = max -1

then print “ queue is full”

else
{
Increment rear
Queue [rear]=item;
}
}
Delete()
{
If front = rear print “queue is empty”
else
Increment front
}
Display()
{
If front=rear print “queue is empty “
else
For i =front to rear
Print queue[i];
}

19
Advanced C Programming

Queue ADT

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class queue
{
int queue[5];
int rear,front;
public:
queue()
{
rear=-1;
front=-1;
}
void insert(int x)
{
if(rear > 4)
{
cout <<"queue over flow";
front=rear=-1;
return;
}
queue[++rear]=x;
cout <<"inserted" <<x;
}
void delet()
{
if(front==rear)
{
cout <<"queue under flow";
return;
}
cout <<"deleted" <<queue[++front];
}
void display()
{
if(rear==front)
{

20
Advanced C Programming

cout <<" queue empty";
return;
}
for(int i=front+1;i<=rear;i++)
cout <<queue[i]<<" ";
}
};
void main()
{
int ch;
queue qu;
clrscr();
while(1){
cout <<"n1.insert 2.delet 3.display 4.exitnEnter ur choice";
cin >> ch;
switch(ch)
{
case 1: cout <<"enter the element";
cin >> ch;
qu.insert(ch);
break;
case 2: qu.delet(); break;
case 3: qu.display();break;
case 4: exit(0);
}
}
}
OUTPUT
1.insert 2.delet 3.display
Enter ur choice1
enter the element21
inserted21
1.insert 2.delet 3.display
Enter ur choice1
enter the element22
inserted22
1.insert 2.delet 3.display
Enter ur choice1
enter the element16
inserted16
1.insert 2.delet 3.display
Enter ur choice3
21

4.exit

4.exit

4.exit

4.exit
Advanced C Programming

21 22 16 1.insert 2.delet 3.display 4.exit

22
Advanced C Programming

Algorithm for Stack Using Linked List
Push(item)
{
If (stack is full) print “ stack over flow”
else
goto end of list and let it be temp
temp->next=item
item->next=NULL;
}
Pop()
{
If(head is null) print” stack under flow”
else
goto last but one node and let it be temp
temp->next=NULL
}
Display()
{
If ( head=NULL) print” no element to display”
else
{
Temp=head;
While(temp!=NULL)
{
Print(“temp->data)
Temp=temp->next;
}
}
23
Advanced C Programming

Stack Using Linked List

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class node
{
public:
class node *next;
int data;
};
class stack : public node
{
node *head;
int tos;
public:
stack()
{
os=-1;
}
void push(int x)
{
if (tos < 0 )
{
head =new node;
head->next=NULL;
head->data=x;
tos ++;
}
else
{
node *temp,*temp1;
temp=head;
if(tos >= 4)
{
cout <<"stack over flow";
return;
}
tos++;
while(temp->next != NULL)
temp=temp->next;
temp1=new node;

24
Advanced C Programming

temp->next=temp1;
temp1->next=NULL;
temp1->data=x;
}
}
void display()
{
node *temp;
temp=head;
if (tos < 0)
{
cout <<" stack under flow";
return;
}
while(temp != NULL)
{
cout <<temp->data<< " ";
temp=temp->next;
}
}
void pop()
{
node *temp;
temp=head;
if( tos < 0 )
{
cout <<"stack under flow";
return;
}
tos--;
while(temp->next->next!=NULL)
{
temp=temp->next;
}
temp->next=NULL;
}
};
void main()
{
stack s1;
int ch;
clrscr();
while(1)
{
25
Advanced C Programming

cout <<"n1.PUSHn2.POPn3.DISPLAYn4.EXITn enter ru choice:";
cin >> ch;
switch(ch)
{
case 1:
cout <<"n enter a element";
cin >> ch;
s1.push(ch);
break;
case 2: s1.pop();break;
case 3: s1.display();
break;
case 4: exit(0);
}
}
}
OUTPUT
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:1
enter a element23
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:1
enter a element67
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:3
23 67
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:2
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:3
23
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:2
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:2
stack under flow
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:4

26
Advanced C Programming

Algorithm Queue using Linked List
Insert ( item)
{
If rear = max -1 then print “ queue is full”
else
{
Increment rear
Create a new node called item
goto last node in the list and let it be temp
temp-next=item;
item-next=NULL;
}
}
Delete()
{
If front = rear print “queue is empty”
else
{
Increment front
head=head-next;
}
}
Display()
{
If front=rear print “queue is empty “
else Temp=head;
While(temp!=NULL)
{
Print(“temp-data)
Temp=temp-next;
}
}

27
Advanced C Programming

Queue using Linked List
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class node
{
public:
class node *next;
int data;
};
class queue : public node
{
node *head;
int front,rare;
public:
queue()
{
front=-1;
rare=-1;
}
void push(int x)
{
if (rare < 0 )
{
head =new node;
head->next=NULL;
head->data=x;
rare ++;
}
else
{
node *temp,*temp1;
temp=head;
if(rare >= 4)
{
cout <<"queue over flow";
return;
}
rare++;
while(temp->next != NULL)
temp=temp->next;

28
Advanced C Programming

temp1=new node;
temp->next=temp1;
temp1->next=NULL;
temp1->data=x;
}
}
void display()
{
node *temp;
temp=head;
if (rare < 0)
{
cout <<" queue under flow";
return;
}
while(temp != NULL)
{
cout <<temp->data<< " ";
temp=temp->next;
}
}
void pop()
{
node *temp;
temp=head;
if( rare < 0)
{
cout <<"queue under flow";
return;
}
if(front == rare)
{
front = rare =-1;
head=NULL;
return;
}
front++;
head=head->next;
}
};
void main()
{
queue s1;
29
Advanced C Programming

int ch;
clrscr();
while(1)
{
cout <<"n1.PUSHn2.POPn3.DISPLAYn4.EXITn enter ru choice:";
cin >> ch;
switch(ch)
{
case 1:
cout <<"n enter a element";
cin >> ch;
s1.push(ch);
break;
case 2: s1.pop();break;
case 3: s1.display();
break;
case 4: exit(0);
}
}
}
OUTPUT
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:1
enter a element23
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:1
enter a element54
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:3
23 54
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:2
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:2
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:2
queue under flow
1.PUSH 2.POP 3.DISPLAY 4.EXIT
enter ru choice:4

30
Advanced C Programming

Algorithms fo DeQueue Using Double Linked List
Algorithm Insertfirst(item)
{
if dequeue is empty
{
Item-next=item-prev=NULL;
tail=head=item;
}
else if(dequeue is full) print” insertion is not possible”
else
{
item-next=head;
item-prev=NULL;
head=item;
}
}
Algorithm Insertlast (item)
{
if dequeue is empty
{
Item-next=item-prev=NULL;
tail=head=item;
}
else if(dequeue is full) print” insertion is not possible”
else
{
tail-next=head;
item-prev=tail;
tail=item;
}
}
Deletefirst()
{
If (dequeue is empty) print” no node to delete”;
else
{
Head=head-next;
Head-prev=NULL;
}
}

31
Advanced C Programming

Deletelast()
{
if (dequeue is empty) print” no node to delete”;
else
{
tail=tail-prev;
tail-next=NULL;
}
}
Displayfirst()
{
if( dequeue is empty) print “ no node to display”
else
{
temp=head;
while(temp-next!=null) then do
{
print(temp-data);
temp=temp-next;
}
}
}

Displaylast()
{
if( dequeue is empty) print “ no node to display”
else
{
temp=tail
while(temp-prevt!=null) then do
{
print(temp-data);
temp=temp-prev;
}
}
}

32
Advanced C Programming

Implementation of DeQueue Using Double Linked List
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class node
{
public:
int data;
class node *next;
class node *prev;
};
class dqueue: public node
{
node *head,*tail;
int top1,top2;
public:
dqueue()
{
top1=0;
top2=0;
head=NULL;
tail=NULL;
}
void push(int x)
{
node *temp;
int ch;
if(top1+top2 >=5)
{
cout <<"dqueue overflow";
return ;
}
if( top1+top2 == 0)
{
head = new node;
head->data=x;
head->next=NULL;
head->prev=NULL;
tail=head;
top1++;

33
Advanced C Programming

}
else
{
cout <<" Add element 1.FIRST 2.LASTn enter ur choice:";
cin >> ch;
if(ch==1)
{
top1++;
temp=new node;
temp->data=x;
temp->next=head;
temp->prev=NULL;
head->prev=temp;
head=temp;
}
else
{
top2++;
temp=new node;
temp->data=x;
temp->next=NULL;
temp->prev=tail;
tail->next=temp;
tail=temp;
}
}
}
void pop()
{
int ch;
cout <<"Delete 1.First Node 2.Last Noden Enter ur choice:";
cin >>ch;
if(top1 + top2 <=0)
{
cout <<"nDqueue under flow";
return;
}
if(ch==1)
{
head=head->next;
head->prev=NULL;
top1--;
}
34
Advanced C Programming

else
{
top2--;
tail=tail->prev;
tail->next=NULL;
}
}
void display()
{
int ch;
node *temp;
cout <<"display from 1.Staring 2.Endingn Enter ur choice";
cin >>ch;
if(top1+top2 <=0)
{
cout <<"under flow";
return ;
}
if (ch==1)
{
temp=head;
while(temp!=NULL)
{
cout << temp->data <<" ";
temp=temp->next;
}
}
else
{
temp=tail;
while( temp!=NULL)
{
cout <<temp->data << " ";
temp=temp->prev;
}
}
}
};
void main()
{
dqueue d1;
int ch;
clrscr();
35
Advanced C Programming

while (1)
{
cout <<"1.INSERT 2.DELETE 3.DISPLAU 4.EXITn Enter ur choice:";
cin >>ch;
switch(ch)
{
case 1: cout <<"enter element";
cin >> ch;
d1.push(ch); break;
case 2:
d1.pop(); break;
case 3:
d1.display(); break;
case 4: exit(1);
}
}
}
OUTPUT
1.INSERT 2.DELETE 3.DISPLAU 4.EXIT
Enter ur choice:1
enter element4
1.INSERT 2.DELETE 3.DISPLAU 4.EXIT
Enter ur choice:1
enter element5
Add element 1.FIRST 2.LAST
enter ur choice:1
1.INSERT 2.DELETE 3.DISPLAU 4.EXIT
Enter ur choice:1
enter element6
Add element 1.FIRST 2.LAST
enter ur choice:2
1.INSERT 2.DELETE 3.DISPLAU 4.EXIT
Enter ur choice:3
display from 1.Staring 2.Ending
Enter ur choice1
5 4 6 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT
Enter ur choice:2
Delete 1.First Node 2.Last Node
Enter ur choice:1
1.INSERT 2.DELETE 3.DISPLAU 4.EXIT
Enter ur choice:3
display from 1.Staring 2.Ending
Enter ur choice1
4 6 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT
Enter ur choice:4

36
Advanced C Programming

Algorithm for Circular Queue
Algorithm Insertfirst(item)
{
if cqueue is empty

then

head=item;

else if(cqueue is full) print” insertion is not possible”
else
{
Rear=(rear +1) mod max
}

cqueue[rear]=x;

}

Algorithm Deletet()
{
If (dequeue is empty) print” no node to delete”;
else
{
Front=(front+1) mod max
}
}
Algorithm display()
{
If (front >rear) display elements for front to max and 0 to rear
Else display elements from front to rear
}

37
Advanced C Programming

Implementation of Circular Queue Using Array

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class cqueue
{
int q[5],front,rare;
public:
cqueue()
{
front=-1;
rare=-1;
}
void push(int x)
{
if(front ==-1 && rare == -1)
{
q[++rare]=x;
front=rare;
return;
}
else if(front == (rare+1)%5 )
{
cout <<" Circular Queue over flow";
return;
}
rare= (rare+1)%5;
q[rare]=x;
}
void pop()
{
if(front==-1 && rare==
-1)
{
cout <<"under flow";
return;
}
else if( front== rare )
{
front=rare=-1;
return;
38
Advanced C Programming

}
front= (front+1)%5;
}
void display()
{
int i;
if( front <= rare)
{
for(i=front; i<=rare;i++)
cout << q[i]<<" ";
}
else
{
for(i=front;i<=4;i++)
{
cout <<q[i] << " ";
}
for(i=0;i<=rare;i++)
{
cout << q[i]<< " ";
}
}
}
};
void main(){
int ch;
cqueue q1;
clrscr();
while( 1)
{
cout<<"n1.INSERT 2.DELETE 3.DISPLAY
cin >> ch;
switch(ch)
{
case 1: cout<<"enter element";
cin >> ch;
q1.push(ch);
break;
case 2: q1.pop(); break;
case 3: q1.display(); break;
case 4: exit(0);
}
}
}
39

4.EXITnEnter ur choice";
Advanced C Programming

OUTPUT
1.INSERT 2.DELETE 3.DISPLAY
Enter ur choice1
enter element4

4.EXIT

1.INSERT 2.DELETE 3.DISPLAY
Enter ur choice1
enter element5

4.EXIT

1.INSERT 2.DELETE 3.DISPLAY
Enter ur choice1
enter element3

4.EXIT

1.INSERT 2.DELETE 3.DISPLAY
Enter ur choice3
453
1.INSERT 2.DELETE 3.DISPLAY
Enter ur choice2

4.EXIT

1.INSERT 2.DELETE 3.DISPLAY
Enter ur choice3
53
1.INSERT 2.DELETE 3.DISPLAY
Enter ur choice4

4.EXIT

40

4.EXIT

4.EXIT
Advanced C Programming

Program to Algorithm for Dictionary Dictionary
Implement Functions of a

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
# define max 10
typedef struct list
{
int data;
struct list *next;
}node_type;
node_type *ptr[max],*root[max],*temp[max];
class Dictionary
{
public:
int index;
Dictionary();
void insert(int);
void search(int);
void delete_ele(int);
};
Dictionary::Dictionary()
{
index=-1;
for(int i=0;i<max;i++)
{
root[i]=NULL;
ptr[i]=NULL;
temp[i]=NULL;
}
}
void Dictionary::insert(int key)
{
index=int(key%max);
ptr[index]=(node_type*)malloc(sizeof(node_type));
ptr[index]->data=key;
if(root[index]==NULL)
{

41
Advanced C Programming

root[index]=ptr[index];
root[index]->next=NULL;
temp[index]=ptr[index];
}
else
{
temp[index]=root[index];
while(temp[index]->next!=NULL)
temp[index]=temp[index]->next;
temp[index]->next=ptr[index];
}
}
void Dictionary::search(int key)
{
int flag=0;
index=int(key%max);
temp[index]=root[index];
while(temp[index]!=NULL)
{
if(temp[index]->data==key)
{
cout<<"nSearch key is found!!";
flag=1;
break;
}
else temp[index]=temp[index]->next;
}
if (flag==0)
cout<<"nsearch key not found.......";
}
void Dictionary::delete_ele(int key)
{
index=int(key%max);
temp[index]=root[index];
while(temp[index]->data!=key && temp[index]!=NULL)
{
ptr[index]=temp[index];
temp[index]=temp[index]->next;
}
ptr[index]->next=temp[index]->next;
cout<<"n"<<temp[index]->data<<" has been deleted.";
temp[index]->data=-1;
42
Advanced C Programming

temp[index]=NULL;
free(temp[index]);
}

void main()
{
int val,ch,n,num;
char c;
Dictionary d;
clrscr();
do
{
cout<<"nMENU:n1.Create";
cout<<"n2.Search for a valuen3.Delete an value";
cout<<"nEnter your choice:";
cin>>ch;
switch(ch)
{
case 1: cout<<"nEnter the number of elements to be inserted:";
cin>>n;
cout<<"nEnter the elements to be inserted:";
for(int i=0;i<n;i++)
{
cin>>num;
d.insert(num);
}
break;
case 2: cout<<"nEnter the element to be searched:";
cin>>n;
d.search(n);
case 3: cout<<"nEnter the element to be deleted:";
cin>>n;
d.delete_ele(n);
break;
default: cout<<"nInvalid choice....";
}
cout<<"nEnter y to continue......";
cin>>c;
}while(c=='y');
getch();
}

43
Advanced C Programming

OUTPUT
MENU:
1.Create
2.Search for a value
3.Delete an value
Enter your choice:1
Enter the number of elements to be inserted:8
Enter the elements to be inserted:10 4 5 8 7 12 6 1
Enter y to continue......y
MENU:
1.Create
2.Search for a value
3.Delete an value
Enter your choice:2
Enter the element to be searched:12
Search key is found!!
Enter the element to be deleted:1
1 has been deleted.
Enter y to continue......y

44
Advanced C Programming

AVL TREE
Algorithm insertion(int x)
{
If(tree is empty) then root is empty
Otherwise
{
temp=search(item); // temp is the node where search for the
item halts
if( item > temp) then temp-right=item;
otherwise temp-left =item
•
•
•
•
•

Reconstruction procedure: rotating tree
left rotation and right rotation
Suppose that the rotation occurs at node x
Left rotation: certain nodes from the right subtree of x
move to its left subtree; the root of the right subtree of
x becomes the new root of the reconstructed subtree
Right rotation at x: certain nodes from the left subtree of
x move to its right subtree; the root of the left subtree
of x becomes the new root of the reconstructed subtree

}
Algorithm Search(int x)
Algorithm delete()
{
• Case 1: the node to be deleted
• Case 2: the node to be deleted
is, its right subtree is empty
• Case 3: the node to be deleted
is, its left subtree is empty
• Case 4: the node to be deleted
right child
}

is a leaf
has no right child, that
has no left child, that
has a left child and a

Algorithm Search(x, root)
{
if(tree is empty ) then print” tree is empty”
otherwise
If(x grater than root) search(root-right);
Otherwise if(x less than root ) search(root-left)
Otherwise return true
}
}
45
Advanced C Programming

AVL TREE
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
void insert(int,int );
void delte(int);
void display(int);
int search(int);
int search1(int,int);
int avltree[40],t=1,s,x,i;
void main()
{
int ch,y;
for(i=1;i<40;i++)
avltree[i]=-1;
while(1)
{
cout <<"1.INSERTn2.DELETEn3.DISPLAYn4.SEARCHn5.EXITnEnter
your choice:";
cin >> ch;
switch(ch)
{
case 1:
cout <<"enter the element to insert";
cin >> ch;
insert(1,ch);
break;
case 2:
cout <<"enter the element to delete";
cin >>x;
y=search(1);
if(y!=-1) delte(y);
else cout<<"no such element in avlavltree";
break;
case 3:
display(1);
cout<<"n";
for(int i=0;i<=32;i++)
cout <<i;

46
Advanced C Programming

cout <<"n";
break;
case 4:
cout <<"enter the element to search:";
cin >> x;
y=search(1);
if(y == -1) cout <<"no such element in avltree";
else cout <<x << "is in" <<y <<"position";
break;
case 5:
exit(0);
}
}
}
void insert(int s,int ch )
{
int x,y;
if(t==1)
{
avltree[t++]=ch;
return;
}
x=search1(s,ch);
if(avltree[x]>ch)
{ avltree[2*x]=ch;
y=log(2*x)/log(2);
if(height(1,y))
{
if( x%2==0 )
update1();
else
update2();
}
}
else {
avltree[2*x+1]=ch;
y=log(2*x)/log(2);
if(height(1,y))
{
if(x%2==1)
update1();
else
update2();
}
47
Advanced C Programming

}
t++;
}
void delte(int x)
{
if( avltree[2*x]==-1 && avltree[2*x+1]==-1)
avltree[x]=-1;
else if(avltree[2*x]==-1)
{ avltree[x]=avltree[2*x+1];
avltree[2*x+1]=-1;
}
else if(avltree[2*x+1]==-1)
{ avltree[x]=avltree[2*x];
avltree[2*x]=-1;
}
else
{
avltree[x]=avltree[2*x];
delte(2*x);
}
t--;
}
int search(int s)
{
if(t==1)
{
cout <<"no element in avltree";
return -1;
}
if(avltree[s]==-1)
return avltree[s];
if(avltree[s]>x)
search(2*s);
else if(avltree[s]<x)
search(2*s+1);
else
return s;
}
void display(int s)
{
if(t==1)
{
cout <<"no element in avltree:";
48
Advanced C Programming

return;
}
for(int i=1;i<40;i++)
if(avltree[i]==-1)
cout <<" ";
else cout <<avltree[i];
return ;
}
int search1(int s,int ch)
{
if(t==1)
{
cout <<"no element in avltree";
return -1;
}
if(avltree[s]==-1)
return s/2;
if(avltree[s] > ch)
search1(2*s,ch);
else search1(2*s+1,ch);
}
int height(int s,int y)
{
if(avltree[s]==-1)
return;
}

49
Advanced C Programming

OUTPUT
1.insert 2.display 3.delete 4.search 5.exit
Enter u r choice to perform on AVL tree1
Enter an element to insert into tree4
do u want to continuey
1.insert 2.display 3.delete 4.search 5.exit
Enter u r choice to perform on AVL tree1
Enter an element to insert into tree5
do u want to continuey
1.insert 2.display 3.delete 4.search 5.exit
Enter u r choice to perform on AVL tree3
Enter an item to deletion5
itemfound
do u want to continuey
1.insert 2.display 3.delete 4.search 5.exit
Enter u r choice to perform on AVL tree2
4
do u want to continue4

50
Advanced C Programming

Breath First Search Algorithm
Algorithm BFS(s):

Input: A vertex s in a graph

Output: A labeling of the edges as “discovery” edges and “cross
edges”
initialize container L0 to contain vertex s
i ¬ 0
while Li is not empty do
create container Li+1 to initially be empty
for each vertex v in Li do
if edge e incident on v do
let w be the other endpoint of e
if vertex w is unexplored then
label e as a discovery edge
insert w into Li+1
else label e as a cross edge
i ¬ i + 1

51
Advanced C Programming

Breath First Search Implementation

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int cost[10][10],i,j,k,n,qu[10],front,rare,v,visit[10],visited[10];
void main()
{
clrscr();
int m;
cout <<"enterno of vertices";
cin >> n;
cout <<"ente no of edges";
cin >> m;
cout <<"nEDGES n";
for(k=1;k<=m;k++)
{
cin >>i>>j;
cost[i][j]=1;
}
cout <<"enter initial vertex";
cin >>v;
cout <<"Visitied verticesn";
cout << v;
xvisited[v]=1;
k=1;
while(k<n)
{
for(j=1;j<=n;j++)
if(cost[v][j]!=0 && visited[j]!=1 && visit[j]!=1)
{
visit[j]=1;
qu[rare++]=j;
}
v=qu[front++];
cout<<v << " ";
k++;
visit[v]=0; visited[v]=1;
}
}

52
Advanced C Programming

OUTPUT
enterno of vertices9
ente no of edges9
EDGES
12
23
15
14
47
78
89
26
57
enter initial vertex1
Visited vertices
12 4 5 3 6 7 8 9

53
Advanced C Programming

Depth First Search Algorithm
Algorithm DFS(v); Input: A vertex v in a graph
Output: A labeling of the edges as “discovery” edges and
“backedges”
for each edge e incident on v do
if edge e is unexplored then let w be the other
endpoint of e
if vertex w is unexplored then label e as a discovery
edge recursively call DFS(w)
else label e as a backedge

54
Advanced C Programming

Depth First Search

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int cost[10][10],i,j,k,n,stk[10],top,v,visit[10],visited[10];
void main()
{
int m;
clrscr();
cout <<"enterno of vertices";
cin >> n;
cout <<"ente no of edges";
cin >> m;
cout <<"nEDGES n";
for(k=1;k<=m;k++)
{
cin >>i>>j;
cost[i][j]=1;
}
cout <<"enter initial vertex";
cin >>v;
cout <<"ORDER OF VISITED VERTICES";
cout << v <<" ";
visited[v]=1;
k=1;
while(k<n)
{
for(j=n;j>=1;j--)
if(cost[v][j]!=0 && visited[j]!=1 && visit[j]!=1)
{
visit[j]=1;
stk[top]=j;
top++;
}
v=stk[--top];
cout<<v << " ";
k++;
visit[v]=0; visited[v]=1;
}
}

55
Advanced C Programming

OUTPUT
enterno of vertices9
ente no of edges9
EDGES
12
23
26
15
14
47
57
78
89
enter initial vertex1
ORDER OF VISITED VERTICES1 2 3 6 4 7 8 9 5

56
Advanced C Programming

Prim’s Algorithm
Algorithm Prim(E,Cost,n,t)
{
Let (k, l) be an edge of minimum cost in E;
Mincost= cost[k,l];
t[1,1]=k;
t[1,2]=l;
for i=1 to n

do

{
If (cost[i, l]<cost[k,l]) then near[i]=l;
Else
Near[i]=k;
Near[k]=near[j]=0;
}
For i=2 to n -1

do

{
Let j be an index such that nearpj]!= 0 and cost[j,near[j]]
is minimum
T[I,1]=j ; t[I,2]=near[j]
mincost=mincost + cost[j,near[j]];
near[j]=0;
for k=1 to n do
if(near[k] !=0 ) and cost[k,near[k]])
then near[j]=k
}
}

57

>cost[k,j])
Advanced C Programming

Prim’s Algorithm
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int cost[10][10],i,j,k,n,stk[10],top,v,visit[10],visited[10],u;
void main()
{
int m,c;
clrscr();
cout <<"enterno of vertices";
cin >> n;
cout <<"ente no of edges";
cin >> m;
cout <<"nEDGES Costn";
for(k=1;k<=m;k++)
{
cin >>i>>j>>c;
cost[i][j]=c;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(cost[i][j]==0)
cost[i][j]=31999;
cout <<"ORDER OF VISITED VERTICES";
k=1;
while(k<n)
{
m=31999;
if(k==1)
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(cost[i][j]<m)
{
m=cost[i][j];
u=i;
}
}
else
{
for(j=n;j>=1;j--)

58
Advanced C Programming

if(cost[v][j]<m && visited[j]!=1 && visit[j]!=1)
{
visit[j]=1;
stk[top]=j;
top++;
m=cost[v][j];
u=j;
}
}
cost[v][u]=31999;
v=u;
cout<<v << " ";
k++;
visit[v]=0; visited[v]=1;
}
}
OUTPUT
enterno of vertices7
ente no of edges9
EDGES Cost
1 6 10
6 5 25
5 4 22
4 3 12
3 2 16
2 7 14
5 7 24
4 7 18
1 2 28
ORDER OF VISITED VERTICES1 6 5 4 3 2

59
Advanced C Programming

Kruskal’s Algorithm
Algorithm Krushkal(E, cost,n,t)
{
for i=1 to n do parent[i]=-1;
i=0;
mincost=0;
while( I < n-1)
{
Delete a minimum coast edge (u,v) form the heap and
reheapfy using adjust
J=find(u);
K=find(v);
If(j!=k) then
{
i=i+1;
t[I,1]=u; t[I,2]=v;
mincost=mincost+ cost[u,v];
union(j,k)
}
If( i !=

n-1) the write (“ no spanning tree”);

else
Return mincost
}
}

60
Advanced C Programming

Kruskal’s Algorithm

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int cost[10][10],i,j,k,n,m,c,visit,visited[10],l,v,count,count1,vst,p;
main()
{
int dup1,dup2;
cout<<"enter no of vertices";
cin >> n;
cout <<"enter no of edges";
cin >>m;
cout <<"EDGE Cost";
for(k=1;k<=m;k++)
{
cin >>i >>j >>c;
cost[i][j]=c;
cost[j][i]=c;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(cost[i][j]==0)
cost[i][j]=31999;
visit=1;
while(visit<n)
{
v=31999;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(cost[i][j]!=31999 && cost[i][j]<v && cost[i][j]!=-1 )
{
count =0;
for(p=1;p<=n;p++)
{
if(visited[p]==i || visited[p]==j)
count++;
}
if(count >= 2)
{
for(p=1;p<=n;p++)
if(cost[i][p]!=31999 && p!=j)

61
Advanced C Programming

dup1=p;
for(p=1;p<=n;p++)
if(cost[j][p]!=31999 && p!=i)
dup2=p;
if(cost[dup1][dup2]==-1)
continue;
}
l=i;
k=j;
v=cost[i][j];
}
cout <<"edge from " <<l <<"-->"<<k;
cost[l][k]=-1;
cost[k][l]=-1;
visit++;
count=0;
count1 =0;
for(i=1;i<=n;i++)
{
if(visited[i]==l)
count++;
if(visited[i]==k)
count1++;
}
if(count==0)
visited[++vst]=l;
if(count1==0)
visited[++vst]=k;
}
}

62
Advanced C Programming

Single Source Shortest Path
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
int shortest(int ,int);
int cost[10][10],dist[20],i,j,n,k,m,S[20],v,totcost,path[20],p;
void main()
{
int c;
clrscr();
cout <<"enter no of vertices";
cin >> n;
cout <<"enter no of edges";
cin >>m;
cout <<"nenternEDGE Costn";
for(k=1;k<=m;k++)
{
cin >> i >> j >>c;
cost[i][j]=c;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(cost[i][j]==0)
cost[i][j]=31999;
cout <<"enter initial vertex";
cin >>v;
cout << v<<"n";
shortest(v,n);
}
shortest(int v,int n)
{
int min;
for(i=1;i<=n;i++)
{
S[i]=0;
dist[i]=cost[v][i];
}
path[++p]=v;

63
Advanced C Programming

S[v]=1;
dist[v]=0;
for(i=2;i<=n-1;i++)
{
k=-1;
min=31999;
for(j=1;j<=n;j++)
{
if(dist[j]<min && S[j]!=1)
{
min=dist[j];
k=j;
}
}
if(cost[v][k]<=dist[k])
p=1;
path[++p]=k;
for(j=1;j<=p;j++)
cout<<path[j];
cout <<"n";
//cout <<k;
S[k]=1;
for(j=1;j<=n;j++)
if(cost[k][j]!=31999 && dist[j]>=dist[k]+cost[k][j] && S[j]!=1)
dist[j]=dist[k]+cost[k][j];
}
}
OUTPUT
enter no of vertices6
enter no of edges11
enter
EDGE Cost
1 2 50
1 3 45
1 4 10
2 3 10
2 4 15
3 5 30
64
Advanced C Programming

4 1 10
4 5 15
5 2 20
5 3 35
653
enter initial vertex1
1
14
145
1452
13

65
Advanced C Programming

Non recursive Pre order Traversing Algorithm

Algorithm preorder( root)
{
1. current = root;

//start the traversal at the root node

2. while(current is not NULL or stack is nonempty)
if(current is not NULL)
{
visit current;
push current onto stack;
current = current->llink;
}
else
{
pop stack into current;
current = current->rlink;

//prepare to visit
//the right subtree

}

66
Advanced C Programming

Non recursive Pre order Traversing
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class node
{
public:
class node *left;
class node *right;
int data;
};
class tree: public node
{
public:
int stk[50],top;
node *root;
tree()
{
root=NULL;
top=0;
}
void insert(int ch)
{
node *temp,*temp1;
if(root== NULL)
{
root=new node;
root->data=ch;
root->left=NULL;
root->right=NULL;
return;
}
temp1=new node;
temp1->data=ch;
temp1->right=temp1->left=NULL;
temp=search(root,ch);
if(temp->data>ch)
temp->left=temp1;
else
temp->right=temp1;

67
Advanced C Programming

}
node *search(node *temp,int ch)
{
if(root== NULL)
{
cout <<"no node present";
return NULL;
}
if(temp->left==NULL && temp->right== NULL)
return temp;
if(temp->data>ch)
{ if(temp->left==NULL) return temp;
search(temp->left,ch);}
else
{ if(temp->right==NULL) return temp;
search(temp->right,ch);
}

}

void display(node *temp)
{
if(temp==NULL)
return ;
display(temp->left);
cout<<temp->data <<" ";
display(temp->right);
}
void preorder( node *root)
{
node *p,*q;
p=root;
q=NULL;
top=0;
while(p!=NULL)
{
cout <<p->data << " ";
if(p->right!=NULL)
{
stk[top]=p->right->data;
top++;
}
p=p->left;
if(p==NULL && top>0)
68
Advanced C Programming

{
p=pop(root);
}
}
}
node * pop(node *p)
{
int ch;
ch=stk[top-1];
if(p->data==ch)
{
top--;
return p;
}
if(p->data>ch)
pop(p->left);
else
pop(p->right);
}
};
void main()
{
tree t1;
int ch,n,i;
while(1)
{
cout <<"n1.INSERTn2.DISPLAY 3.PREORDER TRAVERSEn4.EXITnEnter
your choice:";
cin >> ch;
switch(ch)
{
case 1: cout <<"enter no of elements to insert:";
cout<<"n enter the elements";
cin >> n;
for(i=1;i<=n;i++)
{ cin >> ch;
t1.insert(ch);
}
break;
case 2: t1.display(t1.root);break;
case 3: t1.preorder(t1.root); break;
case 4: exit(1);
}
}
}

69
Advanced C Programming

OUTPUT
1.INSERT
2.DISPLAY 3.PREORDER TRAVERSE
4.EXIT
Enter your choice:1
enter no of elements to insert
enter the elements7
5 24 36 11 44 2 21
1.INSERT
2.DISPLAY 3.PREORDER TRAVERSE
4.EXIT
Enter your choice:2
2 5 11 21 24 36 44
1.INSERT
2.DISPLAY 3.PREORDER TRAVERSE
4.EXIT
Enter your choice:3
5 2 24 11 21 36 44
1.INSERT
2.DISPLAY 3.PREORDER TRAVERSE
4.EXIT
Enter your choice:4

70
Advanced C Programming

Non recursive In order Traversing
Algorithm inorder(

root)

{
1. current = root;

//start traversing the binary tree at
// the root node

2. while(current is not NULL or stack is nonempty)
if(current is not NULL)
{
push current onto stack;
current = current->llink;
}
else
{
pop stack into current;
visit current;

//visit the node

current = current->rlink;

//move to the
//right child

}
}

71
Advanced C Programming

Non recursive In order Traversing

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class node
{
public:
class node *left;
class node *right;
int data;
};
class tree: public node
{
public:
int stk[50],top;
node *root;
tree()
{
root=NULL;
top=0;
}
void insert(int ch)
{
node *temp,*temp1;
if(root== NULL)
{
root=new node;
root->data=ch;
root->left=NULL;
root->right=NULL;
return;
}
temp1=new node;
temp1->data=ch;
temp1->right=temp1->left=NULL;
temp=search(root,ch);
if(temp->data>ch)
temp->left=temp1;
else
temp->right=temp1;

72
Advanced C Programming

}
node *search(node *temp,int ch)
{
if(root== NULL)
{
cout <<"no node present";
return NULL;
}
if(temp->left==NULL && temp->right== NULL)
return temp;
if(temp->data>ch)
{ if(temp->left==NULL) return temp;
search(temp->left,ch);}
else
{ if(temp->right==NULL) return temp;
search(temp->right,ch);
}

}

void display(node *temp)
{
if(temp==NULL)
return ;
display(temp->left);
cout<<temp->data;
display(temp->right);
}
void inorder( node *root)
{
node *p;
p=root;
top=0;
do
{
while(p!=NULL)
{
stk[top]=p->data;
top++;
p=p->left;
}
if(top>0)
{
73
Advanced C Programming

p=pop(root);
cout << p->data;
p=p->right;
}
}while(top!=0 || p!=NULL);
}
node * pop(node *p)
{
int ch;
ch=stk[top-1];
if(p->data==ch)
{
top--;
return p;
}
if(p->data>ch)
pop(p->left);
else
pop(p->right);
}
};
void main()
{
tree t1;
int ch,n,i;
while(1)
{
cout <<"n1.INSERTn2.DISPLAY 3.INORDER TRAVERSEn4.EXITnEnter
your choice:";
cin >> ch;
switch(ch)
{
case 1: cout <<"enter no of elements to insert:";
cin >> n;
for(i=1;i<=n;i++)
{ cin >> ch;
t1.insert(ch);
}
break;
case 2: t1.display(t1.root);break;
case 3: t1.inorder(t1.root); break;
case 4: exit(1);
}
74
Advanced C Programming

}
}
OUTPUT
1.INSERT
2.DISPLAY 3.INORDER TRAVERSE
4.EXIT
Enter your choice:1
enter no of elements to inser
5 24 36 11 44 2 21
1.INSERT
2.DISPLAY 3.INORDER TRAVERSE
4.EXIT
Enter your choice:3
251121243644
1.INSERT
2.DISPLAY 3.INORDER TRAVERSE
4.EXIT
Enter your choice:3
251121243644
1.INSERT
2.DISPLAY 3.INORDER TRAVERSE
4.EXIT
Enter your choice:4

75
Advanced C Programming

Non recursive Post order Traversing Algorithm
Algorithm

postorder( node

root)

{
1.

current = root;

//start traversal at root node

2. v = 0;
3. if(current is NULL)
the binary tree is empty
4. if(current is not NULL)
a. push current into stack;
b. push 1 onto stack;
c. current = current->llink;
d. while(stack is not empty)
if(current is not NULL and v is 0)
{
push current and 1 onto stack;
current = current->llink;
}
else
{
pop stack into current and v;
if(v == 1)
{
push current and 2 onto stack;
current = current->rlink;
v = 0;
}
else
visit current;
}}

76
Advanced C Programming

Non recursive Post order Traversing

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class node
{
public:
class node *left;
class node *right;
int data;
};
class tree: public node
{
public:
int stk[50],top;
node *root;
tree()
{
root=NULL;
top=0;
}
void insert(int ch)
{
node *temp,*temp1;
if(root== NULL)
{
root=new node;
root->data=ch;
root->left=NULL;
root->right=NULL;
return;
}
temp1=new node;
temp1->data=ch;
temp1->right=temp1->left=NULL;
temp=search(root,ch);
if(temp->data>ch)
temp->left=temp1;
else
temp->right=temp1;

77
Advanced C Programming

}
node *search(node *temp,int ch)
{
if(root== NULL)
{
cout <<"no node present";
return NULL;
}
if(temp->left==NULL && temp->right== NULL)
return temp;
if(temp->data>ch)
{ if(temp->left==NULL) return temp;
search(temp->left,ch);}
else
{ if(temp->right==NULL) return temp;
search(temp->right,ch);
}

}

void display(node *temp)
{
if(temp==NULL)
return ;
display(temp->left);
cout<<temp->data << " ";
display(temp->right);
}
void postorder( node *root)
{
node *p;
p=root;
top=0;
while(1)
{
while(p!=NULL)
{
stk[top]=p->data;
top++;
if(p->right!=NULL)
stk[top++]=-p->right->data;
p=p->left;

78
Advanced C Programming

}

}
while(stk[top-1] > 0 || top==0)
{
if(top==0) return;
cout << stk[top-1] <<" ";
p=pop(root);
}
if(stk[top-1]<0)
{
stk[top-1]=-stk[top-1];
p=pop(root);
}

}
node * pop(node *p)
{
int ch;
ch=stk[top-1];
if(p->data==ch)
{
top--;
return p;
}
if(p->data>ch)
pop(p->left);
else
pop(p->right);
}
};
void main()
{
tree t1;
int ch,n,i;
clrscr();
while(1)
{
cout <<"n1.INSERTn2.DISPLAY 3.POSTORDER
TRAVERSEn4.EXITnEnter your choice:";
cin >> ch;
switch(ch)
{
case 1: cout <<"enter no of elements to insert:";
cout<<"n enter the elements";
cin >> n;
for(i=1;i<=n;i++)
{ cin >> ch;
79
Advanced C Programming

t1.insert(ch);
}
break;
case 2: t1.display(t1.root);break;
case 3: t1.postorder(t1.root); break;
case 4: exit(1);
}
}
}
OUTPUT
1.INSERT
2.DISPLAY 3.POSTORDER TRAVERSE
4.EXIT
Enter your choice:1
enter no of elements to insert:
enter the elements7
5 24 36 11 44 2 21
1.INSERT
2.DISPLAY 3.POSTORDER TRAVERSE
4.EXIT
Enter your choice:2
2 5 11 21 24 36 44
1.INSERT
2.DISPLAY 3.POSTORDER TRAVERSE
4.EXIT
Enter your choice:3
2 21 11 44 36 24 5
1.INSERT
2.DISPLAY 3.POSTORDER TRAVERSE
4.EXIT
Enter your choice:4

80
Advanced C Programming

Quick Sort Algorithm
Algorithm quicksort(a[],p,q)
{
V=a[p];
i=p;
j=q;
if(i<j)
{
repeat
{
repeat
I=i+1;
Until( a[i]> v);
Repeat
J=j-1;
Until(a[j]<v);
If(i<j) then interchange ( a[i],a[j])
}until (i<=j);
interchange(a[j], a[p])
}
quicksort(a[],p,j);
quicksort(a[],j+1,q);
}

81
Advanced C Programming

Quick Sort

#include<iostream.h>
#include<conio.h>
int a[10],l,u,i,j;
void quick(int *,int,int);
void main()
{
clrscr();
cout <<"enter 10 elements";
for(i=0;i<10;i++)
cin >> a[i];
l=0;
u=9;
quick(a,l,u);
cout <<"sorted elements";
for(i=0;i<10;i++)
cout << a[i] << " ";
getch();
}
void quick(int a[],int l,int u)
{
int p,temp;
if(l<u)
{
p=a[l];
i=l;
j=u;
while(i<j)
{
while(a[i] <= p && i<j )
i++;
while(a[j]>p && i<=j )
j--;
if(i<=j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;}
}
temp=a[j];

82
Advanced C Programming

a[j]=a[l];
a[l]=temp;
cout <<"n";
for(i=0;i<10;i++)
cout <<a[i]<<" ";
quick(a,l,j-1);
quick(a,j+1,u);
}
}
OUTPUT
enter 10 elements5 2 3 16 25 1 20 7 8 61 14
1 2 3 5 25 16 20 7 8 61
1 2 3 5 25 16 20 7 8 61
1 2 3 5 25 16 20 7 8 61
1 2 3 5 25 16 20 7 8 61
1 2 3 5 25 16 20 7 8 61
1 2 3 5 8 16 20 7 25 61
1 2 3 5 7 8 20 16 25 61
1 2 3 5 7 8 16 20 25 61
1 2 3 5 7 8 16 20 25 61 sorted elements1 2 3 5 7 8 16 20 25 61

83
Advanced C Programming

Merge Sort Algorithm
Algorithm Mergesort(low,high)
{
If(low<high)
{
Mid=(low+high)/2;
Mergesort(low,mid);
Mergesort(mid+1,high)
Merge(low,mid,high);
}
}
Algorithm Merge(low,mid,high)
{
h=low; i=low; j=mid+1;
While(h<=mid and j<=high) do
{
If(a[h]<a[j]) then
{
b[i]=a[h];
h=h+1;
}
else
{
b[i]=a[j];
J=j+1;
}
if(h>mid)
{
For k= j to high do
b[i]=a[k]; i=i+1;
}
Else
{
For k=h to mid do
b[i]=a[k]; i=i+1;
}
For k= low to high do a[k]=b[k];
}
}

84
Advanced C Programming

Merge Sort

#include<iostream.h>
#include<conio.h>
void mergesort(int *,int,int);
void merge(int *,int,int,int);
int a[20],i,n,b[20];
void main()
{
clrscr();
cout <<"N enter no of elements";
cin >> n;
cout <<"enter the elements";
for(i=0;i<n;i++)
cin >> a[i];
mergesort(a,0,n-1);
cout <<" numbers after sort";
for(i=0;i<n;i++)
cout << a[i] << " ";
getch();
}
void mergesort(int a[],int i,int j)
{
int mid;
if(i<j)
{
mid=(i+j)/2;
mergesort(a,i,mid);
mergesort(a,mid+1,j);
merge(a,i,mid,j);
}
}
void merge(int a[],int low,int mid ,int high)
{
int h,i,j,k;
h=low;
i=low;
j=mid+1;

85
Advanced C Programming

while(h<=mid && j<=high)
{
if(a[h]<=a[j])
b[i]=a[h++];
else
b[i]=a[j++];
i++;
}
if( h > mid)
for(k=j;k<=high;k++)
b[i++]=a[k];
else
for(k=h;k<=mid;k++)
b[i++]=a[k];
cout <<"n";
for(k=low;k<=high;k++)
{
a[k]=b[k];
cout << a[k] <<" ";
}
}
OUTPUT
N enter no of elements8 12 5 61 60 50 1 70 81
enter the elements
5 12
60 61
5 12 60 61
1 50
70 81
1 50 70 81
1 5 12 50 60 61 70 81 numbers after sort1 5 12 50 60 61 70 81

86
Advanced C Programming

Heap Sort Algorithm
Definition: A heap is a list in which each element contains a key, such that the key in the
element at position k in the list is at least as large as the key in the element at position 2k + 1
(if it exists), and 2k + 2 (if it exists)
Algorithm Heapify(a[],n)
{
For i=n/2 to 1 step -1
Adjustify (a,i,n);
}
Algorithm Adjustify(a[],i,n)
{
Repeat
{
J=leftchild(i)
Compare left and right child of a[i] and store the index of grater number in j
Compare a[j] and a[i]
If (a[j]>a[i]) then
Copy a[j] to a[i] and move to next level
}until(j<n)
}

87
Advanced C Programming

Heap Sort

#include<stdio.h>
#include<conio.h>
int a[20],n;
main()
{
int i,j,temp;
clrscr();
printf("ente n");
scanf("%d",&n);
printf("enter the elements");
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
heapify(a,n);
for(j=1;j<=n;j++)
printf("%d",a[j]);
for(i=n;i>=2;i--)
{
temp=a[i];
a[i]=a[1];
a[1]=temp;
adjust(a,1,i-1);
printf("n");
for(j=1;j<=n;j++)
printf("%d ",a[j]);
}
printf("nelements after sort");
for(i=1;i<=n;i++)
printf("%d ",a[i]);
}
heapify(int a[],int n)
{
int i;
for( i=n/2;i>=1;i--)
adjust(a,i,n);
}

88
Advanced C Programming

adjust(int a[],int i,int n)
{
int j,iteam;
j=2*i;
iteam=a[i];
while(j<=n)
{
if(j<n && a[j]<a[j+1])
j=j+1;
if(iteam>=a[j])
break;
a[j/2]=a[j]; j=2*j;
}
a[j/2]=iteam;
}

89
Advanced C Programming

All Paris Shortest Path

#include<iostream.h>
#include<conio.h>
int min(int a,int b);
int cost[10][10],a[10][10],i,j,k,c;
void main()
{
int n,m;
cout <<"enter no of vertices";
cin >> n;
cout <<"enter no od edges";
cin >> m;
cout<<"enter thenEDGE Costn";
for(k=1;k<=m;k++)
{
cin>>i>>j>>c;
a[i][j]=cost[i][j]=c;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[i][j]== 0 && i !=j)
a[i][j]=31999;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
cout <<"Resultant adj matrixn";
for(i=1;i<=n;i++)
{
for( j=1;j<=n;j++)
{
if(a[i][j] !=31999)
cout << a[i][j] <<" ";
}
cout <<"n";
}

90
Advanced C Programming

getch();
}
int min(int a,int b)
{
if(a<b)
return a;
else
return b;
}
OUTPUT
enter no of vertices3
enter no od edges5
enter the
EDGE Cost
124
216
1 3 11
313
232
Resultant adj matrix
046
502
370

91
Advanced C Programming

Algorithms for Binary Search Tree
Algorithm Insert(item)
{
If(tree is empty) then root is empty
Otherwise
{
temp=search(item); // temp is the node where search for the
item halts
if( item > temp) then temp-right=item;
otherwise temp-left =item
}
}
Algorithm Search(x, root)
{
if(tree is empty ) then print” tree is empty”
otherwise
If(x grater than root) search(root-right);
Otherwise if(x less than root ) search(root-left)
Otherwise return true
}
}
Algorithm Delete(x)
{
Search for x in the tree
If (not found) print” not found”
Otherwise{
If ( x has no child) delete x;
If(x has left child) move the left child to x position
If(x has right child) move the right child to x position
If(x has both left and right children) replace ‘x’ with
greatest of left subtree of ‘x ‘ or smallest of right
subtree of ‘x’ and delete selected node in the subtree
}
}

92
Advanced C Programming

Binary Search Tree
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
class node
{
public:
class node *left;
class node *right;
int data;
};
class tree: public node
{
public:
int stk[50],top;
node *root;
tree()
{
root=NULL;
top=0;
}
void insert(int ch)
{
node *temp,*temp1;
if(root== NULL)
{
root=new node;
root->data=ch;
root->left=NULL;
root->right=NULL;
return;
}
temp1=new node;
temp1->data=ch;
temp1->right=temp1->left=NULL;
temp=search(root,ch);
if(temp->data>ch)
temp->left=temp1;
else
temp->right=temp1;

93
Advanced C Programming

}
node *search(node *temp,int ch)
{
if(root== NULL)
{
cout <<"no node present";
return NULL;
}
if(temp->left==NULL && temp->right== NULL)
return temp;
if(temp->data>ch)
{ if(temp->left==NULL) return temp;
search(temp->left,ch);}
else
{ if(temp->right==NULL) return temp;
search(temp->right,ch);
}

}

void display(node *temp)
{
if(temp==NULL)
return ;
display(temp->left);
cout<<temp->data << " ";
display(temp->right);
}
node * pop(node *p)
{
int ch;
ch=stk[top-1];
if(p->data==ch)
{
top--;
return p;
}
if(p->data>ch)
pop(p->left);
else
pop(p->right);
}
};
94
Advanced C Programming

void main()
{
tree t1;
int ch,n,i;
clrscr();
while(1)
{
cout <<"n1.INSERTn2.POPn3.DISPLAYn4.EXITnEnter your choice:";
cin >> ch;
switch(ch)
{
case 1: cout <<"enter no of elements to insert:";
cout<<"n enter the elements";
cin >> n;
for(i=1;i<=n;i++)
{ cin >> ch;
t1.insert(ch);
}
break;
case 2: t1.pop(); break;
case 3: t1.display(t1.root);break;
case 4: exit(1);
}
}
}

1.INSERT
2.POP 3.DISPLAY 4.EXIT
Enter your choice:1
enter no of elements to insert:
enter the elements7
5 24 36 11 44 2 21
1.INSERT
2.POP 3.DISPLAY 4.EXIT
Enter your choice:3
2 5 11 21 24 36 44
1.INSERT 2.POP 3.DISPLAY 4.EXIT
Enter your choice2
2 11 21 24 36 44
1.INSERT 2.POP 3.DISPLAY 4.EXIT
4.EXITEnter your choice:4

95
Advanced C Programming

Optimal Binary Search Tree
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#define MAX 10
int find(int i,int j);
void print(int,int);
int p[MAX],q[MAX],w[10][10],c[10][10],r[10][10],i,j,k,n,m;
char idnt[7][10];
void main()
{
clrscr();
cout << "enter the no, of identifiers";
cin >>n;
cout <<"enter identifiers";
for(i=1;i<=n;i++)
gets(idnt[i]);
cout <<"enter success propability for identifiers";
for(i=1;i<=n;i++)
cin >>p[i];
cout << "enter failure propability for identifiers";
for(i=0;i<=n;i++)
cin >> q[i];
for(i=0;i<=n;i++)
{
w[i][i]=q[i];
c[i][i]=r[i][i]=0;
w[i][i+1]=q[i]+q[i+1]+p[i+1];
r[i][i+1]=i+1;
c[i][i+1]=q[i]+q[i+1]+p[i+1];
}
w[n][n]=q[n];
r[n][n]=c[n][n]=0;
for(m=2;m<=n;m++)
{
for(i=0;i<=n-m;i++)
{
j=i+m;
w[i][j]=w[i][j-1]+p[j]+q[j];
k=find(i,j);
r[i][j]=k;
c[i][j]=w[i][j]+c[i][k-1]+c[k][j];
}

96
Advanced C Programming

}
cout <<"n";
print(0,n);
}
int find(int i,int j)
{
int min=2000,m,l;
for(m=i+1;m<=j;m++)
if(c[i][m-1]+c[m][j]<min)
{
min=c[i][m-1]+c[m][j];
l=m;
}
return l;
}
void print(int i,int j)
{
if(i<j)
puts(idnt[r[i][j]]);
else
return;
print(i,r[i][j]-1);
print(r[i][j],j);
}
OUTPUT
enter the no, of identifiers4
enter identifiersdo
if
int
while
enter success propability for identifiers3 3 1 1
enter failure propability for identifiers2 3 1 1 1
tree in preorder form
if
do
int
while

97
Advanced C Programming

Viva Voice Questions

1. What is the difference between an ARRAY and a LIST?
2. What is faster : access the element in an ARRAY or in a LIST?
3. Define a constructor - what it is and how it might be called (2 methods).
4. Describe PRIVATE, PROTECTED and PUBLIC - the differences and give examples.
5. What is a COPY CONSTRUCTOR and when is it called (this is a frequent question !)?
6. Explain term POLIMORPHISM and give an example using eg. SHAPE object: If I have
a base class SHAPE, how would I define DRAW methods for two objects CIRCLE and
SQUARE.
7. What is the word you will use when defining a function in base class to allow this
function to be a polimorphic function?
8. You have two pairs: new() and delete() and another pair : alloc() and free(). Explain
differences between eg. new() and malloc()
9. Difference between “C structure” and “C++ structure”.
10. Diffrence between a “assignment operator” and a “copy constructor”
11. What is the difference between “overloading” and “overridding”?
12. Explain the need for “Virtual Destructor”.
13. Can we have “Virtual Constructors”?
14. What are the different types of polymorphism?
15. What are Virtual Functions? How to implement virtual functions in “C”
16. What are the different types of Storage classes?
17. What is Namespace?

98
Advanced C Programming

18. Difference between “vector” and “array”?
19. How to write a program such that it will delete itself after exectution?
20. Can we generate a C++ source code from the binary file?
21. What are inline functions?
22. What is “strstream” ?
23. Explain “passing by value”, “passing by pointer” and “passing by reference”
24. Have you heard of “mutable” keyword?
25. Is there something that I can do in C and not in C++?
26. What is the difference between “calloc” and “malloc”?
27. What will happen if I allocate memory using “new” and free it using “free” or allocate
sing “calloc” and free it using “delete”?
28. When shall I use Multiple Inheritance?
29. How to write Multithreaded applications using C++?
30. Write any small program that will compile in “C” but not in “C++”
31. What is Memory Alignment?
32. what is the difference between a tree and a graph?
33. How to insert an element in a binary search tree?
34. How to delete an element from a binary search tree?
35. How to search an element in a binary search tree?
36. what is the disadvantage in binary search tree?
37. what is ment by height balanced tree?
38. Give examples for height blanced tree?
39. What is a 2-3 tree?

99
Advanced C Programming

40. what is a dictonary?
41.What is a binary search tree?
42. what is an AVL tree?
43. how height balancing is performed in AVL tree?
44. what is a Red Black tree?
45. what is difference between linked list and an array?
46. how dynamic memory allocation is performed in c++?
47. what are tree traversing techniques?
48. what are graph traversing techniques?
49. what is the technique in quick sort.?
50 what is the technique in merge sort?
51. what is data structure.
52. how to implement two stacks in an array?
53. what is ment by generic programming?
54. write the syntax for function templet?
55. write the syntax for class templet?
56. what is ment by stream?
57. what is the base class for all the streams?
58. how to create a file in c++?
59. how do you read a file in c++?
60. how do you write a file in c++?

Finite- State Machines
Derived from the on-line notes by Dr. Matt Stallmann & Suzanne Balik.

100
Advanced C Programming

A finite-state machine (FSM) is an abstract model of a system (physical, biological, mechanical,
electronic, or software).

An FSM consists of
•
•
•
•
•

States: a finite number of states that represent the internal "memory" of the system.
Inputs to the system (e.g., a user doing something, a character read from the input)
Transitions, which represent the "response" of the system to its environment.
Transitions depend upon the current state of the machine as well as the current input and
often result in a change of state.
An initial state, which is the state the system is in before it accepts any input.
Final states, states that represent a legal end to a transaction.

Simple example: A soda- pop machine
Consider an FSM that models a soda-pop machine that dispenses soda-pop for 30 cents.
The possible inputs to the machine are n - nickel, d - dime,
q - quarter, s - select soda.
The states of the machine are designated by circles.
Each state is labeled with the amount of money that has been deposited so far.
State 00 is the initial or start state. This is indicated by the incoming arrow.
States which represent a total input of 30 or more cents are considered final states and are
designated by double circles. The transitions from state to state are shown as arcs (lines with
arrows). Each transition is labeled with the input that caused it.

Let’s take an example. Suppose the user inserts a sequence of coins … q takes the machine to
state 25; another q takes it to state 50. It dispenses soda pop & change and transitions back to
state 00.
At this point, the user could select a drink.
The machine would also have to give change.

101
Advanced C Programming

An FSM for an ATM
A finite-state machine can also be used to model a simple automated teller machine (ATM).
In this case, each transition is labeled with an input—
• from the user (such as insert card), or
• from a central database (such as PIN OK versus bad PIN).
Each of the transitions may, in actuality, involve a number of complex steps which are not shown
on the diagram.

102
Advanced C Programming

Recognizing input streams
FSMs can also be used to precisely define programming-language syntax.
Another application of finite-state machines is as a notation for the precise description of a
programming language syntax.
Consider this description of real constants in Pascal:
A real number in PASCAL is written as a string of digits containing a decimal point.
There must be at least one digit before and after the decimal point.
103
Advanced C Programming

Real data may also be represented using PASCAL scientific notation.
A real data item written in scientific notation consists of a sign followed by a real number,
followed by the letter E, another sign and an integer (+ signs may be omitted).
The English description is imprecise. Are the strings .9 and 9. valid, or do you have to say 0.9
and 9.0, respectively?
This FSM answers the question: A valid real constant in Pascal is any string that leads the FSM
from the start state to a final (double-circled) state.

What happens when we feed the FSM .9? Starts out in State 0. There’s no transition for a dot,
so that’s an illegal input.
What happens when we feed it 9.? Starts out in State 0, and then goes to State 2 and then to
State 3. But that’s an error, because State 3 is not an accepting state.
What about the string 9.0? Starts out in State 0, and then goes to State 2 and then to State 3, and
then Step 4. This is an accepting state, so 9.0 is a legal real constant.
(Note that .9 and 9. are valid floating-point constants in Java.)

Text Processing with FSMs
Finite-state machines are often used in text processing.
The grep utility takes a string or regular expression and converts it to an FSM before doing a
search.
Simplifed example: Suppose a file consists of as and bs only and the search is for the string
"abba". Here’s an FSM for doing this search:

If, for example, this FSM were used to locate the string "abba" in a file containing
"aababbbabba...", it would move through these states:

Input:

104

a

a

b

a

b

b

b

a

b

b

a
Advanced C Programming

State: 0

1

1

2

1

2

3

0

1

2

3

4

The states listed above are the states of the machine after the corresponding input. When the
final state 4 is reached, the search is successful.
We say that the machine has recognized the string.
Exercise: Design an FSM that recognizes a string consisting of alternating as and bs, beginning
with an a. If the input consists of anything else (e.g., abababaab, the FSM should continue to
read it but not recognize it.
Here is how an FSM can be developed and translated directly into a program.
Consider the following specifications:
• A word is a maximal sequence of zero or more upper- and zero or more lower-case
letters.
Under this definition, what about the sequence "Go State!"?
Is "State!" a word? No; it contains a punctuation mark.
Is "tat" a word? No, because it is not maximal.
How about "irregardless" Yes, because it’s a sequence of (0 or more) upper &
lower-case letters.
• wc is the word count, initially 0
• lc is the line count, initially 0
• cc is the character count, initially 0
Here’s an FSM to recognize "words." Note that each transition is labeled with an action as well
as an input.
In state 0, the FSM remembers that we're not currently in the middle of a word, while state 1
remembers that we are.

Question: Why are there no final states in this FSM?
It’s not trying to recognize anything; it’s just counting characters.
An FSM’s behavior can also be specified by a table.
Each row corresponds to a state
Each column corresponds to an input symbol (or category of input symbols).
The table version for the word counting FSM is given below.

105
Advanced C Programming

State
0
1

A–Z a–z
1: ++wc ++cc
1: ++cc

n
0: ++lc, ++cc
0: ++lc, ++cc

other
0: ++cc
0: ++cc

A standard idiom for translating an FSM into a program is the while-switch idiom.
• A while loop gets one character at a time from the input stream.
• Inside the loop is a switch statement that causes different code to be executed based on the
current state.
Here is the code.
import java.io.*;
public class WordCounter{
public static void main(String[] args) {
if (args.length == 1) {
try {
BufferedReader br = new BufferedReader(
new FileReader(args[0]));
int wc = 0, lc = 0, cc = 0;
char ch;
int state = 0;
int next;
while ((next = br.read()) != −1) {
ch = (char) next;
switch (state) {
case 0: if ( ch == ’n’ ) {
++lc;
++cc;
}
else if ( Character.isLetter(ch) ) {
state = 1;
++wc;
++cc;
}
else
++cc;
break;
case 1: if ( ch == ’n’ ) {
state = 0;
++lc;
++cc;
}
else if ( Character.isLetter(ch) )
++cc;
else {
state = 0;
++cc;
106
Advanced C Programming

}
break;
default: System.out.println("Invalid state: "
+ state);
}
}
System.out.println( lc + "t" + wc + "t"+ cc);
}
catch(IOException e) {
System.out.println("File error: " + e);
System.out.println(
"usage: java WordCounter filename");
}
}
else
System.out.println("usage: java WordCounter filename");
}
}
Within each case, the program makes a decision based on the current input character.

Simplifying the program
The program can be simplifed by noting that—
• ++cc is done on every transition,
• whenever the current input is n we do ++lc and go to (or stay in) state 0, and
• otherwise, the state and counters change only when
a letter is encountered in state 0 or
a character other than a letter (or a newline) is encountered in state 1.
The simplified program looks like:
import java.io.*;
public class WordCounter{
public static void main(String[] args) {
if (args.length == 1) {
try {
BufferedReader br = new BufferedReader(
new FileReader(args[0]));
int wc = 0, lc = 0, cc = 0;
char ch;
int state = 0;
int next;
while ((next = br.read()) != −1) {
ch = (char) next;
++cc;
if (ch == ‘n’) {
++lc;

107
Advanced C Programming

state = 0;
}
else if (state == 0 &&
Character.isLetter(ch)) {
++wc;
state = 1;
}
else if (state == 1 &&
!Character.isLetter(ch)) {
state = 0;
}
}
System.out.println( lc + "t" + wc + "t"+ cc);
}
catch(IOException e) {
System.out.println("File error: " + e);
System.out.println(
"usage: java WordCounter filename");
}
}
else
System.out.println("usage: java WordCounter filename");
}
}
So FSMs can sometimes be "optimized" considerably.
But, to avoid bugs, it is best to start with the straightforward implementation!

Summary
1. Finite-state machines can be used to model the interaction between a system and its
environment.
2. The state of an FSM remembers what has occurred so far.
In addition to the FSM state, there may be variables that remember other details.
The designer has to use judgment to decide what to model with an FSM state and what to
leave as a variable.
3. A transition occurs when an event in the environment causes the system to change state
(either the FSM state or variables).
4. A FSM can be depicted either by a bubble diagram or a transition table.
5. In text stream applications each transition corresponds to a single input character.
6. The while-switch idiom gives a method for mechanically translating a FSM to a program.
Simplifications can be made by taking advantage of special features of the particular
FSM.

108
Advanced C Programming

Real Time Kernel

This is a project to implement a real-time kernel for the ARM processor.
The main features of this kernel will be:
1)
2)
3)
4)
5)

Priority based preemptive scheduling
Dynamic creation and deletion of tasks.
Provision for all types of synchronization mechanisms.
Mechanism for large number of timers.
A simple best user API.

Prerequisites:
The following skills are essential for implementing this project.:

Operating System Concepts
A students must have a thorough understanding of Operating Systems concepts. In
case the students don’t have this knowledge, a one week course on OS fundamentals
must be conducted by the guide which must cover the following topics:
1)
2)
3)
4)
5)
6)

Scheduling
Synchronization
Mutual Exclusion
I/O Management
Process Management
Memory Management

The discussion must be slanted towards Real-time systems. And implementation points
must be discussed.
The following text books must used :
Operating System Concepts : Silbersatcz and Galvin
Operating System : Design and Implementation : Tannenbaumm and Wood hull

C Programming in the Linux Environment
The students must have a very good knowledge of C programming language as it is the
language for the project implementation. Further , the students must have moderate
familiarity with the Linux application development process. The usage of GCC,MAKE
and VI editor must be known by the students.

Compilation , Linking , Loading and Object Files Formats
109
Advanced C Programming

A familiarity with object file formats and compilation process is essential.
If the students don’t have any knowledge in this field , then a 1 day session ca be
taken by the guide.
DESIGN OF THE KERNEL

The following are the steps for running a kernel(The detailed steps are
given in the project schedule)
1) BOOTING
2) SYSTEM INITIALISATION

The steps are considered one by one :
BOOTING
Operating Systems are unlike other programs. It has to be put into memory by
a separate program called boot-loader. It is because the kernel is the first
program to run in the system.
There should be an understanding between the boot loader and operating
system. The is given in a standard called multi boot. In Linux GRUB is the
boot loader program which implements the multi boot standard. We have to
understand this standard if we have to boot out own kernel.
The complete documentation of multi boot and GRUB is
1) Available on the Internet.
2) Available as online documentation on the Linux system[info grub].
SYSTEM INITIALIZATION
After booting the system has to be initialized. First the memory has to be
initialized. Next the interrupts have to be setup. Finally if there is
hardware to be initialized it is done.
In particular the Intel 80386 must be initialized as follows : (for the flat
memory mode).
1)
2)
3)
4)
5)

Disable all interrupts
Setup GDT – kernel ‘s code, data, stack and other segments.
Setup IDT – manage all exceptions and interrupts.
Load GDT register and IDT register.
Initialize Hardware – setup timer hardware to generate periodic
interrupts.
6) Enable Interrupts.
DATA STRUCTURES AND ALGORITHMS

110
Advanced C Programming

The objective of this section is to give a high level view of the realtime kernel. All algorithms to implement the kernel are not described.
Some of the core algorithms are described.
Usually in system’s software we have to design our data-structures first.
The algorithms will naturally follow next(and will depend on the choice of
the data structures)
As an example if we choose a matrix data structure our scheduling
algorithm will be different than if we choose a multilevel ready queue
based data structure.
Concepts :
An RTOS is a basic component of realtime embedded systems.It must provide
mechanisms for
1) Multitasking – the ability to run more than one task at once.
2) Scheduling

- the ability to make sure that timing criteria is met.

3) Synchronization – the ability to co-ordinate the activities of diverse
tasks.
4) Memory management – to efficiently allocate memory for tasks and
the kernel itself.
5) Interrupt and Timer Management : - handle interrupts and timers
efficiently.
Block Diagram of a Real-time kernel

USER TASKS

MEMORY
MANAGEMENT

I/O SYSTEM

INTER – TASK
COMMUNICATION
MECHANISMS
SCHEDULER + TASK
MANAGEMENT

HARDWARE

Functional Description of an RTOS
Tasks

111

:
Advanced C Programming

A task is basic unit of execution. A task is represented by an execution
sequence and shares all resources with other tasks.The only resource that
distinguishes one task from another is the stack used to store all the local
variables.The system must know all information about the task to schedule
it.This crucial information is stored in a structure called TCB.The TCB
stores information about its stack in the SCB (stack control block). The SCB
stores information about a stack – its base pointer, the size and other
information.
The TCB stores various information related to a task like id,priority.
A task also needs to know the entry point – the function with the task has to
begin executing.
These things are a minimum.There can be a lot more fields depending upon the
complexity of the RTOS.

Scheduler :
A scheduler is the heart of the operating system.Its main job is to make
tasks run.That is it selects a task and dispatches it.Since there is usually
one CPU , we need to do context switching between the tasks.
Context switching – that is saving the context of one task and restoring
anothers‘ s the basic activity – and this involves pushing and popping CPU
registers. This is very much processor dependent and is usually coded in
assembly.
Furthermore the scheduler must know at any instant of time all the tasks
which are ready.Further more its has to know the highest priority task which
is ready.For this it makes use of a multilevel queue – each queue holds tasks
of particular priority.The scheduler chooses the task from the queue of the
highest priority and schedules it.When the time period expires the task is
preempted and the scheduler chooses the next ready task in the queue.
Tasks can also wait for resources(eg : char from keyboard).During this time
the scheduler schedules another task which is ready.The task will become
ready when an interrupt occurs.
Thus interrupts cause tasks to become ready.So the scheduler has to know is a
higher priority task has become ready.If so it has to schedule it.Thus a
mechanism is nessary for this.
Also interrupts can be nested.So the scheduler must run only when all
interrupt have been handled.

SYNCHRONIZATION
Classical synchronization mechanisms like semaphores,mutexes,message queue
must be implemented. All these mechanisms make use of a central mechanism
called a wait queue. A wait queue is a queue on which tasks wait for some
event to happen. A wait queue can be used to implement any synchronization
mechanism. Thus a semaphore can implemented by a integer and a wait queue.

112
Advanced C Programming

All tasks on the queue are waiting for the semaphore resource. Like wise we
can implement a message queue with a reader wait queue and a writer wait
queue. Synchronization is related with scheduling.
And wait queues can be implemented as fifo ordered or priority ordered. This
is important for real time kernels.
A sample implementation of wait queues is provided by the Linux kernel.
Data structures and API for synchronization mechanisms are given below.
struct MsgQueue { // message queue data structure
struct PQueue recvWait;
struct PQueue sendWait;
}
struct MsgBuf { // message buffer
};
void
MsgSend(struct MsgQueue *pMsgQ,struct MsgBuf *pMsg);
struct MsgBuf *MsgRecv(struct MsgQueue *pMsgQ);
unsigned int MsgCount(struct MsgQueue *pMsgQ);
struct Sem { // counting semaphore
int value;
struct PQueue semWait;
};
struct Sem *SemCreate(void);
void SemDelete(struct Sem *sem);
int AcquireSem(struct Sem *sem);
void ReleaseSem(struct Sem *sem);
int SemValue(struct Sem *sem);
struct BSem { // binary semaphore
int state;
struct PQueue bsemWait;
};
struct BSem * BSemCreate(void);
void BSemDelete(struct Sem *sem);
int AcquireBSem(struct BSem *bsem);
void ReleaseBSem(struct BSem *bsem);
void BSemState(struct BSem *bsem);
struct Mutex { // mutex semaphore
int state;
struct Process *owner;
unsigned int ldepth;
struct PQueue mutexWait;

113
Advanced C Programming

};
struct Mutex* MutexCreate(void);
void MutexDelete(struct Mutex *mutex);
int AcquireMutex(struct Mutex *mutex);
void ReleaseMutex(struct Mutex *mutex);

struct Event {
int occured;
struct PQueue evWait;
};
int WaitEvent(struct Event *event);
int SignalEvent(struct Event *event);
int ResetEvent(struct Event *event);

Interrupt Handling API for the RTOS
Interrupts
Interrupts are the way external devices notify the application of an event.
Interrupt service routines are the running entities executed to process an
interrupt. Interrupt generation is very CPU dependent, but falls into two
general categories.
Several interrupt levels are usually offered by the CPU, each one generating
a separate exception vector, handled by a separate interrupt handler.
Interrupts may share interrupt levels or vectors, therefore the code in the
interrupt service routine (ISR) must make sure
it’s own device generated the interrupt before attempting to process it.
Some CPU architectures offer only one interrupt vector for all interrupt
sources. In such a case, the hardware designer usually puts an interrupt
controller chip between the devices and the CPU. It is up to the kernel
implementor to write the general interrupt handler in such a way that it
prioritizes the interrupts and dispatches the appropriate ISR.
Only a minimal amount of work to process the interrupt should be performed
inside the ISR. A task should then be signaled, which in turn performs
lengthy computations to complete the I/O operation.
The only mutual exclusion mechanism available between ISRs are the interrupt
disabling primitives The implementation of these functions are highly CPU
dependent. One some, interrupts are categorized among levels. On other’s,
individual interrupt sources can/must be specified.
Yet on others, it is only possible to disable all interrupts at once. In as
much as possible, tasks and ISRs should only disable their own interrupts for
mutual exclusion. All ISRs run at a higher priority than tasks. ISRs of the
same priority are not time-sliced in a round-robin fashion. They run to
completion unless interrupted by a higher priority
interrupt. An ISR is restarted every time it is probable that it’s interrupt
source generated the interrupt.

114
Advanced C Programming

void IntAttach(int intNo,void (*intHandler)(int intNo,void devID,struct Regs
*regs));
int IntDetach(int intNo)(void);
int IntEnable(int intNo);
void IntDisable(int mask);
void IntSetMask(int mask);
int IntGetMask(void);
MEMORY MANAGEMENT
An RTOS does not use virtual memory for management of main memory. But tasks,
stacks and other objects need memory. And so do user tasks to perform I/O.
Thus a memory management scheme is needed to allocate and deallocate memory
of fixed size and variable size. Various algorithms like first-fit , next-fit
can be considered. But again we need to look into the real-time aspects of
the algorithm – speed and determinacy.
An extensive discussion of Kernel Memory Allocation is in [Vahalia].
One method of fast memory allocation is called caching : keep a queue of
blocks of the same size. Allocate from the head of the queue. Deallocated
blocks as added to the end of the queue.
For fixed size objects use this scheme : this allows use memory from other
caches. For other things use a first-fit allocator. We can switch to other
advanced memory allocation techniques.
In a RTOS we generally do not use virtual memory. Most memory is preallocated before the application starts and such preallocated blocks are
called pools. The algorithm used to allocate memory from these pools may be
first-fit or best-fit. Sometimes we may use cached buffers.

F

F

F
A

F

AAlklo
Allocated

115

Free
Advanced C Programming

A easy way of memory allocation and deallocation is to use caches. The
caches get their memory from a global memory area.
The data structures and API is given below.

struct ObjHeader {
void *next;
char objp[1];
};
struct MemPool {
unsigned int objsize;
int maxobjs;
int objcount;
struct ObjHeader *headObj;

};

void *MemAlloc(struct MemPool *mpool,int priority);
void MemFree(struct MemPool *mpool,void *objp);

TASK IMPLEMENTATION
A task is represented within the kernel by a struct Task. It contains all
the information necessary to define a task. In other systems it is called as
a TCB(Task control block).
As an example consider :
struct Task {
struct Task *next; // see below
volatile int state; // see below
int priority; // 0 – 31
int taskId;
void *stack_base;
void *stack_top;
void *stackp;
int (*task_entry)(void *arg);
void *task_arg;
};
In a real implementation it would contain more fields.
A Task can be in any one of the following states :
#define
#define
#define
#define

READY
RUNNING
WAITING
FINISHED

0
1
2
4

There is support for 32 priority levels : #define NPRIOS 32

116
Advanced C Programming

The state transition diagram from any OS – text book can
reference.

be used as a

All struct Tasks are stored in Hash-table which permits rapid searching of
tasks given their task id.
The following data structures are used for the hash-table :
struct

Task *task_table[]; // hash – table

An arrangement would look like the following :
task_table[]
struct Task
+--------+
+------+
+------+
|
|----->|
|----->|
|----|
|
|
|
|
|
|
+--------+
+------+
+------+
|
|
|
|
+--------+
|
|
| .
|
| .
|
| .
|
+--------+
|
|------>+------+-----|
|
|
|
|
|
+--------+
|
|
+------+
A perfect size can be determined for the task table, so that given a taskid
we can quickly lookup for the strict Task.
A task would look like the following :

struct Task
+----------------+
|
|
+------>+------+ stack_base
|
|
|
|
|
|
|
|
|
|
|
|---------+
|
| <-- stack area
|
|---------+
|
|
|
|
|
|
|
|
|
+------>+------+ stack_top
|
|
|
|
|
|
+----------------+

117
Advanced C Programming

Scheduler Implementation

We need to support priority based preemptive scheduling. This means that it
is guaranteed that the highest priority READY task will be running at anytime.
The run queue is the main data structure used by the scheduler.
It is an array of ready queues indexed by task priority – one for each
priority.
Pictorially :
RunQueue
+-------+
|
|---->+------+--->+-------+---|
|
|
| Proc |
| Proc |
|
+-------+
+------+
+-------+
|
|
|
|
+-------+
|
|
|
|
+-------+
|
|
|
|
|
|
|
|
+-------+
|
|
|
|
+-------+
The first queue will consist of all the tasks whose priority is equal to
zero. The next slot will point to a queue which has tasks of priority 1 and
so on. Only ready tasks will be on the queues. The queues will be circular
which makes insertion and deletion fast.
The scheduler always selects the task on the first queue that is non empty
and dispatches it. This ensures that the highest priority task will run first
always.
After interrupts are handled , a higher priority task may have become ready.
So the scheduler has to run so that the higher priority tasks will run.
There should be some way to know immediately which of the ready queue is nonempty. This is an implementation detail.
Sample Data structures and Algorithms
A queuing facility fundamental to an RTOS.

118
Advanced C Programming

Processes are queued and dequeued constantly to and from the run queues and
wait queues.
A simple circular fifo queue is the best data structure for these operations.
struct PQElem {
struct PQElem *next;
struct Process *process;
};
struct PQueue {
Lock queueLock;
int count;
struct PQElem *lastElem;
};
void
void
struct
int

InitQueue(struct PQueue *queue);
AddQueue (struct PQueue *queue,struct Process *process);
Process *DelQueue(struct PQueue *queue);
GetCount (struct PQueue *queue);

#define NPRIOS 32 // number of priority levels we are supporting.
struct PQueue RunQueue[NPRIOS]; // the ready queue is an array of

Timer Implementation
Timers are mechanisms which are like stop-watches. It allows a task to wait
until a certain time period , call a function after a time period a implement
a timeout period. There are many ways of implementing timers. They are
discussed in [Varg].A simplified version will be given.
The fundamental requirement is that we need a hardware clock which interrupts
at regular intervals. This can be done on the PC using the 8254 timer. For
more details see [Messmer]
volatile unsigned long jiffies; // incremented on every timer interrupt
struct Timer {
struct Timer *next;
struct Timer *prev;
int state;
unsigned long expires;
void (*timeout)(void *data);
void *data;
};
#define NTIMERS
unsigned long tcount;
struct Timer *timers[NTIMERS];

I/O Implementation
We are not providing a extensive mechanism for I/O like device drivers and
file system. Unix-like operating systems provide I/O interface through the

119
Advanced C Programming

file –system. Since we are not providing a file-system we cannot use this
interface. Another mechanism is needed.
The following I/O devices will be supported :
1) console and keyboard
2) serial I/O
3) timer and interrupt management.
Console in the IBM-PC is a memory mapped device. To do output we need to
write to the video memory which is mapped at 0x8000.The details are in
[Messmer].
The keyboard is a interrupt driven device. We need to convert the scan code
and break code to a ASCII value (a simple scheme) , so that we can input
ASCII data.
A simple terminal driver which processes (edits) character sequences can
implemented on top of these drivers to provide standard input, output and
error streams for Tasks. A shell can be implemented to test these drivers.

120

More Related Content

What's hot

Abstract data types (adt) intro to data structure part 2
Abstract data types (adt)   intro to data structure part 2Abstract data types (adt)   intro to data structure part 2
Abstract data types (adt) intro to data structure part 2Self-Employed
 
Java Tutorial Lab 7
Java Tutorial Lab 7Java Tutorial Lab 7
Java Tutorial Lab 7Berk Soysal
 
Java Tutorial Lab 2
Java Tutorial Lab 2Java Tutorial Lab 2
Java Tutorial Lab 2Berk Soysal
 
Workshop presentation hands on r programming
Workshop presentation hands on r programmingWorkshop presentation hands on r programming
Workshop presentation hands on r programmingNimrita Koul
 
Introductiont To Aray,Tree,Stack, Queue
Introductiont To Aray,Tree,Stack, QueueIntroductiont To Aray,Tree,Stack, Queue
Introductiont To Aray,Tree,Stack, QueueGhaffar Khan
 
Functional OOP, Clojure style
Functional OOP, Clojure styleFunctional OOP, Clojure style
Functional OOP, Clojure styleyoavrubin
 
Datastructures and algorithms prepared by M.V.Brehmanada Reddy
Datastructures and algorithms prepared by M.V.Brehmanada ReddyDatastructures and algorithms prepared by M.V.Brehmanada Reddy
Datastructures and algorithms prepared by M.V.Brehmanada ReddyMalikireddy Bramhananda Reddy
 
R programming Fundamentals
R programming  FundamentalsR programming  Fundamentals
R programming FundamentalsRagia Ibrahim
 
L5. Data Transformation and Feature Engineering
L5. Data Transformation and Feature EngineeringL5. Data Transformation and Feature Engineering
L5. Data Transformation and Feature EngineeringMachine Learning Valencia
 
358 33 powerpoint-slides_4-introduction-data-structures_chapter-4
358 33 powerpoint-slides_4-introduction-data-structures_chapter-4358 33 powerpoint-slides_4-introduction-data-structures_chapter-4
358 33 powerpoint-slides_4-introduction-data-structures_chapter-4sumitbardhan
 

What's hot (20)

Data structure Unit-I Part A
Data structure Unit-I Part AData structure Unit-I Part A
Data structure Unit-I Part A
 
Abstract data types (adt) intro to data structure part 2
Abstract data types (adt)   intro to data structure part 2Abstract data types (adt)   intro to data structure part 2
Abstract data types (adt) intro to data structure part 2
 
Java Tutorial Lab 7
Java Tutorial Lab 7Java Tutorial Lab 7
Java Tutorial Lab 7
 
Java Tutorial Lab 2
Java Tutorial Lab 2Java Tutorial Lab 2
Java Tutorial Lab 2
 
Workshop presentation hands on r programming
Workshop presentation hands on r programmingWorkshop presentation hands on r programming
Workshop presentation hands on r programming
 
M v bramhananda reddy dsa complete notes
M v bramhananda reddy dsa complete notesM v bramhananda reddy dsa complete notes
M v bramhananda reddy dsa complete notes
 
Introductiont To Aray,Tree,Stack, Queue
Introductiont To Aray,Tree,Stack, QueueIntroductiont To Aray,Tree,Stack, Queue
Introductiont To Aray,Tree,Stack, Queue
 
BDACA - Lecture3
BDACA - Lecture3BDACA - Lecture3
BDACA - Lecture3
 
Data structure
Data structureData structure
Data structure
 
Functional OOP, Clojure style
Functional OOP, Clojure styleFunctional OOP, Clojure style
Functional OOP, Clojure style
 
Datastructures and algorithms prepared by M.V.Brehmanada Reddy
Datastructures and algorithms prepared by M.V.Brehmanada ReddyDatastructures and algorithms prepared by M.V.Brehmanada Reddy
Datastructures and algorithms prepared by M.V.Brehmanada Reddy
 
BDACA1617s2 - Lecture4
BDACA1617s2 - Lecture4BDACA1617s2 - Lecture4
BDACA1617s2 - Lecture4
 
R programming Fundamentals
R programming  FundamentalsR programming  Fundamentals
R programming Fundamentals
 
From DOT to Dotty
From DOT to DottyFrom DOT to Dotty
From DOT to Dotty
 
L5. Data Transformation and Feature Engineering
L5. Data Transformation and Feature EngineeringL5. Data Transformation and Feature Engineering
L5. Data Transformation and Feature Engineering
 
Storage struct
Storage structStorage struct
Storage struct
 
Theano tutorial
Theano tutorialTheano tutorial
Theano tutorial
 
Generics In and Out
Generics In and OutGenerics In and Out
Generics In and Out
 
Types Of Data Structure
Types Of Data StructureTypes Of Data Structure
Types Of Data Structure
 
358 33 powerpoint-slides_4-introduction-data-structures_chapter-4
358 33 powerpoint-slides_4-introduction-data-structures_chapter-4358 33 powerpoint-slides_4-introduction-data-structures_chapter-4
358 33 powerpoint-slides_4-introduction-data-structures_chapter-4
 

Viewers also liked

Data Structures - Lecture 7 [Linked List]
Data Structures - Lecture 7 [Linked List]Data Structures - Lecture 7 [Linked List]
Data Structures - Lecture 7 [Linked List]Muhammad Hammad Waseem
 
whitepaper_mpeg-if_understanding_mpeg4
whitepaper_mpeg-if_understanding_mpeg4whitepaper_mpeg-if_understanding_mpeg4
whitepaper_mpeg-if_understanding_mpeg4aniruddh Tyagi
 
Discrete cosine transform
Discrete cosine transformDiscrete cosine transform
Discrete cosine transformaniruddh Tyagi
 
A project on advanced C language
A project on advanced C languageA project on advanced C language
A project on advanced C languagesvrohith 9
 
DIC_video_coding_standards_07
DIC_video_coding_standards_07DIC_video_coding_standards_07
DIC_video_coding_standards_07aniruddh Tyagi
 
ADVANCED DVB-C,DVB-S STB DEMOD
ADVANCED DVB-C,DVB-S STB DEMODADVANCED DVB-C,DVB-S STB DEMOD
ADVANCED DVB-C,DVB-S STB DEMODaniruddh Tyagi
 
30 top my sql interview questions and answers
30 top my sql interview questions and answers30 top my sql interview questions and answers
30 top my sql interview questions and answersskills9tanish
 
Teknologi Pita Lebar 4G LTE
Teknologi Pita Lebar 4G LTETeknologi Pita Lebar 4G LTE
Teknologi Pita Lebar 4G LTEHazim Ahmadi
 
IoT 개발자를 위한 Embedded C에서 Test Coverage를 추출해보자
IoT 개발자를 위한 Embedded C에서 Test Coverage를 추출해보자IoT 개발자를 위한 Embedded C에서 Test Coverage를 추출해보자
IoT 개발자를 위한 Embedded C에서 Test Coverage를 추출해보자Taeyeop Kim
 
Embedded SW Interview Questions
Embedded SW Interview Questions Embedded SW Interview Questions
Embedded SW Interview Questions PiTechnologies
 

Viewers also liked (20)

Data Structures - Lecture 7 [Linked List]
Data Structures - Lecture 7 [Linked List]Data Structures - Lecture 7 [Linked List]
Data Structures - Lecture 7 [Linked List]
 
whitepaper_mpeg-if_understanding_mpeg4
whitepaper_mpeg-if_understanding_mpeg4whitepaper_mpeg-if_understanding_mpeg4
whitepaper_mpeg-if_understanding_mpeg4
 
Discrete cosine transform
Discrete cosine transformDiscrete cosine transform
Discrete cosine transform
 
Advformat_0609
Advformat_0609Advformat_0609
Advformat_0609
 
DVB_Arch
DVB_ArchDVB_Arch
DVB_Arch
 
A project on advanced C language
A project on advanced C languageA project on advanced C language
A project on advanced C language
 
DIC_video_coding_standards_07
DIC_video_coding_standards_07DIC_video_coding_standards_07
DIC_video_coding_standards_07
 
rsa-1
rsa-1rsa-1
rsa-1
 
ADVANCED DVB-C,DVB-S STB DEMOD
ADVANCED DVB-C,DVB-S STB DEMODADVANCED DVB-C,DVB-S STB DEMOD
ADVANCED DVB-C,DVB-S STB DEMOD
 
30 top my sql interview questions and answers
30 top my sql interview questions and answers30 top my sql interview questions and answers
30 top my sql interview questions and answers
 
Teknologi Pita Lebar 4G LTE
Teknologi Pita Lebar 4G LTETeknologi Pita Lebar 4G LTE
Teknologi Pita Lebar 4G LTE
 
IoT 개발자를 위한 Embedded C에서 Test Coverage를 추출해보자
IoT 개발자를 위한 Embedded C에서 Test Coverage를 추출해보자IoT 개발자를 위한 Embedded C에서 Test Coverage를 추출해보자
IoT 개발자를 위한 Embedded C에서 Test Coverage를 추출해보자
 
C Programming - Refresher - Part IV
C Programming - Refresher - Part IVC Programming - Refresher - Part IV
C Programming - Refresher - Part IV
 
Embedded SW Interview Questions
Embedded SW Interview Questions Embedded SW Interview Questions
Embedded SW Interview Questions
 
Embedded _c_
Embedded  _c_Embedded  _c_
Embedded _c_
 
Linux Programming
Linux ProgrammingLinux Programming
Linux Programming
 
C Programming - Refresher - Part II
C Programming - Refresher - Part II C Programming - Refresher - Part II
C Programming - Refresher - Part II
 
Linux programming - Getting self started
Linux programming - Getting self started Linux programming - Getting self started
Linux programming - Getting self started
 
Linux Internals - Part III
Linux Internals - Part IIILinux Internals - Part III
Linux Internals - Part III
 
Linux Internals - Interview essentials 4.0
Linux Internals - Interview essentials 4.0Linux Internals - Interview essentials 4.0
Linux Internals - Interview essentials 4.0
 

Similar to Advanced c c++

Hub102 - Lesson4 - Data Structure
Hub102 - Lesson4 - Data StructureHub102 - Lesson4 - Data Structure
Hub102 - Lesson4 - Data StructureTiểu Hổ
 
1.1 introduction to Data Structures.ppt
1.1 introduction to Data Structures.ppt1.1 introduction to Data Structures.ppt
1.1 introduction to Data Structures.pptAshok280385
 
ds 1 Introduction to Data Structures.ppt
ds 1 Introduction to Data Structures.pptds 1 Introduction to Data Structures.ppt
ds 1 Introduction to Data Structures.pptAlliVinay1
 
Data Structures by Yaman Singhania
Data Structures by Yaman SinghaniaData Structures by Yaman Singhania
Data Structures by Yaman SinghaniaYaman Singhania
 
Data Structure # vpmp polytechnic
Data Structure # vpmp polytechnicData Structure # vpmp polytechnic
Data Structure # vpmp polytechniclavparmar007
 
Data structures and algorithms
Data structures and algorithmsData structures and algorithms
Data structures and algorithmsJulie Iskander
 
Fundamentalsofdatastructures 110501104205-phpapp02
Fundamentalsofdatastructures 110501104205-phpapp02Fundamentalsofdatastructures 110501104205-phpapp02
Fundamentalsofdatastructures 110501104205-phpapp02Getachew Ganfur
 
Social network analysis
Social network analysisSocial network analysis
Social network analysisCaleb Jones
 
II B.Sc IT DATA STRUCTURES.pptx
II B.Sc IT DATA STRUCTURES.pptxII B.Sc IT DATA STRUCTURES.pptx
II B.Sc IT DATA STRUCTURES.pptxsabithabanu83
 
Lecture 2 Data Structure Introduction
Lecture 2 Data Structure IntroductionLecture 2 Data Structure Introduction
Lecture 2 Data Structure IntroductionAbirami A
 

Similar to Advanced c c++ (20)

lecture 02.2.ppt
lecture 02.2.pptlecture 02.2.ppt
lecture 02.2.ppt
 
stack.pptx
stack.pptxstack.pptx
stack.pptx
 
Hub102 - Lesson4 - Data Structure
Hub102 - Lesson4 - Data StructureHub102 - Lesson4 - Data Structure
Hub102 - Lesson4 - Data Structure
 
ds bridge.pptx
ds bridge.pptxds bridge.pptx
ds bridge.pptx
 
1.1 introduction to Data Structures.ppt
1.1 introduction to Data Structures.ppt1.1 introduction to Data Structures.ppt
1.1 introduction to Data Structures.ppt
 
Queues
QueuesQueues
Queues
 
dsa.pptx
dsa.pptxdsa.pptx
dsa.pptx
 
ds 1 Introduction to Data Structures.ppt
ds 1 Introduction to Data Structures.pptds 1 Introduction to Data Structures.ppt
ds 1 Introduction to Data Structures.ppt
 
Data structures
Data structuresData structures
Data structures
 
Data Structures by Yaman Singhania
Data Structures by Yaman SinghaniaData Structures by Yaman Singhania
Data Structures by Yaman Singhania
 
Editors l21 l24
Editors l21 l24Editors l21 l24
Editors l21 l24
 
Data Structure # vpmp polytechnic
Data Structure # vpmp polytechnicData Structure # vpmp polytechnic
Data Structure # vpmp polytechnic
 
Unit 1.ppt
Unit 1.pptUnit 1.ppt
Unit 1.ppt
 
Data structures and algorithms
Data structures and algorithmsData structures and algorithms
Data structures and algorithms
 
Fundamentalsofdatastructures 110501104205-phpapp02
Fundamentalsofdatastructures 110501104205-phpapp02Fundamentalsofdatastructures 110501104205-phpapp02
Fundamentalsofdatastructures 110501104205-phpapp02
 
Queues
Queues Queues
Queues
 
Social network analysis
Social network analysisSocial network analysis
Social network analysis
 
RAJAT PROJECT.pptx
RAJAT PROJECT.pptxRAJAT PROJECT.pptx
RAJAT PROJECT.pptx
 
II B.Sc IT DATA STRUCTURES.pptx
II B.Sc IT DATA STRUCTURES.pptxII B.Sc IT DATA STRUCTURES.pptx
II B.Sc IT DATA STRUCTURES.pptx
 
Lecture 2 Data Structure Introduction
Lecture 2 Data Structure IntroductionLecture 2 Data Structure Introduction
Lecture 2 Data Structure Introduction
 

Recently uploaded

Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 

Recently uploaded (20)

Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 

Advanced c c++

  • 1. Advanced C Programming Introduction to Data Structures Data Structures: A data structure is an arrangement of data in a computer's memory or even disk storage. Data structures can be classified into two types • Linear Data Structures • Non Linear Data Structures Linear Data Structures: Linear data structures are those data structures in which data elements are accessed (read and written) in sequential fashion ( one by one) Eg: Stacks , Queues, Lists, Arrays Non Linear Data Structures: Non Linear Data Structures are those in which data elements are not accessed in sequential fashion. Eg: trees, graphs Algorithm: Step by Step process of representing solution to a problem in words is called an Algorithm. Characteristics of an Algorithm: • • Output: An algorithm should have one or more outputs • Finiteness: Every step in an algorithm should end in finite amount of time • Unambiguous: Each step in an algorithm should clearly stated • 1 Input : An algorithm should have zero or more inputs Effectiveness: Each step in an algorithm should be effective
  • 2. Advanced C Programming Characteristics of Data Structures Data Structure Advantages Disadvantages Array Slow search Slow deletes Fixed size Quick inserts Fast access if index known Ordered Array Faster search than unsorted array Slow inserts Slow deletes Fixed size Stack Last-in, first-out acces Slow access to other items Queue First-in, first-out access Slow access to other items Linked List Quick inserts Quick deletes Slow search Binary Tree Quick search Quick inserts Quick deletes (If the tree remains balanced) Deletion algorithm is complex Red-Black Tree Quick search Quick inserts Quick deletes (Tree always remains balanced) Complex to implement 2-3-4 Tree Quick search Quick inserts Quick deletes (Tree always remains balanced) (Similar trees good for disk storage) Complex to implement Hash Table Very fast access if key is known Quick inserts Slow deletes Access slow if key is not known Inefficient memory usage Heap Quick inserts Quick deletes Access to largest item Slow access to other items Graph Best models real-world situations Some algorithms are slow and very complex 2
  • 3. Advanced C Programming Stack : Stack is a Linear Data Structure which follows Last in First Out mechanism. It means: the first element inserted is the last one to be removed Stack uses a variable called top which points topmost element in the stack. top is incremented while pushing (inserting) an element in to the stack and decremented while poping (deleting) an element from the stack A top Push(A) B A Push(B) C B A top top Push(C) D C B A Push(D) top top C BA Pop() Valid Operations on Stack: • Inserting an element in to the stack (Push) • Deleting an element in to the stack (Pop) • Displaying the elements in the queue (Display) Note: While pushing an element into the stack, stack is full condition should be checked While deleting an element from the stack, stack is empty condition should be checked Applications of Stack: • • Stacks are used in function calls • 3 Stacks are used in recursion programs Stacks are used in interrupt implementation
  • 4. Advanced C Programming Queue: Queue is a Linear Data Structure which follows First in First out mechanism. It means: the first element inserted is the first one to be removed Queue uses two variables rear and front. Rear is incremented while inserting an element into the queue and front is incremented while deleting element from the queue rear front A Insert(A) B A Insert(B) rear front C B A Insert(C) rear front D C B A Insert(D) rear D C B front Delete() Valid Operations on Queue: • Inserting an element in to the queue • Deleting an element in to the queue • Displaying the elements in the queue Note: While inserting an element into the queue, queue is full condition should be checked While deleting an element from the queue, queue is empty condition should be checked Applications of Queues: • Real life examples • • • Waiting in line Waiting on hold for tech support Applications related to Computer Science • • 4 Threads Job scheduling (e.g. Round-Robin algorithm for CPU allocation) rear front
  • 5. Advanced C Programming Linked List: To overcome the disadvantage of fixed size arrays linked list were introduced. A linked list consists of nodes of data which are connected with each other. Every node consist of two parts data and the link to other nodes. The nodes are created dynamically. NODE bat  Data link bat  cat  Types of Linked Lists: • Single linked list • Double linked list • Circular linked list Valid operations on linked list: • • Deleting an element at first position • Inserting an element at end • Deleting an element at end • Inserting an element after given element • Inserting an element before given element • 5 Inserting an element at first position Deleting given element sat  vat NULL
  • 6. Advanced C Programming Trees : A tree is a Non-Linear Data Structure which consists of set of nodes called vertices and set of edges which links vertices Terminology: • Root Node: The starting node of a tree is called Root node of that tree • Terminal Nodes: The node which has no children is said to be terminal node or leaf . • Non-Terminal Node: The nodes which have children is said to be Non-Terminal Nodes • Degree: The degree of a node is number of sub trees of that node • Depth: The length of largest path from root to terminals is said to be depth or height of the tree • Siblings: The children of same parent are said to be siblings • Ancestors: The ancestors of a node are all the nodes along the path from the root to the node A Property C B D E F G H 6 I Number of nodes Height Root Node Leaves Interior nodes Number of levels Ancestors of H Descendants of B Siblings of E Value : : : : : : : : : 9 4 A ED, H, I, F, C D, E, G 5 I D,E, F D, F
  • 7. Advanced C Programming Binary Trees: Binary trees are special class of trees in which max degree for each node is 2 Recursive definition: A binary tree is a finite set of nodes that is either empty or consists of a root and two disjoint binary trees called the left subtree and the right subtree. Any tree can be transformed into binary tree. By left child-right sibling representation. A B C E K F G D Binary Tree Traversal Techniques: There are three binary tree traversing techniques • Inorder • Preorder • Postorder Inorder: In inorder traversing first left subtree is visited followed by root and right subtree Preorder: In preorder traversing first root is visited followed by left subtree and right subtree. Postorder: In post order traversing first left tree is visited followed by right subtree and root. 7
  • 8. Advanced C Programming Binary Search Tree: A Binary Search Tree (BST) is a binary tree which follows the following conditons • Every element has a unique key. • The keys in a nonempty left subtree are smaller than the key in the root of subtree. • The keys in a nonempty right subtree are grater than the key in the root of subtree. • The left and right subtrees are also binary search trees. 63 89 41 34 56 Valid Operations on Binary Search Tree: • • Deleting an element • Searching for an element • 8 Inserting an element Traversing 72 95
  • 9. Advanced C Programming Avl Tree: If in a binary search tree, the elements are inserted in sorted order then the height will be n, where n is number of elements. To overcome this disadvantage balanced trees were introduced. • Balanced binary search trees • An AVL Tree is a binary search tree such that for every internal node v of T, the heights of the children of v can differ by at most 1. 44 4 2 17 78 1 2 32 88 50 1 48 Operations of Avl tree: • Inserting an element • Deleting an element • Searching for an element • Traversing • 9 3 Height balancing 62 1 1
  • 10. Advanced C Programming Graphs A graph is a Non-Linear Data Structure which consists of set of nodes called vertices V and set of edges E which links vertices Note: A tree is a graph with out loops 0 0 1 1 2 3 Graph 3 2 5 4 6 Tree Graph Traversal: • Problem: Search for a certain node or traverse all nodes in the graph • Depth First Search • • Breadth First Search • 10 Once a possible path is found, continue the search until the end of the path Start several paths at a time, and advance in each one step at a time
  • 11. Advanced C Programming Introduction to Object Oriented Programming Object Oriented Programming: You've heard it a lot in the past several years. Everybody is saying it. What is all the fuss about objects and object-oriented technology? Is it real? Or is it hype? Well, the truth is--it's a little bit of both. Object-oriented technology does, in fact, provide many benefits to software developers and their products. However, historically a lot of hype has surrounded this technology, causing confusion in both managers and programmers alike. Many companies fell victim to this hardship (or took advantage of it) and claimed that their software products were object-oriented when, in fact, they weren't. These false claims confused consumers, causing widespread misinformation and mistrust of object-oriented technology. Object: As the name object-oriented implies, objects are key to understanding object-oriented technology. You can look around you now and see many examples of real-world objects: your dog, your desk, your television set, your bicycle. Definition: An object is a software bundle of variables and related methods Class: 11
  • 12. Advanced C Programming In the real world, you often have many objects of the same kind. For example, your bicycle is just one of many bicycles in the world. Using object-oriented terminology, we say that your bicycle object is an instance of the class of objects known as bicycles. Bicycles have some state (current gear, current cadence, two wheels) and behavior (change gears, brake) in common. However, each bicycle's state is independent of and can be different from other bicycles. Definition: A class is a blueprint or prototype that defines the variables and methods common to all objects of a certain kind. Inheritance: Acquiring the properties of one class in another class is called inheritance The Benefits of Inheritance • Subclasses provide specialized behaviors from the basis of common elements provided by the super class. Through the use of inheritance, programmers can reuse the code in the superclass many times. • Programmers can implement superclasses called abstract classes that define "generic" behaviors. The abstract superclass defines and may partially implement the behavior but much of the class is undefined and unimplemented. Other programmers fill in the details with specialized subclasses. Data Abstraction: The essential element of object oriented programming in abstraction. The complexity of programming in object oriented programming is maintained through abstraction. For example, the program consist of data and code which work over data. While executing a program we don’t thing in which location that data is being stored how the input device is transferring the input to the memory etc. this abstraction allows us to execute the program without thinking deeply about the complexity of execution of program. Encapsulation: 12
  • 13. Advanced C Programming Encapsulation is the mechanism that binds together code and the data and keeps them safe from outside world. In the sense it is a protective wrapper that prevents the code and data from being accessed by other code defied outside the wrapper. Access is controlled through a well defined interface. Polymorphism: Existing in more that one form is called polymorphism. Polymorphism means the ability to take more that one form. For example an operation may exhibit different behavior in different behavior in different instances. For example consider operation of addition. For two numbers the operation will generate a sum. If the operands are string the operation would produces a third string by concatenation. C++ supports polymorphism through method overloading and operator overloading Method overloading: if the same method name used for different procedures that the method is said to be overloaded. Dynamic Binding: Binding refer to the linking of a procedure call to the code to be executed in response to the call. Dynamic binding means that the code associated with a given procedure call is not know until the time of the call at runtime. It is associated with a polymorphism reference depends on the dynamic type of that reference. Message communication: An object oriented program consists of objects that communicate with each other. The process of programming in an object oriented language therefore involves the following basic steps: 1. creating classes that define objects and their behaviors. 2. creating objects from class definitions. 3. establishing communication among objects. 13
  • 14. Advanced C Programming Abstract Data Types: An Abstract Data Type (ADT) is more a way of looking at a data structure: focusing on what it does and ignoring how it does its job. A stack or a queue is an example of an ADT. It is important to understand that both stacks and queues can be implemented using an array. It is also possible to implement stacks and queues using a linked list. This demonstrates the "abstract" nature of stacks and queues: how they can be considered separately from their implementation. To best describe the term Abstract Data Type, it is best to break the term down into "data type" and then "abstract". Data type: When we consider a primitive type we are actually referring to two things: a data item with certain characteristics and the permissible operations on that data. An int in Java, for example, can contain any whole-number value from -2,147,483,648 to +2,147,483,647. It can also be used with the operators +, -, *, and /. The data type's permissible operations are an inseparable part of its identity; understanding the type means understanding what operations can be performed on it. In C++, any class represents a data type, in the sense that a class is made up of data (fields) and permissible operations on that data (methods). By extension, when a data storage structure like a stack or queue is represented by a class, it too can be referred to as a data type. A stack is different in many ways from an int, but they are both defined as a certain arrangement of data and a set of operations on that data. abstract Now lets look at the "abstract" portion of the phrase. The word abstract in our context stands for "considered apart from the detailed specifications or implementation". In C++, an Abstract Data Type is a class considered without regard to its implementation. It can be thought of as a "description" of the data in the class and a list of operations that can be carried out on that data and instructions on how to use these operations. What is excluded though, is the 14
  • 15. Advanced C Programming details of how the methods carry out their tasks. An end user (or class user), you should be told what methods to call, how to call them, and the results that should be expected, but not HOW they work. We can further extend the meaning of the ADT when applying it to data structures such as a stack and queue. In Java, as with any class, it means the data and the operations that can be performed on it. In this context, although, even the fundamentals of how the data is stored should be invisible to the user. Users not only should not know how the methods work, they should also not know what structures are being used to store the data. Consider for example the stack class. The end user knows that push() and pop() (amoung other similar methods) exist and how they work. The user doesn't and shouldn't have to know how push() and pop() work, or whether data is stored in an array, a linked list, or some other data structure like a tree. 15
  • 16. Advanced C Programming Stack ADT Algorithms Push(item) { If (stack is full) print “ stack over flow” else Increment top ; Stack [top]= item; } Pop() { If( stack is empty) print” stack under flow” else Decrement top } Display() { If ( stack is empty) print” no element to display” else for i= top to 0 step -1 Print satck[i]; } 16
  • 17. Advanced C Programming Stack ADT #include<iostream.h> #include<conio.h> #include<stdlib.h> class stack { int stk[5]; int top; public: stack() { top=-1; } void push(int x) { if(top > 4) { cout <<"stack over flow"; return; } stk[++top]=x; cout <<"inserted" <<x; } void pop() { if(top <0) { cout <<"stack under flow"; return; } cout <<"deleted" <<stk[top--]; } void display() { if(top<0) { cout <<" stack empty"; return; } 17
  • 18. Advanced C Programming for(int i=top;i>=0;i--) cout <<stk[i] <<" "; } }; void main() { int ch; stack st; clrscr(); while(1) { cout <<"n1.push 2.pop 3.display 4.exitnEnter ur choice"; cin >> ch; switch(ch) { case 1: cout <<"enter the element"; cin >> ch; st.push(ch); break; case 2: st.pop(); break; case 3: st.display();break; case 4: exit(0); } } } OUTPUTS 1.push 2.pop 3.display Enter ur choice2 stack under flow 1.push 2.pop 3.display Enter ur choice1 enter the element2 inserted2 1.push 2.pop 3.display Enter ur choice1 enter the element3 inserted3 1.push 2.pop 3.display Enter ur choice2 deleted3 1.push 2.pop 3.display Enter ur choice1 enter the element5 18 4.exit 4.exit 4.exit 4.exit 4.exit
  • 19. Advanced C Programming Queue ADT Algorithms Insert ( item) { If rear = max -1 then print “ queue is full” else { Increment rear Queue [rear]=item; } } Delete() { If front = rear print “queue is empty” else Increment front } Display() { If front=rear print “queue is empty “ else For i =front to rear Print queue[i]; } 19
  • 20. Advanced C Programming Queue ADT #include<iostream.h> #include<conio.h> #include<stdlib.h> class queue { int queue[5]; int rear,front; public: queue() { rear=-1; front=-1; } void insert(int x) { if(rear > 4) { cout <<"queue over flow"; front=rear=-1; return; } queue[++rear]=x; cout <<"inserted" <<x; } void delet() { if(front==rear) { cout <<"queue under flow"; return; } cout <<"deleted" <<queue[++front]; } void display() { if(rear==front) { 20
  • 21. Advanced C Programming cout <<" queue empty"; return; } for(int i=front+1;i<=rear;i++) cout <<queue[i]<<" "; } }; void main() { int ch; queue qu; clrscr(); while(1){ cout <<"n1.insert 2.delet 3.display 4.exitnEnter ur choice"; cin >> ch; switch(ch) { case 1: cout <<"enter the element"; cin >> ch; qu.insert(ch); break; case 2: qu.delet(); break; case 3: qu.display();break; case 4: exit(0); } } } OUTPUT 1.insert 2.delet 3.display Enter ur choice1 enter the element21 inserted21 1.insert 2.delet 3.display Enter ur choice1 enter the element22 inserted22 1.insert 2.delet 3.display Enter ur choice1 enter the element16 inserted16 1.insert 2.delet 3.display Enter ur choice3 21 4.exit 4.exit 4.exit 4.exit
  • 22. Advanced C Programming 21 22 16 1.insert 2.delet 3.display 4.exit 22
  • 23. Advanced C Programming Algorithm for Stack Using Linked List Push(item) { If (stack is full) print “ stack over flow” else goto end of list and let it be temp temp->next=item item->next=NULL; } Pop() { If(head is null) print” stack under flow” else goto last but one node and let it be temp temp->next=NULL } Display() { If ( head=NULL) print” no element to display” else { Temp=head; While(temp!=NULL) { Print(“temp->data) Temp=temp->next; } } 23
  • 24. Advanced C Programming Stack Using Linked List #include<iostream.h> #include<conio.h> #include<stdlib.h> class node { public: class node *next; int data; }; class stack : public node { node *head; int tos; public: stack() { os=-1; } void push(int x) { if (tos < 0 ) { head =new node; head->next=NULL; head->data=x; tos ++; } else { node *temp,*temp1; temp=head; if(tos >= 4) { cout <<"stack over flow"; return; } tos++; while(temp->next != NULL) temp=temp->next; temp1=new node; 24
  • 25. Advanced C Programming temp->next=temp1; temp1->next=NULL; temp1->data=x; } } void display() { node *temp; temp=head; if (tos < 0) { cout <<" stack under flow"; return; } while(temp != NULL) { cout <<temp->data<< " "; temp=temp->next; } } void pop() { node *temp; temp=head; if( tos < 0 ) { cout <<"stack under flow"; return; } tos--; while(temp->next->next!=NULL) { temp=temp->next; } temp->next=NULL; } }; void main() { stack s1; int ch; clrscr(); while(1) { 25
  • 26. Advanced C Programming cout <<"n1.PUSHn2.POPn3.DISPLAYn4.EXITn enter ru choice:"; cin >> ch; switch(ch) { case 1: cout <<"n enter a element"; cin >> ch; s1.push(ch); break; case 2: s1.pop();break; case 3: s1.display(); break; case 4: exit(0); } } } OUTPUT 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:1 enter a element23 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:1 enter a element67 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:3 23 67 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:2 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:3 23 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:2 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:2 stack under flow 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:4 26
  • 27. Advanced C Programming Algorithm Queue using Linked List Insert ( item) { If rear = max -1 then print “ queue is full” else { Increment rear Create a new node called item goto last node in the list and let it be temp temp-next=item; item-next=NULL; } } Delete() { If front = rear print “queue is empty” else { Increment front head=head-next; } } Display() { If front=rear print “queue is empty “ else Temp=head; While(temp!=NULL) { Print(“temp-data) Temp=temp-next; } } 27
  • 28. Advanced C Programming Queue using Linked List #include<iostream.h> #include<conio.h> #include<stdlib.h> class node { public: class node *next; int data; }; class queue : public node { node *head; int front,rare; public: queue() { front=-1; rare=-1; } void push(int x) { if (rare < 0 ) { head =new node; head->next=NULL; head->data=x; rare ++; } else { node *temp,*temp1; temp=head; if(rare >= 4) { cout <<"queue over flow"; return; } rare++; while(temp->next != NULL) temp=temp->next; 28
  • 29. Advanced C Programming temp1=new node; temp->next=temp1; temp1->next=NULL; temp1->data=x; } } void display() { node *temp; temp=head; if (rare < 0) { cout <<" queue under flow"; return; } while(temp != NULL) { cout <<temp->data<< " "; temp=temp->next; } } void pop() { node *temp; temp=head; if( rare < 0) { cout <<"queue under flow"; return; } if(front == rare) { front = rare =-1; head=NULL; return; } front++; head=head->next; } }; void main() { queue s1; 29
  • 30. Advanced C Programming int ch; clrscr(); while(1) { cout <<"n1.PUSHn2.POPn3.DISPLAYn4.EXITn enter ru choice:"; cin >> ch; switch(ch) { case 1: cout <<"n enter a element"; cin >> ch; s1.push(ch); break; case 2: s1.pop();break; case 3: s1.display(); break; case 4: exit(0); } } } OUTPUT 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:1 enter a element23 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:1 enter a element54 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:3 23 54 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:2 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:2 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:2 queue under flow 1.PUSH 2.POP 3.DISPLAY 4.EXIT enter ru choice:4 30
  • 31. Advanced C Programming Algorithms fo DeQueue Using Double Linked List Algorithm Insertfirst(item) { if dequeue is empty { Item-next=item-prev=NULL; tail=head=item; } else if(dequeue is full) print” insertion is not possible” else { item-next=head; item-prev=NULL; head=item; } } Algorithm Insertlast (item) { if dequeue is empty { Item-next=item-prev=NULL; tail=head=item; } else if(dequeue is full) print” insertion is not possible” else { tail-next=head; item-prev=tail; tail=item; } } Deletefirst() { If (dequeue is empty) print” no node to delete”; else { Head=head-next; Head-prev=NULL; } } 31
  • 32. Advanced C Programming Deletelast() { if (dequeue is empty) print” no node to delete”; else { tail=tail-prev; tail-next=NULL; } } Displayfirst() { if( dequeue is empty) print “ no node to display” else { temp=head; while(temp-next!=null) then do { print(temp-data); temp=temp-next; } } } Displaylast() { if( dequeue is empty) print “ no node to display” else { temp=tail while(temp-prevt!=null) then do { print(temp-data); temp=temp-prev; } } } 32
  • 33. Advanced C Programming Implementation of DeQueue Using Double Linked List #include<iostream.h> #include<conio.h> #include<stdlib.h> class node { public: int data; class node *next; class node *prev; }; class dqueue: public node { node *head,*tail; int top1,top2; public: dqueue() { top1=0; top2=0; head=NULL; tail=NULL; } void push(int x) { node *temp; int ch; if(top1+top2 >=5) { cout <<"dqueue overflow"; return ; } if( top1+top2 == 0) { head = new node; head->data=x; head->next=NULL; head->prev=NULL; tail=head; top1++; 33
  • 34. Advanced C Programming } else { cout <<" Add element 1.FIRST 2.LASTn enter ur choice:"; cin >> ch; if(ch==1) { top1++; temp=new node; temp->data=x; temp->next=head; temp->prev=NULL; head->prev=temp; head=temp; } else { top2++; temp=new node; temp->data=x; temp->next=NULL; temp->prev=tail; tail->next=temp; tail=temp; } } } void pop() { int ch; cout <<"Delete 1.First Node 2.Last Noden Enter ur choice:"; cin >>ch; if(top1 + top2 <=0) { cout <<"nDqueue under flow"; return; } if(ch==1) { head=head->next; head->prev=NULL; top1--; } 34
  • 35. Advanced C Programming else { top2--; tail=tail->prev; tail->next=NULL; } } void display() { int ch; node *temp; cout <<"display from 1.Staring 2.Endingn Enter ur choice"; cin >>ch; if(top1+top2 <=0) { cout <<"under flow"; return ; } if (ch==1) { temp=head; while(temp!=NULL) { cout << temp->data <<" "; temp=temp->next; } } else { temp=tail; while( temp!=NULL) { cout <<temp->data << " "; temp=temp->prev; } } } }; void main() { dqueue d1; int ch; clrscr(); 35
  • 36. Advanced C Programming while (1) { cout <<"1.INSERT 2.DELETE 3.DISPLAU 4.EXITn Enter ur choice:"; cin >>ch; switch(ch) { case 1: cout <<"enter element"; cin >> ch; d1.push(ch); break; case 2: d1.pop(); break; case 3: d1.display(); break; case 4: exit(1); } } } OUTPUT 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT Enter ur choice:1 enter element4 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT Enter ur choice:1 enter element5 Add element 1.FIRST 2.LAST enter ur choice:1 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT Enter ur choice:1 enter element6 Add element 1.FIRST 2.LAST enter ur choice:2 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT Enter ur choice:3 display from 1.Staring 2.Ending Enter ur choice1 5 4 6 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT Enter ur choice:2 Delete 1.First Node 2.Last Node Enter ur choice:1 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT Enter ur choice:3 display from 1.Staring 2.Ending Enter ur choice1 4 6 1.INSERT 2.DELETE 3.DISPLAU 4.EXIT Enter ur choice:4 36
  • 37. Advanced C Programming Algorithm for Circular Queue Algorithm Insertfirst(item) { if cqueue is empty then head=item; else if(cqueue is full) print” insertion is not possible” else { Rear=(rear +1) mod max } cqueue[rear]=x; } Algorithm Deletet() { If (dequeue is empty) print” no node to delete”; else { Front=(front+1) mod max } } Algorithm display() { If (front >rear) display elements for front to max and 0 to rear Else display elements from front to rear } 37
  • 38. Advanced C Programming Implementation of Circular Queue Using Array #include<iostream.h> #include<conio.h> #include<stdlib.h> class cqueue { int q[5],front,rare; public: cqueue() { front=-1; rare=-1; } void push(int x) { if(front ==-1 && rare == -1) { q[++rare]=x; front=rare; return; } else if(front == (rare+1)%5 ) { cout <<" Circular Queue over flow"; return; } rare= (rare+1)%5; q[rare]=x; } void pop() { if(front==-1 && rare== -1) { cout <<"under flow"; return; } else if( front== rare ) { front=rare=-1; return; 38
  • 39. Advanced C Programming } front= (front+1)%5; } void display() { int i; if( front <= rare) { for(i=front; i<=rare;i++) cout << q[i]<<" "; } else { for(i=front;i<=4;i++) { cout <<q[i] << " "; } for(i=0;i<=rare;i++) { cout << q[i]<< " "; } } } }; void main(){ int ch; cqueue q1; clrscr(); while( 1) { cout<<"n1.INSERT 2.DELETE 3.DISPLAY cin >> ch; switch(ch) { case 1: cout<<"enter element"; cin >> ch; q1.push(ch); break; case 2: q1.pop(); break; case 3: q1.display(); break; case 4: exit(0); } } } 39 4.EXITnEnter ur choice";
  • 40. Advanced C Programming OUTPUT 1.INSERT 2.DELETE 3.DISPLAY Enter ur choice1 enter element4 4.EXIT 1.INSERT 2.DELETE 3.DISPLAY Enter ur choice1 enter element5 4.EXIT 1.INSERT 2.DELETE 3.DISPLAY Enter ur choice1 enter element3 4.EXIT 1.INSERT 2.DELETE 3.DISPLAY Enter ur choice3 453 1.INSERT 2.DELETE 3.DISPLAY Enter ur choice2 4.EXIT 1.INSERT 2.DELETE 3.DISPLAY Enter ur choice3 53 1.INSERT 2.DELETE 3.DISPLAY Enter ur choice4 4.EXIT 40 4.EXIT 4.EXIT
  • 41. Advanced C Programming Program to Algorithm for Dictionary Dictionary Implement Functions of a #include<iostream.h> #include<conio.h> #include<stdlib.h> # define max 10 typedef struct list { int data; struct list *next; }node_type; node_type *ptr[max],*root[max],*temp[max]; class Dictionary { public: int index; Dictionary(); void insert(int); void search(int); void delete_ele(int); }; Dictionary::Dictionary() { index=-1; for(int i=0;i<max;i++) { root[i]=NULL; ptr[i]=NULL; temp[i]=NULL; } } void Dictionary::insert(int key) { index=int(key%max); ptr[index]=(node_type*)malloc(sizeof(node_type)); ptr[index]->data=key; if(root[index]==NULL) { 41
  • 42. Advanced C Programming root[index]=ptr[index]; root[index]->next=NULL; temp[index]=ptr[index]; } else { temp[index]=root[index]; while(temp[index]->next!=NULL) temp[index]=temp[index]->next; temp[index]->next=ptr[index]; } } void Dictionary::search(int key) { int flag=0; index=int(key%max); temp[index]=root[index]; while(temp[index]!=NULL) { if(temp[index]->data==key) { cout<<"nSearch key is found!!"; flag=1; break; } else temp[index]=temp[index]->next; } if (flag==0) cout<<"nsearch key not found......."; } void Dictionary::delete_ele(int key) { index=int(key%max); temp[index]=root[index]; while(temp[index]->data!=key && temp[index]!=NULL) { ptr[index]=temp[index]; temp[index]=temp[index]->next; } ptr[index]->next=temp[index]->next; cout<<"n"<<temp[index]->data<<" has been deleted."; temp[index]->data=-1; 42
  • 43. Advanced C Programming temp[index]=NULL; free(temp[index]); } void main() { int val,ch,n,num; char c; Dictionary d; clrscr(); do { cout<<"nMENU:n1.Create"; cout<<"n2.Search for a valuen3.Delete an value"; cout<<"nEnter your choice:"; cin>>ch; switch(ch) { case 1: cout<<"nEnter the number of elements to be inserted:"; cin>>n; cout<<"nEnter the elements to be inserted:"; for(int i=0;i<n;i++) { cin>>num; d.insert(num); } break; case 2: cout<<"nEnter the element to be searched:"; cin>>n; d.search(n); case 3: cout<<"nEnter the element to be deleted:"; cin>>n; d.delete_ele(n); break; default: cout<<"nInvalid choice...."; } cout<<"nEnter y to continue......"; cin>>c; }while(c=='y'); getch(); } 43
  • 44. Advanced C Programming OUTPUT MENU: 1.Create 2.Search for a value 3.Delete an value Enter your choice:1 Enter the number of elements to be inserted:8 Enter the elements to be inserted:10 4 5 8 7 12 6 1 Enter y to continue......y MENU: 1.Create 2.Search for a value 3.Delete an value Enter your choice:2 Enter the element to be searched:12 Search key is found!! Enter the element to be deleted:1 1 has been deleted. Enter y to continue......y 44
  • 45. Advanced C Programming AVL TREE Algorithm insertion(int x) { If(tree is empty) then root is empty Otherwise { temp=search(item); // temp is the node where search for the item halts if( item > temp) then temp-right=item; otherwise temp-left =item • • • • • Reconstruction procedure: rotating tree left rotation and right rotation Suppose that the rotation occurs at node x Left rotation: certain nodes from the right subtree of x move to its left subtree; the root of the right subtree of x becomes the new root of the reconstructed subtree Right rotation at x: certain nodes from the left subtree of x move to its right subtree; the root of the left subtree of x becomes the new root of the reconstructed subtree } Algorithm Search(int x) Algorithm delete() { • Case 1: the node to be deleted • Case 2: the node to be deleted is, its right subtree is empty • Case 3: the node to be deleted is, its left subtree is empty • Case 4: the node to be deleted right child } is a leaf has no right child, that has no left child, that has a left child and a Algorithm Search(x, root) { if(tree is empty ) then print” tree is empty” otherwise If(x grater than root) search(root-right); Otherwise if(x less than root ) search(root-left) Otherwise return true } } 45
  • 46. Advanced C Programming AVL TREE #include<iostream.h> #include<conio.h> #include<stdlib.h> #include<math.h> void insert(int,int ); void delte(int); void display(int); int search(int); int search1(int,int); int avltree[40],t=1,s,x,i; void main() { int ch,y; for(i=1;i<40;i++) avltree[i]=-1; while(1) { cout <<"1.INSERTn2.DELETEn3.DISPLAYn4.SEARCHn5.EXITnEnter your choice:"; cin >> ch; switch(ch) { case 1: cout <<"enter the element to insert"; cin >> ch; insert(1,ch); break; case 2: cout <<"enter the element to delete"; cin >>x; y=search(1); if(y!=-1) delte(y); else cout<<"no such element in avlavltree"; break; case 3: display(1); cout<<"n"; for(int i=0;i<=32;i++) cout <<i; 46
  • 47. Advanced C Programming cout <<"n"; break; case 4: cout <<"enter the element to search:"; cin >> x; y=search(1); if(y == -1) cout <<"no such element in avltree"; else cout <<x << "is in" <<y <<"position"; break; case 5: exit(0); } } } void insert(int s,int ch ) { int x,y; if(t==1) { avltree[t++]=ch; return; } x=search1(s,ch); if(avltree[x]>ch) { avltree[2*x]=ch; y=log(2*x)/log(2); if(height(1,y)) { if( x%2==0 ) update1(); else update2(); } } else { avltree[2*x+1]=ch; y=log(2*x)/log(2); if(height(1,y)) { if(x%2==1) update1(); else update2(); } 47
  • 48. Advanced C Programming } t++; } void delte(int x) { if( avltree[2*x]==-1 && avltree[2*x+1]==-1) avltree[x]=-1; else if(avltree[2*x]==-1) { avltree[x]=avltree[2*x+1]; avltree[2*x+1]=-1; } else if(avltree[2*x+1]==-1) { avltree[x]=avltree[2*x]; avltree[2*x]=-1; } else { avltree[x]=avltree[2*x]; delte(2*x); } t--; } int search(int s) { if(t==1) { cout <<"no element in avltree"; return -1; } if(avltree[s]==-1) return avltree[s]; if(avltree[s]>x) search(2*s); else if(avltree[s]<x) search(2*s+1); else return s; } void display(int s) { if(t==1) { cout <<"no element in avltree:"; 48
  • 49. Advanced C Programming return; } for(int i=1;i<40;i++) if(avltree[i]==-1) cout <<" "; else cout <<avltree[i]; return ; } int search1(int s,int ch) { if(t==1) { cout <<"no element in avltree"; return -1; } if(avltree[s]==-1) return s/2; if(avltree[s] > ch) search1(2*s,ch); else search1(2*s+1,ch); } int height(int s,int y) { if(avltree[s]==-1) return; } 49
  • 50. Advanced C Programming OUTPUT 1.insert 2.display 3.delete 4.search 5.exit Enter u r choice to perform on AVL tree1 Enter an element to insert into tree4 do u want to continuey 1.insert 2.display 3.delete 4.search 5.exit Enter u r choice to perform on AVL tree1 Enter an element to insert into tree5 do u want to continuey 1.insert 2.display 3.delete 4.search 5.exit Enter u r choice to perform on AVL tree3 Enter an item to deletion5 itemfound do u want to continuey 1.insert 2.display 3.delete 4.search 5.exit Enter u r choice to perform on AVL tree2 4 do u want to continue4 50
  • 51. Advanced C Programming Breath First Search Algorithm Algorithm BFS(s): Input: A vertex s in a graph Output: A labeling of the edges as “discovery” edges and “cross edges” initialize container L0 to contain vertex s i ¬ 0 while Li is not empty do create container Li+1 to initially be empty for each vertex v in Li do if edge e incident on v do let w be the other endpoint of e if vertex w is unexplored then label e as a discovery edge insert w into Li+1 else label e as a cross edge i ¬ i + 1 51
  • 52. Advanced C Programming Breath First Search Implementation #include<iostream.h> #include<conio.h> #include<stdlib.h> int cost[10][10],i,j,k,n,qu[10],front,rare,v,visit[10],visited[10]; void main() { clrscr(); int m; cout <<"enterno of vertices"; cin >> n; cout <<"ente no of edges"; cin >> m; cout <<"nEDGES n"; for(k=1;k<=m;k++) { cin >>i>>j; cost[i][j]=1; } cout <<"enter initial vertex"; cin >>v; cout <<"Visitied verticesn"; cout << v; xvisited[v]=1; k=1; while(k<n) { for(j=1;j<=n;j++) if(cost[v][j]!=0 && visited[j]!=1 && visit[j]!=1) { visit[j]=1; qu[rare++]=j; } v=qu[front++]; cout<<v << " "; k++; visit[v]=0; visited[v]=1; } } 52
  • 53. Advanced C Programming OUTPUT enterno of vertices9 ente no of edges9 EDGES 12 23 15 14 47 78 89 26 57 enter initial vertex1 Visited vertices 12 4 5 3 6 7 8 9 53
  • 54. Advanced C Programming Depth First Search Algorithm Algorithm DFS(v); Input: A vertex v in a graph Output: A labeling of the edges as “discovery” edges and “backedges” for each edge e incident on v do if edge e is unexplored then let w be the other endpoint of e if vertex w is unexplored then label e as a discovery edge recursively call DFS(w) else label e as a backedge 54
  • 55. Advanced C Programming Depth First Search #include<iostream.h> #include<conio.h> #include<stdlib.h> int cost[10][10],i,j,k,n,stk[10],top,v,visit[10],visited[10]; void main() { int m; clrscr(); cout <<"enterno of vertices"; cin >> n; cout <<"ente no of edges"; cin >> m; cout <<"nEDGES n"; for(k=1;k<=m;k++) { cin >>i>>j; cost[i][j]=1; } cout <<"enter initial vertex"; cin >>v; cout <<"ORDER OF VISITED VERTICES"; cout << v <<" "; visited[v]=1; k=1; while(k<n) { for(j=n;j>=1;j--) if(cost[v][j]!=0 && visited[j]!=1 && visit[j]!=1) { visit[j]=1; stk[top]=j; top++; } v=stk[--top]; cout<<v << " "; k++; visit[v]=0; visited[v]=1; } } 55
  • 56. Advanced C Programming OUTPUT enterno of vertices9 ente no of edges9 EDGES 12 23 26 15 14 47 57 78 89 enter initial vertex1 ORDER OF VISITED VERTICES1 2 3 6 4 7 8 9 5 56
  • 57. Advanced C Programming Prim’s Algorithm Algorithm Prim(E,Cost,n,t) { Let (k, l) be an edge of minimum cost in E; Mincost= cost[k,l]; t[1,1]=k; t[1,2]=l; for i=1 to n do { If (cost[i, l]<cost[k,l]) then near[i]=l; Else Near[i]=k; Near[k]=near[j]=0; } For i=2 to n -1 do { Let j be an index such that nearpj]!= 0 and cost[j,near[j]] is minimum T[I,1]=j ; t[I,2]=near[j] mincost=mincost + cost[j,near[j]]; near[j]=0; for k=1 to n do if(near[k] !=0 ) and cost[k,near[k]]) then near[j]=k } } 57 >cost[k,j])
  • 58. Advanced C Programming Prim’s Algorithm #include<iostream.h> #include<conio.h> #include<stdlib.h> int cost[10][10],i,j,k,n,stk[10],top,v,visit[10],visited[10],u; void main() { int m,c; clrscr(); cout <<"enterno of vertices"; cin >> n; cout <<"ente no of edges"; cin >> m; cout <<"nEDGES Costn"; for(k=1;k<=m;k++) { cin >>i>>j>>c; cost[i][j]=c; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(cost[i][j]==0) cost[i][j]=31999; cout <<"ORDER OF VISITED VERTICES"; k=1; while(k<n) { m=31999; if(k==1) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(cost[i][j]<m) { m=cost[i][j]; u=i; } } else { for(j=n;j>=1;j--) 58
  • 59. Advanced C Programming if(cost[v][j]<m && visited[j]!=1 && visit[j]!=1) { visit[j]=1; stk[top]=j; top++; m=cost[v][j]; u=j; } } cost[v][u]=31999; v=u; cout<<v << " "; k++; visit[v]=0; visited[v]=1; } } OUTPUT enterno of vertices7 ente no of edges9 EDGES Cost 1 6 10 6 5 25 5 4 22 4 3 12 3 2 16 2 7 14 5 7 24 4 7 18 1 2 28 ORDER OF VISITED VERTICES1 6 5 4 3 2 59
  • 60. Advanced C Programming Kruskal’s Algorithm Algorithm Krushkal(E, cost,n,t) { for i=1 to n do parent[i]=-1; i=0; mincost=0; while( I < n-1) { Delete a minimum coast edge (u,v) form the heap and reheapfy using adjust J=find(u); K=find(v); If(j!=k) then { i=i+1; t[I,1]=u; t[I,2]=v; mincost=mincost+ cost[u,v]; union(j,k) } If( i != n-1) the write (“ no spanning tree”); else Return mincost } } 60
  • 61. Advanced C Programming Kruskal’s Algorithm #include<iostream.h> #include<conio.h> #include<stdlib.h> int cost[10][10],i,j,k,n,m,c,visit,visited[10],l,v,count,count1,vst,p; main() { int dup1,dup2; cout<<"enter no of vertices"; cin >> n; cout <<"enter no of edges"; cin >>m; cout <<"EDGE Cost"; for(k=1;k<=m;k++) { cin >>i >>j >>c; cost[i][j]=c; cost[j][i]=c; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(cost[i][j]==0) cost[i][j]=31999; visit=1; while(visit<n) { v=31999; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(cost[i][j]!=31999 && cost[i][j]<v && cost[i][j]!=-1 ) { count =0; for(p=1;p<=n;p++) { if(visited[p]==i || visited[p]==j) count++; } if(count >= 2) { for(p=1;p<=n;p++) if(cost[i][p]!=31999 && p!=j) 61
  • 62. Advanced C Programming dup1=p; for(p=1;p<=n;p++) if(cost[j][p]!=31999 && p!=i) dup2=p; if(cost[dup1][dup2]==-1) continue; } l=i; k=j; v=cost[i][j]; } cout <<"edge from " <<l <<"-->"<<k; cost[l][k]=-1; cost[k][l]=-1; visit++; count=0; count1 =0; for(i=1;i<=n;i++) { if(visited[i]==l) count++; if(visited[i]==k) count1++; } if(count==0) visited[++vst]=l; if(count1==0) visited[++vst]=k; } } 62
  • 63. Advanced C Programming Single Source Shortest Path #include<iostream.h> #include<conio.h> #include<stdio.h> int shortest(int ,int); int cost[10][10],dist[20],i,j,n,k,m,S[20],v,totcost,path[20],p; void main() { int c; clrscr(); cout <<"enter no of vertices"; cin >> n; cout <<"enter no of edges"; cin >>m; cout <<"nenternEDGE Costn"; for(k=1;k<=m;k++) { cin >> i >> j >>c; cost[i][j]=c; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(cost[i][j]==0) cost[i][j]=31999; cout <<"enter initial vertex"; cin >>v; cout << v<<"n"; shortest(v,n); } shortest(int v,int n) { int min; for(i=1;i<=n;i++) { S[i]=0; dist[i]=cost[v][i]; } path[++p]=v; 63
  • 64. Advanced C Programming S[v]=1; dist[v]=0; for(i=2;i<=n-1;i++) { k=-1; min=31999; for(j=1;j<=n;j++) { if(dist[j]<min && S[j]!=1) { min=dist[j]; k=j; } } if(cost[v][k]<=dist[k]) p=1; path[++p]=k; for(j=1;j<=p;j++) cout<<path[j]; cout <<"n"; //cout <<k; S[k]=1; for(j=1;j<=n;j++) if(cost[k][j]!=31999 && dist[j]>=dist[k]+cost[k][j] && S[j]!=1) dist[j]=dist[k]+cost[k][j]; } } OUTPUT enter no of vertices6 enter no of edges11 enter EDGE Cost 1 2 50 1 3 45 1 4 10 2 3 10 2 4 15 3 5 30 64
  • 65. Advanced C Programming 4 1 10 4 5 15 5 2 20 5 3 35 653 enter initial vertex1 1 14 145 1452 13 65
  • 66. Advanced C Programming Non recursive Pre order Traversing Algorithm Algorithm preorder( root) { 1. current = root; //start the traversal at the root node 2. while(current is not NULL or stack is nonempty) if(current is not NULL) { visit current; push current onto stack; current = current->llink; } else { pop stack into current; current = current->rlink; //prepare to visit //the right subtree } 66
  • 67. Advanced C Programming Non recursive Pre order Traversing #include<iostream.h> #include<conio.h> #include<stdlib.h> class node { public: class node *left; class node *right; int data; }; class tree: public node { public: int stk[50],top; node *root; tree() { root=NULL; top=0; } void insert(int ch) { node *temp,*temp1; if(root== NULL) { root=new node; root->data=ch; root->left=NULL; root->right=NULL; return; } temp1=new node; temp1->data=ch; temp1->right=temp1->left=NULL; temp=search(root,ch); if(temp->data>ch) temp->left=temp1; else temp->right=temp1; 67
  • 68. Advanced C Programming } node *search(node *temp,int ch) { if(root== NULL) { cout <<"no node present"; return NULL; } if(temp->left==NULL && temp->right== NULL) return temp; if(temp->data>ch) { if(temp->left==NULL) return temp; search(temp->left,ch);} else { if(temp->right==NULL) return temp; search(temp->right,ch); } } void display(node *temp) { if(temp==NULL) return ; display(temp->left); cout<<temp->data <<" "; display(temp->right); } void preorder( node *root) { node *p,*q; p=root; q=NULL; top=0; while(p!=NULL) { cout <<p->data << " "; if(p->right!=NULL) { stk[top]=p->right->data; top++; } p=p->left; if(p==NULL && top>0) 68
  • 69. Advanced C Programming { p=pop(root); } } } node * pop(node *p) { int ch; ch=stk[top-1]; if(p->data==ch) { top--; return p; } if(p->data>ch) pop(p->left); else pop(p->right); } }; void main() { tree t1; int ch,n,i; while(1) { cout <<"n1.INSERTn2.DISPLAY 3.PREORDER TRAVERSEn4.EXITnEnter your choice:"; cin >> ch; switch(ch) { case 1: cout <<"enter no of elements to insert:"; cout<<"n enter the elements"; cin >> n; for(i=1;i<=n;i++) { cin >> ch; t1.insert(ch); } break; case 2: t1.display(t1.root);break; case 3: t1.preorder(t1.root); break; case 4: exit(1); } } } 69
  • 70. Advanced C Programming OUTPUT 1.INSERT 2.DISPLAY 3.PREORDER TRAVERSE 4.EXIT Enter your choice:1 enter no of elements to insert enter the elements7 5 24 36 11 44 2 21 1.INSERT 2.DISPLAY 3.PREORDER TRAVERSE 4.EXIT Enter your choice:2 2 5 11 21 24 36 44 1.INSERT 2.DISPLAY 3.PREORDER TRAVERSE 4.EXIT Enter your choice:3 5 2 24 11 21 36 44 1.INSERT 2.DISPLAY 3.PREORDER TRAVERSE 4.EXIT Enter your choice:4 70
  • 71. Advanced C Programming Non recursive In order Traversing Algorithm inorder( root) { 1. current = root; //start traversing the binary tree at // the root node 2. while(current is not NULL or stack is nonempty) if(current is not NULL) { push current onto stack; current = current->llink; } else { pop stack into current; visit current; //visit the node current = current->rlink; //move to the //right child } } 71
  • 72. Advanced C Programming Non recursive In order Traversing #include<iostream.h> #include<conio.h> #include<stdlib.h> class node { public: class node *left; class node *right; int data; }; class tree: public node { public: int stk[50],top; node *root; tree() { root=NULL; top=0; } void insert(int ch) { node *temp,*temp1; if(root== NULL) { root=new node; root->data=ch; root->left=NULL; root->right=NULL; return; } temp1=new node; temp1->data=ch; temp1->right=temp1->left=NULL; temp=search(root,ch); if(temp->data>ch) temp->left=temp1; else temp->right=temp1; 72
  • 73. Advanced C Programming } node *search(node *temp,int ch) { if(root== NULL) { cout <<"no node present"; return NULL; } if(temp->left==NULL && temp->right== NULL) return temp; if(temp->data>ch) { if(temp->left==NULL) return temp; search(temp->left,ch);} else { if(temp->right==NULL) return temp; search(temp->right,ch); } } void display(node *temp) { if(temp==NULL) return ; display(temp->left); cout<<temp->data; display(temp->right); } void inorder( node *root) { node *p; p=root; top=0; do { while(p!=NULL) { stk[top]=p->data; top++; p=p->left; } if(top>0) { 73
  • 74. Advanced C Programming p=pop(root); cout << p->data; p=p->right; } }while(top!=0 || p!=NULL); } node * pop(node *p) { int ch; ch=stk[top-1]; if(p->data==ch) { top--; return p; } if(p->data>ch) pop(p->left); else pop(p->right); } }; void main() { tree t1; int ch,n,i; while(1) { cout <<"n1.INSERTn2.DISPLAY 3.INORDER TRAVERSEn4.EXITnEnter your choice:"; cin >> ch; switch(ch) { case 1: cout <<"enter no of elements to insert:"; cin >> n; for(i=1;i<=n;i++) { cin >> ch; t1.insert(ch); } break; case 2: t1.display(t1.root);break; case 3: t1.inorder(t1.root); break; case 4: exit(1); } 74
  • 75. Advanced C Programming } } OUTPUT 1.INSERT 2.DISPLAY 3.INORDER TRAVERSE 4.EXIT Enter your choice:1 enter no of elements to inser 5 24 36 11 44 2 21 1.INSERT 2.DISPLAY 3.INORDER TRAVERSE 4.EXIT Enter your choice:3 251121243644 1.INSERT 2.DISPLAY 3.INORDER TRAVERSE 4.EXIT Enter your choice:3 251121243644 1.INSERT 2.DISPLAY 3.INORDER TRAVERSE 4.EXIT Enter your choice:4 75
  • 76. Advanced C Programming Non recursive Post order Traversing Algorithm Algorithm postorder( node root) { 1. current = root; //start traversal at root node 2. v = 0; 3. if(current is NULL) the binary tree is empty 4. if(current is not NULL) a. push current into stack; b. push 1 onto stack; c. current = current->llink; d. while(stack is not empty) if(current is not NULL and v is 0) { push current and 1 onto stack; current = current->llink; } else { pop stack into current and v; if(v == 1) { push current and 2 onto stack; current = current->rlink; v = 0; } else visit current; }} 76
  • 77. Advanced C Programming Non recursive Post order Traversing #include<iostream.h> #include<conio.h> #include<stdlib.h> class node { public: class node *left; class node *right; int data; }; class tree: public node { public: int stk[50],top; node *root; tree() { root=NULL; top=0; } void insert(int ch) { node *temp,*temp1; if(root== NULL) { root=new node; root->data=ch; root->left=NULL; root->right=NULL; return; } temp1=new node; temp1->data=ch; temp1->right=temp1->left=NULL; temp=search(root,ch); if(temp->data>ch) temp->left=temp1; else temp->right=temp1; 77
  • 78. Advanced C Programming } node *search(node *temp,int ch) { if(root== NULL) { cout <<"no node present"; return NULL; } if(temp->left==NULL && temp->right== NULL) return temp; if(temp->data>ch) { if(temp->left==NULL) return temp; search(temp->left,ch);} else { if(temp->right==NULL) return temp; search(temp->right,ch); } } void display(node *temp) { if(temp==NULL) return ; display(temp->left); cout<<temp->data << " "; display(temp->right); } void postorder( node *root) { node *p; p=root; top=0; while(1) { while(p!=NULL) { stk[top]=p->data; top++; if(p->right!=NULL) stk[top++]=-p->right->data; p=p->left; 78
  • 79. Advanced C Programming } } while(stk[top-1] > 0 || top==0) { if(top==0) return; cout << stk[top-1] <<" "; p=pop(root); } if(stk[top-1]<0) { stk[top-1]=-stk[top-1]; p=pop(root); } } node * pop(node *p) { int ch; ch=stk[top-1]; if(p->data==ch) { top--; return p; } if(p->data>ch) pop(p->left); else pop(p->right); } }; void main() { tree t1; int ch,n,i; clrscr(); while(1) { cout <<"n1.INSERTn2.DISPLAY 3.POSTORDER TRAVERSEn4.EXITnEnter your choice:"; cin >> ch; switch(ch) { case 1: cout <<"enter no of elements to insert:"; cout<<"n enter the elements"; cin >> n; for(i=1;i<=n;i++) { cin >> ch; 79
  • 80. Advanced C Programming t1.insert(ch); } break; case 2: t1.display(t1.root);break; case 3: t1.postorder(t1.root); break; case 4: exit(1); } } } OUTPUT 1.INSERT 2.DISPLAY 3.POSTORDER TRAVERSE 4.EXIT Enter your choice:1 enter no of elements to insert: enter the elements7 5 24 36 11 44 2 21 1.INSERT 2.DISPLAY 3.POSTORDER TRAVERSE 4.EXIT Enter your choice:2 2 5 11 21 24 36 44 1.INSERT 2.DISPLAY 3.POSTORDER TRAVERSE 4.EXIT Enter your choice:3 2 21 11 44 36 24 5 1.INSERT 2.DISPLAY 3.POSTORDER TRAVERSE 4.EXIT Enter your choice:4 80
  • 81. Advanced C Programming Quick Sort Algorithm Algorithm quicksort(a[],p,q) { V=a[p]; i=p; j=q; if(i<j) { repeat { repeat I=i+1; Until( a[i]> v); Repeat J=j-1; Until(a[j]<v); If(i<j) then interchange ( a[i],a[j]) }until (i<=j); interchange(a[j], a[p]) } quicksort(a[],p,j); quicksort(a[],j+1,q); } 81
  • 82. Advanced C Programming Quick Sort #include<iostream.h> #include<conio.h> int a[10],l,u,i,j; void quick(int *,int,int); void main() { clrscr(); cout <<"enter 10 elements"; for(i=0;i<10;i++) cin >> a[i]; l=0; u=9; quick(a,l,u); cout <<"sorted elements"; for(i=0;i<10;i++) cout << a[i] << " "; getch(); } void quick(int a[],int l,int u) { int p,temp; if(l<u) { p=a[l]; i=l; j=u; while(i<j) { while(a[i] <= p && i<j ) i++; while(a[j]>p && i<=j ) j--; if(i<=j) { temp=a[i]; a[i]=a[j]; a[j]=temp;} } temp=a[j]; 82
  • 83. Advanced C Programming a[j]=a[l]; a[l]=temp; cout <<"n"; for(i=0;i<10;i++) cout <<a[i]<<" "; quick(a,l,j-1); quick(a,j+1,u); } } OUTPUT enter 10 elements5 2 3 16 25 1 20 7 8 61 14 1 2 3 5 25 16 20 7 8 61 1 2 3 5 25 16 20 7 8 61 1 2 3 5 25 16 20 7 8 61 1 2 3 5 25 16 20 7 8 61 1 2 3 5 25 16 20 7 8 61 1 2 3 5 8 16 20 7 25 61 1 2 3 5 7 8 20 16 25 61 1 2 3 5 7 8 16 20 25 61 1 2 3 5 7 8 16 20 25 61 sorted elements1 2 3 5 7 8 16 20 25 61 83
  • 84. Advanced C Programming Merge Sort Algorithm Algorithm Mergesort(low,high) { If(low<high) { Mid=(low+high)/2; Mergesort(low,mid); Mergesort(mid+1,high) Merge(low,mid,high); } } Algorithm Merge(low,mid,high) { h=low; i=low; j=mid+1; While(h<=mid and j<=high) do { If(a[h]<a[j]) then { b[i]=a[h]; h=h+1; } else { b[i]=a[j]; J=j+1; } if(h>mid) { For k= j to high do b[i]=a[k]; i=i+1; } Else { For k=h to mid do b[i]=a[k]; i=i+1; } For k= low to high do a[k]=b[k]; } } 84
  • 85. Advanced C Programming Merge Sort #include<iostream.h> #include<conio.h> void mergesort(int *,int,int); void merge(int *,int,int,int); int a[20],i,n,b[20]; void main() { clrscr(); cout <<"N enter no of elements"; cin >> n; cout <<"enter the elements"; for(i=0;i<n;i++) cin >> a[i]; mergesort(a,0,n-1); cout <<" numbers after sort"; for(i=0;i<n;i++) cout << a[i] << " "; getch(); } void mergesort(int a[],int i,int j) { int mid; if(i<j) { mid=(i+j)/2; mergesort(a,i,mid); mergesort(a,mid+1,j); merge(a,i,mid,j); } } void merge(int a[],int low,int mid ,int high) { int h,i,j,k; h=low; i=low; j=mid+1; 85
  • 86. Advanced C Programming while(h<=mid && j<=high) { if(a[h]<=a[j]) b[i]=a[h++]; else b[i]=a[j++]; i++; } if( h > mid) for(k=j;k<=high;k++) b[i++]=a[k]; else for(k=h;k<=mid;k++) b[i++]=a[k]; cout <<"n"; for(k=low;k<=high;k++) { a[k]=b[k]; cout << a[k] <<" "; } } OUTPUT N enter no of elements8 12 5 61 60 50 1 70 81 enter the elements 5 12 60 61 5 12 60 61 1 50 70 81 1 50 70 81 1 5 12 50 60 61 70 81 numbers after sort1 5 12 50 60 61 70 81 86
  • 87. Advanced C Programming Heap Sort Algorithm Definition: A heap is a list in which each element contains a key, such that the key in the element at position k in the list is at least as large as the key in the element at position 2k + 1 (if it exists), and 2k + 2 (if it exists) Algorithm Heapify(a[],n) { For i=n/2 to 1 step -1 Adjustify (a,i,n); } Algorithm Adjustify(a[],i,n) { Repeat { J=leftchild(i) Compare left and right child of a[i] and store the index of grater number in j Compare a[j] and a[i] If (a[j]>a[i]) then Copy a[j] to a[i] and move to next level }until(j<n) } 87
  • 88. Advanced C Programming Heap Sort #include<stdio.h> #include<conio.h> int a[20],n; main() { int i,j,temp; clrscr(); printf("ente n"); scanf("%d",&n); printf("enter the elements"); for(i=1;i<=n;i++) scanf("%d",&a[i]); heapify(a,n); for(j=1;j<=n;j++) printf("%d",a[j]); for(i=n;i>=2;i--) { temp=a[i]; a[i]=a[1]; a[1]=temp; adjust(a,1,i-1); printf("n"); for(j=1;j<=n;j++) printf("%d ",a[j]); } printf("nelements after sort"); for(i=1;i<=n;i++) printf("%d ",a[i]); } heapify(int a[],int n) { int i; for( i=n/2;i>=1;i--) adjust(a,i,n); } 88
  • 89. Advanced C Programming adjust(int a[],int i,int n) { int j,iteam; j=2*i; iteam=a[i]; while(j<=n) { if(j<n && a[j]<a[j+1]) j=j+1; if(iteam>=a[j]) break; a[j/2]=a[j]; j=2*j; } a[j/2]=iteam; } 89
  • 90. Advanced C Programming All Paris Shortest Path #include<iostream.h> #include<conio.h> int min(int a,int b); int cost[10][10],a[10][10],i,j,k,c; void main() { int n,m; cout <<"enter no of vertices"; cin >> n; cout <<"enter no od edges"; cin >> m; cout<<"enter thenEDGE Costn"; for(k=1;k<=m;k++) { cin>>i>>j>>c; a[i][j]=cost[i][j]=c; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(a[i][j]== 0 && i !=j) a[i][j]=31999; } for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=min(a[i][j],a[i][k]+a[k][j]); cout <<"Resultant adj matrixn"; for(i=1;i<=n;i++) { for( j=1;j<=n;j++) { if(a[i][j] !=31999) cout << a[i][j] <<" "; } cout <<"n"; } 90
  • 91. Advanced C Programming getch(); } int min(int a,int b) { if(a<b) return a; else return b; } OUTPUT enter no of vertices3 enter no od edges5 enter the EDGE Cost 124 216 1 3 11 313 232 Resultant adj matrix 046 502 370 91
  • 92. Advanced C Programming Algorithms for Binary Search Tree Algorithm Insert(item) { If(tree is empty) then root is empty Otherwise { temp=search(item); // temp is the node where search for the item halts if( item > temp) then temp-right=item; otherwise temp-left =item } } Algorithm Search(x, root) { if(tree is empty ) then print” tree is empty” otherwise If(x grater than root) search(root-right); Otherwise if(x less than root ) search(root-left) Otherwise return true } } Algorithm Delete(x) { Search for x in the tree If (not found) print” not found” Otherwise{ If ( x has no child) delete x; If(x has left child) move the left child to x position If(x has right child) move the right child to x position If(x has both left and right children) replace ‘x’ with greatest of left subtree of ‘x ‘ or smallest of right subtree of ‘x’ and delete selected node in the subtree } } 92
  • 93. Advanced C Programming Binary Search Tree #include<iostream.h> #include<conio.h> #include<stdlib.h> class node { public: class node *left; class node *right; int data; }; class tree: public node { public: int stk[50],top; node *root; tree() { root=NULL; top=0; } void insert(int ch) { node *temp,*temp1; if(root== NULL) { root=new node; root->data=ch; root->left=NULL; root->right=NULL; return; } temp1=new node; temp1->data=ch; temp1->right=temp1->left=NULL; temp=search(root,ch); if(temp->data>ch) temp->left=temp1; else temp->right=temp1; 93
  • 94. Advanced C Programming } node *search(node *temp,int ch) { if(root== NULL) { cout <<"no node present"; return NULL; } if(temp->left==NULL && temp->right== NULL) return temp; if(temp->data>ch) { if(temp->left==NULL) return temp; search(temp->left,ch);} else { if(temp->right==NULL) return temp; search(temp->right,ch); } } void display(node *temp) { if(temp==NULL) return ; display(temp->left); cout<<temp->data << " "; display(temp->right); } node * pop(node *p) { int ch; ch=stk[top-1]; if(p->data==ch) { top--; return p; } if(p->data>ch) pop(p->left); else pop(p->right); } }; 94
  • 95. Advanced C Programming void main() { tree t1; int ch,n,i; clrscr(); while(1) { cout <<"n1.INSERTn2.POPn3.DISPLAYn4.EXITnEnter your choice:"; cin >> ch; switch(ch) { case 1: cout <<"enter no of elements to insert:"; cout<<"n enter the elements"; cin >> n; for(i=1;i<=n;i++) { cin >> ch; t1.insert(ch); } break; case 2: t1.pop(); break; case 3: t1.display(t1.root);break; case 4: exit(1); } } } 1.INSERT 2.POP 3.DISPLAY 4.EXIT Enter your choice:1 enter no of elements to insert: enter the elements7 5 24 36 11 44 2 21 1.INSERT 2.POP 3.DISPLAY 4.EXIT Enter your choice:3 2 5 11 21 24 36 44 1.INSERT 2.POP 3.DISPLAY 4.EXIT Enter your choice2 2 11 21 24 36 44 1.INSERT 2.POP 3.DISPLAY 4.EXIT 4.EXITEnter your choice:4 95
  • 96. Advanced C Programming Optimal Binary Search Tree #include<iostream.h> #include<conio.h> #include<stdio.h> #define MAX 10 int find(int i,int j); void print(int,int); int p[MAX],q[MAX],w[10][10],c[10][10],r[10][10],i,j,k,n,m; char idnt[7][10]; void main() { clrscr(); cout << "enter the no, of identifiers"; cin >>n; cout <<"enter identifiers"; for(i=1;i<=n;i++) gets(idnt[i]); cout <<"enter success propability for identifiers"; for(i=1;i<=n;i++) cin >>p[i]; cout << "enter failure propability for identifiers"; for(i=0;i<=n;i++) cin >> q[i]; for(i=0;i<=n;i++) { w[i][i]=q[i]; c[i][i]=r[i][i]=0; w[i][i+1]=q[i]+q[i+1]+p[i+1]; r[i][i+1]=i+1; c[i][i+1]=q[i]+q[i+1]+p[i+1]; } w[n][n]=q[n]; r[n][n]=c[n][n]=0; for(m=2;m<=n;m++) { for(i=0;i<=n-m;i++) { j=i+m; w[i][j]=w[i][j-1]+p[j]+q[j]; k=find(i,j); r[i][j]=k; c[i][j]=w[i][j]+c[i][k-1]+c[k][j]; } 96
  • 97. Advanced C Programming } cout <<"n"; print(0,n); } int find(int i,int j) { int min=2000,m,l; for(m=i+1;m<=j;m++) if(c[i][m-1]+c[m][j]<min) { min=c[i][m-1]+c[m][j]; l=m; } return l; } void print(int i,int j) { if(i<j) puts(idnt[r[i][j]]); else return; print(i,r[i][j]-1); print(r[i][j],j); } OUTPUT enter the no, of identifiers4 enter identifiersdo if int while enter success propability for identifiers3 3 1 1 enter failure propability for identifiers2 3 1 1 1 tree in preorder form if do int while 97
  • 98. Advanced C Programming Viva Voice Questions 1. What is the difference between an ARRAY and a LIST? 2. What is faster : access the element in an ARRAY or in a LIST? 3. Define a constructor - what it is and how it might be called (2 methods). 4. Describe PRIVATE, PROTECTED and PUBLIC - the differences and give examples. 5. What is a COPY CONSTRUCTOR and when is it called (this is a frequent question !)? 6. Explain term POLIMORPHISM and give an example using eg. SHAPE object: If I have a base class SHAPE, how would I define DRAW methods for two objects CIRCLE and SQUARE. 7. What is the word you will use when defining a function in base class to allow this function to be a polimorphic function? 8. You have two pairs: new() and delete() and another pair : alloc() and free(). Explain differences between eg. new() and malloc() 9. Difference between “C structure” and “C++ structure”. 10. Diffrence between a “assignment operator” and a “copy constructor” 11. What is the difference between “overloading” and “overridding”? 12. Explain the need for “Virtual Destructor”. 13. Can we have “Virtual Constructors”? 14. What are the different types of polymorphism? 15. What are Virtual Functions? How to implement virtual functions in “C” 16. What are the different types of Storage classes? 17. What is Namespace? 98
  • 99. Advanced C Programming 18. Difference between “vector” and “array”? 19. How to write a program such that it will delete itself after exectution? 20. Can we generate a C++ source code from the binary file? 21. What are inline functions? 22. What is “strstream” ? 23. Explain “passing by value”, “passing by pointer” and “passing by reference” 24. Have you heard of “mutable” keyword? 25. Is there something that I can do in C and not in C++? 26. What is the difference between “calloc” and “malloc”? 27. What will happen if I allocate memory using “new” and free it using “free” or allocate sing “calloc” and free it using “delete”? 28. When shall I use Multiple Inheritance? 29. How to write Multithreaded applications using C++? 30. Write any small program that will compile in “C” but not in “C++” 31. What is Memory Alignment? 32. what is the difference between a tree and a graph? 33. How to insert an element in a binary search tree? 34. How to delete an element from a binary search tree? 35. How to search an element in a binary search tree? 36. what is the disadvantage in binary search tree? 37. what is ment by height balanced tree? 38. Give examples for height blanced tree? 39. What is a 2-3 tree? 99
  • 100. Advanced C Programming 40. what is a dictonary? 41.What is a binary search tree? 42. what is an AVL tree? 43. how height balancing is performed in AVL tree? 44. what is a Red Black tree? 45. what is difference between linked list and an array? 46. how dynamic memory allocation is performed in c++? 47. what are tree traversing techniques? 48. what are graph traversing techniques? 49. what is the technique in quick sort.? 50 what is the technique in merge sort? 51. what is data structure. 52. how to implement two stacks in an array? 53. what is ment by generic programming? 54. write the syntax for function templet? 55. write the syntax for class templet? 56. what is ment by stream? 57. what is the base class for all the streams? 58. how to create a file in c++? 59. how do you read a file in c++? 60. how do you write a file in c++? Finite- State Machines Derived from the on-line notes by Dr. Matt Stallmann & Suzanne Balik. 100
  • 101. Advanced C Programming A finite-state machine (FSM) is an abstract model of a system (physical, biological, mechanical, electronic, or software). An FSM consists of • • • • • States: a finite number of states that represent the internal "memory" of the system. Inputs to the system (e.g., a user doing something, a character read from the input) Transitions, which represent the "response" of the system to its environment. Transitions depend upon the current state of the machine as well as the current input and often result in a change of state. An initial state, which is the state the system is in before it accepts any input. Final states, states that represent a legal end to a transaction. Simple example: A soda- pop machine Consider an FSM that models a soda-pop machine that dispenses soda-pop for 30 cents. The possible inputs to the machine are n - nickel, d - dime, q - quarter, s - select soda. The states of the machine are designated by circles. Each state is labeled with the amount of money that has been deposited so far. State 00 is the initial or start state. This is indicated by the incoming arrow. States which represent a total input of 30 or more cents are considered final states and are designated by double circles. The transitions from state to state are shown as arcs (lines with arrows). Each transition is labeled with the input that caused it. Let’s take an example. Suppose the user inserts a sequence of coins … q takes the machine to state 25; another q takes it to state 50. It dispenses soda pop & change and transitions back to state 00. At this point, the user could select a drink. The machine would also have to give change. 101
  • 102. Advanced C Programming An FSM for an ATM A finite-state machine can also be used to model a simple automated teller machine (ATM). In this case, each transition is labeled with an input— • from the user (such as insert card), or • from a central database (such as PIN OK versus bad PIN). Each of the transitions may, in actuality, involve a number of complex steps which are not shown on the diagram. 102
  • 103. Advanced C Programming Recognizing input streams FSMs can also be used to precisely define programming-language syntax. Another application of finite-state machines is as a notation for the precise description of a programming language syntax. Consider this description of real constants in Pascal: A real number in PASCAL is written as a string of digits containing a decimal point. There must be at least one digit before and after the decimal point. 103
  • 104. Advanced C Programming Real data may also be represented using PASCAL scientific notation. A real data item written in scientific notation consists of a sign followed by a real number, followed by the letter E, another sign and an integer (+ signs may be omitted). The English description is imprecise. Are the strings .9 and 9. valid, or do you have to say 0.9 and 9.0, respectively? This FSM answers the question: A valid real constant in Pascal is any string that leads the FSM from the start state to a final (double-circled) state. What happens when we feed the FSM .9? Starts out in State 0. There’s no transition for a dot, so that’s an illegal input. What happens when we feed it 9.? Starts out in State 0, and then goes to State 2 and then to State 3. But that’s an error, because State 3 is not an accepting state. What about the string 9.0? Starts out in State 0, and then goes to State 2 and then to State 3, and then Step 4. This is an accepting state, so 9.0 is a legal real constant. (Note that .9 and 9. are valid floating-point constants in Java.) Text Processing with FSMs Finite-state machines are often used in text processing. The grep utility takes a string or regular expression and converts it to an FSM before doing a search. Simplifed example: Suppose a file consists of as and bs only and the search is for the string "abba". Here’s an FSM for doing this search: If, for example, this FSM were used to locate the string "abba" in a file containing "aababbbabba...", it would move through these states: Input: 104 a a b a b b b a b b a
  • 105. Advanced C Programming State: 0 1 1 2 1 2 3 0 1 2 3 4 The states listed above are the states of the machine after the corresponding input. When the final state 4 is reached, the search is successful. We say that the machine has recognized the string. Exercise: Design an FSM that recognizes a string consisting of alternating as and bs, beginning with an a. If the input consists of anything else (e.g., abababaab, the FSM should continue to read it but not recognize it. Here is how an FSM can be developed and translated directly into a program. Consider the following specifications: • A word is a maximal sequence of zero or more upper- and zero or more lower-case letters. Under this definition, what about the sequence "Go State!"? Is "State!" a word? No; it contains a punctuation mark. Is "tat" a word? No, because it is not maximal. How about "irregardless" Yes, because it’s a sequence of (0 or more) upper & lower-case letters. • wc is the word count, initially 0 • lc is the line count, initially 0 • cc is the character count, initially 0 Here’s an FSM to recognize "words." Note that each transition is labeled with an action as well as an input. In state 0, the FSM remembers that we're not currently in the middle of a word, while state 1 remembers that we are. Question: Why are there no final states in this FSM? It’s not trying to recognize anything; it’s just counting characters. An FSM’s behavior can also be specified by a table. Each row corresponds to a state Each column corresponds to an input symbol (or category of input symbols). The table version for the word counting FSM is given below. 105
  • 106. Advanced C Programming State 0 1 A–Z a–z 1: ++wc ++cc 1: ++cc n 0: ++lc, ++cc 0: ++lc, ++cc other 0: ++cc 0: ++cc A standard idiom for translating an FSM into a program is the while-switch idiom. • A while loop gets one character at a time from the input stream. • Inside the loop is a switch statement that causes different code to be executed based on the current state. Here is the code. import java.io.*; public class WordCounter{ public static void main(String[] args) { if (args.length == 1) { try { BufferedReader br = new BufferedReader( new FileReader(args[0])); int wc = 0, lc = 0, cc = 0; char ch; int state = 0; int next; while ((next = br.read()) != −1) { ch = (char) next; switch (state) { case 0: if ( ch == ’n’ ) { ++lc; ++cc; } else if ( Character.isLetter(ch) ) { state = 1; ++wc; ++cc; } else ++cc; break; case 1: if ( ch == ’n’ ) { state = 0; ++lc; ++cc; } else if ( Character.isLetter(ch) ) ++cc; else { state = 0; ++cc; 106
  • 107. Advanced C Programming } break; default: System.out.println("Invalid state: " + state); } } System.out.println( lc + "t" + wc + "t"+ cc); } catch(IOException e) { System.out.println("File error: " + e); System.out.println( "usage: java WordCounter filename"); } } else System.out.println("usage: java WordCounter filename"); } } Within each case, the program makes a decision based on the current input character. Simplifying the program The program can be simplifed by noting that— • ++cc is done on every transition, • whenever the current input is n we do ++lc and go to (or stay in) state 0, and • otherwise, the state and counters change only when a letter is encountered in state 0 or a character other than a letter (or a newline) is encountered in state 1. The simplified program looks like: import java.io.*; public class WordCounter{ public static void main(String[] args) { if (args.length == 1) { try { BufferedReader br = new BufferedReader( new FileReader(args[0])); int wc = 0, lc = 0, cc = 0; char ch; int state = 0; int next; while ((next = br.read()) != −1) { ch = (char) next; ++cc; if (ch == ‘n’) { ++lc; 107
  • 108. Advanced C Programming state = 0; } else if (state == 0 && Character.isLetter(ch)) { ++wc; state = 1; } else if (state == 1 && !Character.isLetter(ch)) { state = 0; } } System.out.println( lc + "t" + wc + "t"+ cc); } catch(IOException e) { System.out.println("File error: " + e); System.out.println( "usage: java WordCounter filename"); } } else System.out.println("usage: java WordCounter filename"); } } So FSMs can sometimes be "optimized" considerably. But, to avoid bugs, it is best to start with the straightforward implementation! Summary 1. Finite-state machines can be used to model the interaction between a system and its environment. 2. The state of an FSM remembers what has occurred so far. In addition to the FSM state, there may be variables that remember other details. The designer has to use judgment to decide what to model with an FSM state and what to leave as a variable. 3. A transition occurs when an event in the environment causes the system to change state (either the FSM state or variables). 4. A FSM can be depicted either by a bubble diagram or a transition table. 5. In text stream applications each transition corresponds to a single input character. 6. The while-switch idiom gives a method for mechanically translating a FSM to a program. Simplifications can be made by taking advantage of special features of the particular FSM. 108
  • 109. Advanced C Programming Real Time Kernel This is a project to implement a real-time kernel for the ARM processor. The main features of this kernel will be: 1) 2) 3) 4) 5) Priority based preemptive scheduling Dynamic creation and deletion of tasks. Provision for all types of synchronization mechanisms. Mechanism for large number of timers. A simple best user API. Prerequisites: The following skills are essential for implementing this project.: Operating System Concepts A students must have a thorough understanding of Operating Systems concepts. In case the students don’t have this knowledge, a one week course on OS fundamentals must be conducted by the guide which must cover the following topics: 1) 2) 3) 4) 5) 6) Scheduling Synchronization Mutual Exclusion I/O Management Process Management Memory Management The discussion must be slanted towards Real-time systems. And implementation points must be discussed. The following text books must used : Operating System Concepts : Silbersatcz and Galvin Operating System : Design and Implementation : Tannenbaumm and Wood hull C Programming in the Linux Environment The students must have a very good knowledge of C programming language as it is the language for the project implementation. Further , the students must have moderate familiarity with the Linux application development process. The usage of GCC,MAKE and VI editor must be known by the students. Compilation , Linking , Loading and Object Files Formats 109
  • 110. Advanced C Programming A familiarity with object file formats and compilation process is essential. If the students don’t have any knowledge in this field , then a 1 day session ca be taken by the guide. DESIGN OF THE KERNEL The following are the steps for running a kernel(The detailed steps are given in the project schedule) 1) BOOTING 2) SYSTEM INITIALISATION The steps are considered one by one : BOOTING Operating Systems are unlike other programs. It has to be put into memory by a separate program called boot-loader. It is because the kernel is the first program to run in the system. There should be an understanding between the boot loader and operating system. The is given in a standard called multi boot. In Linux GRUB is the boot loader program which implements the multi boot standard. We have to understand this standard if we have to boot out own kernel. The complete documentation of multi boot and GRUB is 1) Available on the Internet. 2) Available as online documentation on the Linux system[info grub]. SYSTEM INITIALIZATION After booting the system has to be initialized. First the memory has to be initialized. Next the interrupts have to be setup. Finally if there is hardware to be initialized it is done. In particular the Intel 80386 must be initialized as follows : (for the flat memory mode). 1) 2) 3) 4) 5) Disable all interrupts Setup GDT – kernel ‘s code, data, stack and other segments. Setup IDT – manage all exceptions and interrupts. Load GDT register and IDT register. Initialize Hardware – setup timer hardware to generate periodic interrupts. 6) Enable Interrupts. DATA STRUCTURES AND ALGORITHMS 110
  • 111. Advanced C Programming The objective of this section is to give a high level view of the realtime kernel. All algorithms to implement the kernel are not described. Some of the core algorithms are described. Usually in system’s software we have to design our data-structures first. The algorithms will naturally follow next(and will depend on the choice of the data structures) As an example if we choose a matrix data structure our scheduling algorithm will be different than if we choose a multilevel ready queue based data structure. Concepts : An RTOS is a basic component of realtime embedded systems.It must provide mechanisms for 1) Multitasking – the ability to run more than one task at once. 2) Scheduling - the ability to make sure that timing criteria is met. 3) Synchronization – the ability to co-ordinate the activities of diverse tasks. 4) Memory management – to efficiently allocate memory for tasks and the kernel itself. 5) Interrupt and Timer Management : - handle interrupts and timers efficiently. Block Diagram of a Real-time kernel USER TASKS MEMORY MANAGEMENT I/O SYSTEM INTER – TASK COMMUNICATION MECHANISMS SCHEDULER + TASK MANAGEMENT HARDWARE Functional Description of an RTOS Tasks 111 :
  • 112. Advanced C Programming A task is basic unit of execution. A task is represented by an execution sequence and shares all resources with other tasks.The only resource that distinguishes one task from another is the stack used to store all the local variables.The system must know all information about the task to schedule it.This crucial information is stored in a structure called TCB.The TCB stores information about its stack in the SCB (stack control block). The SCB stores information about a stack – its base pointer, the size and other information. The TCB stores various information related to a task like id,priority. A task also needs to know the entry point – the function with the task has to begin executing. These things are a minimum.There can be a lot more fields depending upon the complexity of the RTOS. Scheduler : A scheduler is the heart of the operating system.Its main job is to make tasks run.That is it selects a task and dispatches it.Since there is usually one CPU , we need to do context switching between the tasks. Context switching – that is saving the context of one task and restoring anothers‘ s the basic activity – and this involves pushing and popping CPU registers. This is very much processor dependent and is usually coded in assembly. Furthermore the scheduler must know at any instant of time all the tasks which are ready.Further more its has to know the highest priority task which is ready.For this it makes use of a multilevel queue – each queue holds tasks of particular priority.The scheduler chooses the task from the queue of the highest priority and schedules it.When the time period expires the task is preempted and the scheduler chooses the next ready task in the queue. Tasks can also wait for resources(eg : char from keyboard).During this time the scheduler schedules another task which is ready.The task will become ready when an interrupt occurs. Thus interrupts cause tasks to become ready.So the scheduler has to know is a higher priority task has become ready.If so it has to schedule it.Thus a mechanism is nessary for this. Also interrupts can be nested.So the scheduler must run only when all interrupt have been handled. SYNCHRONIZATION Classical synchronization mechanisms like semaphores,mutexes,message queue must be implemented. All these mechanisms make use of a central mechanism called a wait queue. A wait queue is a queue on which tasks wait for some event to happen. A wait queue can be used to implement any synchronization mechanism. Thus a semaphore can implemented by a integer and a wait queue. 112
  • 113. Advanced C Programming All tasks on the queue are waiting for the semaphore resource. Like wise we can implement a message queue with a reader wait queue and a writer wait queue. Synchronization is related with scheduling. And wait queues can be implemented as fifo ordered or priority ordered. This is important for real time kernels. A sample implementation of wait queues is provided by the Linux kernel. Data structures and API for synchronization mechanisms are given below. struct MsgQueue { // message queue data structure struct PQueue recvWait; struct PQueue sendWait; } struct MsgBuf { // message buffer }; void MsgSend(struct MsgQueue *pMsgQ,struct MsgBuf *pMsg); struct MsgBuf *MsgRecv(struct MsgQueue *pMsgQ); unsigned int MsgCount(struct MsgQueue *pMsgQ); struct Sem { // counting semaphore int value; struct PQueue semWait; }; struct Sem *SemCreate(void); void SemDelete(struct Sem *sem); int AcquireSem(struct Sem *sem); void ReleaseSem(struct Sem *sem); int SemValue(struct Sem *sem); struct BSem { // binary semaphore int state; struct PQueue bsemWait; }; struct BSem * BSemCreate(void); void BSemDelete(struct Sem *sem); int AcquireBSem(struct BSem *bsem); void ReleaseBSem(struct BSem *bsem); void BSemState(struct BSem *bsem); struct Mutex { // mutex semaphore int state; struct Process *owner; unsigned int ldepth; struct PQueue mutexWait; 113
  • 114. Advanced C Programming }; struct Mutex* MutexCreate(void); void MutexDelete(struct Mutex *mutex); int AcquireMutex(struct Mutex *mutex); void ReleaseMutex(struct Mutex *mutex); struct Event { int occured; struct PQueue evWait; }; int WaitEvent(struct Event *event); int SignalEvent(struct Event *event); int ResetEvent(struct Event *event); Interrupt Handling API for the RTOS Interrupts Interrupts are the way external devices notify the application of an event. Interrupt service routines are the running entities executed to process an interrupt. Interrupt generation is very CPU dependent, but falls into two general categories. Several interrupt levels are usually offered by the CPU, each one generating a separate exception vector, handled by a separate interrupt handler. Interrupts may share interrupt levels or vectors, therefore the code in the interrupt service routine (ISR) must make sure it’s own device generated the interrupt before attempting to process it. Some CPU architectures offer only one interrupt vector for all interrupt sources. In such a case, the hardware designer usually puts an interrupt controller chip between the devices and the CPU. It is up to the kernel implementor to write the general interrupt handler in such a way that it prioritizes the interrupts and dispatches the appropriate ISR. Only a minimal amount of work to process the interrupt should be performed inside the ISR. A task should then be signaled, which in turn performs lengthy computations to complete the I/O operation. The only mutual exclusion mechanism available between ISRs are the interrupt disabling primitives The implementation of these functions are highly CPU dependent. One some, interrupts are categorized among levels. On other’s, individual interrupt sources can/must be specified. Yet on others, it is only possible to disable all interrupts at once. In as much as possible, tasks and ISRs should only disable their own interrupts for mutual exclusion. All ISRs run at a higher priority than tasks. ISRs of the same priority are not time-sliced in a round-robin fashion. They run to completion unless interrupted by a higher priority interrupt. An ISR is restarted every time it is probable that it’s interrupt source generated the interrupt. 114
  • 115. Advanced C Programming void IntAttach(int intNo,void (*intHandler)(int intNo,void devID,struct Regs *regs)); int IntDetach(int intNo)(void); int IntEnable(int intNo); void IntDisable(int mask); void IntSetMask(int mask); int IntGetMask(void); MEMORY MANAGEMENT An RTOS does not use virtual memory for management of main memory. But tasks, stacks and other objects need memory. And so do user tasks to perform I/O. Thus a memory management scheme is needed to allocate and deallocate memory of fixed size and variable size. Various algorithms like first-fit , next-fit can be considered. But again we need to look into the real-time aspects of the algorithm – speed and determinacy. An extensive discussion of Kernel Memory Allocation is in [Vahalia]. One method of fast memory allocation is called caching : keep a queue of blocks of the same size. Allocate from the head of the queue. Deallocated blocks as added to the end of the queue. For fixed size objects use this scheme : this allows use memory from other caches. For other things use a first-fit allocator. We can switch to other advanced memory allocation techniques. In a RTOS we generally do not use virtual memory. Most memory is preallocated before the application starts and such preallocated blocks are called pools. The algorithm used to allocate memory from these pools may be first-fit or best-fit. Sometimes we may use cached buffers. F F F A F AAlklo Allocated 115 Free
  • 116. Advanced C Programming A easy way of memory allocation and deallocation is to use caches. The caches get their memory from a global memory area. The data structures and API is given below. struct ObjHeader { void *next; char objp[1]; }; struct MemPool { unsigned int objsize; int maxobjs; int objcount; struct ObjHeader *headObj; }; void *MemAlloc(struct MemPool *mpool,int priority); void MemFree(struct MemPool *mpool,void *objp); TASK IMPLEMENTATION A task is represented within the kernel by a struct Task. It contains all the information necessary to define a task. In other systems it is called as a TCB(Task control block). As an example consider : struct Task { struct Task *next; // see below volatile int state; // see below int priority; // 0 – 31 int taskId; void *stack_base; void *stack_top; void *stackp; int (*task_entry)(void *arg); void *task_arg; }; In a real implementation it would contain more fields. A Task can be in any one of the following states : #define #define #define #define READY RUNNING WAITING FINISHED 0 1 2 4 There is support for 32 priority levels : #define NPRIOS 32 116
  • 117. Advanced C Programming The state transition diagram from any OS – text book can reference. be used as a All struct Tasks are stored in Hash-table which permits rapid searching of tasks given their task id. The following data structures are used for the hash-table : struct Task *task_table[]; // hash – table An arrangement would look like the following : task_table[] struct Task +--------+ +------+ +------+ | |----->| |----->| |----| | | | | | | +--------+ +------+ +------+ | | | | +--------+ | | | . | | . | | . | +--------+ | |------>+------+-----| | | | | | +--------+ | | +------+ A perfect size can be determined for the task table, so that given a taskid we can quickly lookup for the strict Task. A task would look like the following : struct Task +----------------+ | | +------>+------+ stack_base | | | | | | | | | | | |---------+ | | <-- stack area | |---------+ | | | | | | | | | +------>+------+ stack_top | | | | | | +----------------+ 117
  • 118. Advanced C Programming Scheduler Implementation We need to support priority based preemptive scheduling. This means that it is guaranteed that the highest priority READY task will be running at anytime. The run queue is the main data structure used by the scheduler. It is an array of ready queues indexed by task priority – one for each priority. Pictorially : RunQueue +-------+ | |---->+------+--->+-------+---| | | | Proc | | Proc | | +-------+ +------+ +-------+ | | | | +-------+ | | | | +-------+ | | | | | | | | +-------+ | | | | +-------+ The first queue will consist of all the tasks whose priority is equal to zero. The next slot will point to a queue which has tasks of priority 1 and so on. Only ready tasks will be on the queues. The queues will be circular which makes insertion and deletion fast. The scheduler always selects the task on the first queue that is non empty and dispatches it. This ensures that the highest priority task will run first always. After interrupts are handled , a higher priority task may have become ready. So the scheduler has to run so that the higher priority tasks will run. There should be some way to know immediately which of the ready queue is nonempty. This is an implementation detail. Sample Data structures and Algorithms A queuing facility fundamental to an RTOS. 118
  • 119. Advanced C Programming Processes are queued and dequeued constantly to and from the run queues and wait queues. A simple circular fifo queue is the best data structure for these operations. struct PQElem { struct PQElem *next; struct Process *process; }; struct PQueue { Lock queueLock; int count; struct PQElem *lastElem; }; void void struct int InitQueue(struct PQueue *queue); AddQueue (struct PQueue *queue,struct Process *process); Process *DelQueue(struct PQueue *queue); GetCount (struct PQueue *queue); #define NPRIOS 32 // number of priority levels we are supporting. struct PQueue RunQueue[NPRIOS]; // the ready queue is an array of Timer Implementation Timers are mechanisms which are like stop-watches. It allows a task to wait until a certain time period , call a function after a time period a implement a timeout period. There are many ways of implementing timers. They are discussed in [Varg].A simplified version will be given. The fundamental requirement is that we need a hardware clock which interrupts at regular intervals. This can be done on the PC using the 8254 timer. For more details see [Messmer] volatile unsigned long jiffies; // incremented on every timer interrupt struct Timer { struct Timer *next; struct Timer *prev; int state; unsigned long expires; void (*timeout)(void *data); void *data; }; #define NTIMERS unsigned long tcount; struct Timer *timers[NTIMERS]; I/O Implementation We are not providing a extensive mechanism for I/O like device drivers and file system. Unix-like operating systems provide I/O interface through the 119
  • 120. Advanced C Programming file –system. Since we are not providing a file-system we cannot use this interface. Another mechanism is needed. The following I/O devices will be supported : 1) console and keyboard 2) serial I/O 3) timer and interrupt management. Console in the IBM-PC is a memory mapped device. To do output we need to write to the video memory which is mapped at 0x8000.The details are in [Messmer]. The keyboard is a interrupt driven device. We need to convert the scan code and break code to a ASCII value (a simple scheme) , so that we can input ASCII data. A simple terminal driver which processes (edits) character sequences can implemented on top of these drivers to provide standard input, output and error streams for Tasks. A shell can be implemented to test these drivers. 120