DSby Tanenbaum
DSby Tanenbaum
“C”
DATA STRUCTURES USING
“C”
LECTURE NOTES
Prepared by
Module – I
Introduction to data structures: storage structure for arrays, sparse matrices, Stacks and
Queues: representation and application. Linked lists: Single linked lists, linked list
representation of stacks and Queues. Operations on polynomials, Double linked list,
circular list.
Module – II
Dynamic storage management-garbage collection and compaction, infix to post fix
conversion, postfix expression evaluation. Trees: Tree terminology, Binary tree, Binary
search tree, General tree, B+ tree, AVL Tree, Complete Binary Tree representation,
Tree traversals, operation on Binary tree-expression Manipulation.
Module –III
Graphs: Graph terminology, Representation of graphs, path matrix, BFS (breadth first
search), DFS (depth first search), topological sorting, Warshall’s algorithm (shortest
path algorithm.) Sorting and Searching techniques – Bubble sort, selection sort,
Insertion sort, Quick sort, merge sort, Heap sort, Radix sort. Linear and binary search
methods, Hashing techniques and hash functions.
Text Books:
1. Gilberg and Forouzan: “Data Structure- A Pseudo code approach with C” by
Thomson publication
2. “Data structure in C” by Tanenbaum, PHI publication / Pearson publication.
3. Pai: ”Data Structures & Algorithms; Concepts, Techniques & Algorithms ”Tata
McGraw Hill.
Reference Books:
1. “Fundamentals of data structure in C” Horowitz, Sahani & Freed, Computer Science
Press.
2. “Fundamental of Data Structure” ( Schaums Series) Tata-McGraw-Hill.
CONTENTS
Arrays can be declared in various ways in different languages. For illustration, let's take
C array declaration.
As per the above illustration, following are the important points to be considered.
Index starts with 0.
Array length is 10 which means it can store 10 elements.
Each element can be accessed via its index. For example, we can fetch an
element at index 6 as 9.
Basic Operations
Following are the basic operations supported by an array.
Traverse − print all the array elements one by one.
Insertion − Adds an element at the given index.
Deletion − Deletes an element at the given index.
Search − Searches an element using the given index or by the value.
Update − Updates an element at the given index.
In C, when an array is initialized with size, then it assigns defaults values to its
elements in following order.
Data Type Default Value
bool false
char 0
int 0
float 0.0
double 0.0f
void
wchar_t 0
Insertion Operation
Insert operation is to insert one or more data elements into an array. Based on the
requirement, a new element can be added at the beginning, end, or any given index of
array.
Here, we see a practical implementation of insertion operation, where we add data at
the end of the array −
Algorithm
Let LA be a Linear Array (unordered) with N elements and K is a positive integer such
that K<=N. Following is the algorithm where ITEM is inserted into the K th position of LA
−
1. Start
2. Set J = N
3. Set N = N+1
4. Repeat steps 5 and 6 while J >= K
5. Set LA[J+1] = LA[J]
6. Set J = J-1
7. Set LA[K] = ITEM
8. Stop
Example
Following is the implementation of the above algorithm −
Live Demo
#include <stdio.h>
main() {
int LA[] = {1,3,5,7,8};
int item = 10, k = 3, n = 5;
int i = 0, j = n;
printf("The original array elements are :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA[i]);
}
n = n + 1;
while( j >= k) {
LA[j+1] = LA[j];
j = j - 1;
}
LA[k] = item;
printf("The array elements after insertion :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA[i]);
}
}
When we compile and execute the above program, it produces the following result −
Output
The original array elements are :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 7
LA[4] = 8
The array elements after insertion :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 10
LA[4] = 7
LA[5] = 8
Deletion Operation
Deletion refers to removing an existing element from the array and re-organizing all
elements of an array.
Algorithm
Consider LA is a linear array with N elements and K is a positive integer such
that K<=N. Following is the algorithm to delete an element available at the Kth position
of LA.
1. Start
2. Set J = K
3. Repeat steps 4 and 5 while J < N
4. Set LA[J] = LA[J + 1]
5. Set J = J+1
6. Set N = N-1
7. Stop
Example
Following is the implementation of the above algorithm −
Lve Demo
#include <stdio.h>
void main() {
int LA[] = {1,3,5,7,8};
int k = 3, n = 5;
int i, j;
printf("The original array elements are :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA[i]);
}
j = k;
while( j < n) {
LA[j-1] = LA[j];
j = j + 1;
}
n = n -1;
printf("The array elements after deletion :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA[i]);
}
}
When we compile and execute the above program, it produces the following result −
Output
The original array elements are :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 7
LA[4] = 8
The array elements after deletion :
LA[0] = 1
LA[1] = 3
LA[2] = 7
LA[3] = 8
Lecture-02
Search Operation
You can perform a search for an array element based on its value or its index.
Algorithm
Consider LA is a linear array with N elements and K is a positive integer such
that K<=N. Following is the algorithm to find an element with a value of ITEM using
sequential search.
1. Start
2. Set J = 0
3. Repeat steps 4 and 5 while J < N
4. IF LA[J] is equal ITEM THEN GOTO STEP 6
5. Set J = J +1
6. PRINT J, ITEM
7. Stop
Example
Following is the implementation of the above algorithm −
Live Demo
#include <stdio.h>
void main() {
int LA[] = {1,3,5,7,8};
int item = 5, n = 5;
int i = 0, j = 0;
printf("The original array elements are :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA[i]);
}
while( j < n){
if( LA[j] == item ) {
break;
}
j = j + 1;
}
printf("Found element %d at position %d\n", item, j+1);
}
When we compile and execute the above program, it produces the following result −
Output
The original array elements are :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 7
LA[4] = 8
Found element 5 at position 3
Update Operation
Update operation refers to updating an existing element from the array at a given index.
Algorithm
Consider LA is a linear array with N elements and K is a positive integer such
that K<=N. Following is the algorithm to update an element available at the K th position
of LA.
1. Start
2. Set LA[K-1] = ITEM
3. Stop
Example
Following is the implementation of the above algorithm −
Live Demo
#include <stdio.h>
void main() {
int LA[] = {1,3,5,7,8};
int k = 3, n = 5, item = 10;
int i, j;
printf("The original array elements are :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA[i]);
}
LA[k-1] = item;
printf("The array elements after updation :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA[i]);
}
}
When we compile and execute the above program, it produces the following result −
Output
The original array elements are :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 7
LA[4] = 8
The array elements after updation :
LA[0] = 1
LA[1] = 3
LA[2] = 10
LA[3] = 7
LA[4] = 8
Lecture-03
Sparse Matrix and its representations
A matrix is a two-dimensional data object made of m rows and n columns, therefore
having total m x n values. If most of the elements of the matrix have 0 value, then it is
called a sparse matrix.
Why to use Sparse Matrix instead of simple matrix ?
Storage: There are lesser non-zero elements than zeros and thus lesser
memory can be used to store only those elements.
Computing time: Computing time can be saved by logically designing a data
structure traversing only non-zero elements..
Example:
00304
00570
00000
02600
Representing a sparse matrix by a 2D array leads to wastage of lots of memory as
zeroes in the matrix are of no use in most of the cases. So, instead of storing zeroes
with non-zero elements, we only store non-zero elements. This means storing non-zero
elements with triples- (Row, Column, value).
Sparse Matrix Representations can be done in many ways following are two common
representations:
1. Array representation
2. Linked list representation
Method 1: Using Arrays
#include<stdio.h>
int main()
{
// Assume 4x5 sparse matrix
int sparseMatrix[4][5] =
{
{0 , 0 , 3 , 0 , 4 },
{0 , 0 , 5 , 7 , 0 },
{0 , 0 , 0 , 0 , 0 },
{0 , 2 , 6 , 0 , 0 }
};
int size = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
if (sparseMatrix[i][j] != 0)
size++;
int compactMatrix[3][size];
// Making of new matrix
int k = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
if (sparseMatrix[i][j] != 0)
{
compactMatrix[0][k] = i;
compactMatrix[1][k] = j;
compactMatrix[2][k] = sparseMatrix[i][j];
k++;
}
for (int i=0; i<3; i++)
{
for (int j=0; j<size; j++)
printf("%d ", compactMatrix[i][j]);
printf("\n");
}
return 0;
}
Lecture-04
STACK
A stack is an Abstract Data Type (ADT), commonly used in most programming languages. It is
named stack as it behaves like a real-world stack, for example – a deck of cards or a pile of
plates, etc.
A real-world stack allows operations at one end only. For example, we can place or remove a
card or plate from the top of the stack only. Likewise, Stack ADT allows all data operations at
one end only. At any given time, we can only access the top element of a stack.
This feature makes it LIFO data structure. LIFO stands for Last-in-first-out. Here, the element
which is placed (inserted or added) last, is accessed first. In stack terminology, insertion
operation is called PUSH operation and removal operation is called POP operation.
Stack Representation
The following diagram depicts a stack and its operations −
A stack can be implemented by means of Array, Structure, Pointer, and Linked List. Stack can
either be a fixed size one or it may have a sense of dynamic resizing. Here, we are going to
implement stack using arrays, which makes it a fixed size stack implementation.
Basic Operations
Stack operations may involve initializing the stack, using it and then de-initializing it. Apart from
these basic stuffs, a stack is used for the following two primary operations −
push() − Pushing (storing) an element on the stack.
pop() − Removing (accessing) an element from the stack.
When data is PUSHed onto stack.
To use a stack efficiently, we need to check the status of stack as well. For the same purpose,
the following functionality is added to stacks −
peek() − get the top data element of the stack, without removing it.
isFull() − check if stack is full.
isEmpty() − check if stack is empty.
At all times, we maintain a pointer to the last PUSHed data on the stack. As this pointer always
represents the top of the stack, hence named top. The top pointer provides top value of the
stack without actually removing it.
First we should learn about procedures to support stack functions −
peek()
Algorithm of peek() function −
begin procedure peek
return stack[top]
end procedure
Implementation of peek() function in C programming language −
Example
int peek() {
return stack[top];
}
isfull()
Algorithm of isfull() function −
begin procedure isfull
end procedure
Implementation of isfull() function in C programming language −
Example
bool isfull() {
if(top == MAXSIZE)
return true;
else
return false;
}
isempty()
Algorithm of isempty() function −
begin procedure isempty
end procedure
Implementation of isempty() function in C programming language is slightly different. We
initialize top at -1, as the index in array starts from 0. So we check if the top is below zero or -1
to determine if the stack is empty. Here's the code −
Example
bool isempty() {
if(top == -1)
return true;
else
return false;
}
Push Operation
The process of putting a new data element onto stack is known as a Push Operation. Push
operation involves a series of steps −
Step 1 − Checks if the stack is full.
Step 2 − If the stack is full, produces an error and exit.
Step 3 − If the stack is not full, increments top to point next empty space.
Step 4 − Adds data element to the stack location, where top is pointing.
Step 5 − Returns success.
If the linked list is used to implement the stack, then in step 3, we need to allocate space
dynamically.
Algorithm for PUSH Operation
A simple algorithm for Push operation can be derived as follows −
begin procedure push: stack, data
if stack is full
return null
endif
top ← top + 1
stack[top] ← data
end procedure
Implementation of this algorithm in C, is very easy. See the following code −
Example
void push(int data) {
if(!isFull()) {
top = top + 1;
stack[top] = data;
} else {
printf("Could not insert data, Stack is full.\n");
}
}
Pop Operation
Accessing the content while removing it from the stack, is known as a Pop Operation. In an
array implementation of pop() operation, the data element is not actually removed,
instead top is decremented to a lower position in the stack to point to the next value. But in
linked-list implementation, pop() actually removes data element and deallocates memory space.
A Pop operation may involve the following steps −
Step 1 − Checks if the stack is empty.
Step 2 − If the stack is empty, produces an error and exit.
Step 3 − If the stack is not empty, accesses the data element at which top is pointing.
Step 4 − Decreases the value of top by 1.
Step 5 − Returns success.
if stack is empty
return null
endif
data ← stack[top]
top ← top - 1
return data
end procedure
Implementation of this algorithm in C, is as follows −
Example
int pop(int data) {
if(!isempty()) {
data = stack[top];
top = top - 1;
return data;
} else {
printf("Could not retrieve data, Stack is empty.\n");
}
}
Lecture-05
Stack Applications
Three applications of stacks are presented here. These examples are central to many activities
that a computer must do and deserve time spent with them.
1. Expression evaluation
2. Backtracking (game playing, finding paths, exhaustive searching)
3. Memory management, run-time environment for nested language features.
Expression evaluation
In particular we will consider arithmetic expressions. Understand that there are boolean and
logical expressions that can be evaluated in the same way. Control structures can also be
treated similarly in a compiler.
This study of arithmetic expression evaluation is an example of problem solving where you solve
a simpler problem and then transform the actual problem to the simpler one.
Aside: The NP-Complete problem. There are a set of apparently intractable problems: finding
the shortest route in a graph (Traveling Salesman Problem), bin packing, linear programming,
etc. that are similar enough that if a polynomial solution is ever found (exponential solutions
abound) for one of these problems, then the solution can be applied to all problems.
Backtracking
Backtracking is used in algorithms in which there are steps along some path (state) from some
starting point to some goal.
Find your way through a maze.
Find a path from one point in a graph (roadmap) to another point.
Play a game in which there are moves to be made (checkers, chess).
In all of these cases, there are choices to be made among a number of options. We need some
way to remember these decision points in case we want/need to come back and try the
alternative
Consider the maze. At a point where a choice is made, we may discover that the choice leads
to a dead-end. We want to retrace back to that decision point and then try the other (next)
alternative.
Again, stacks can be used as part of the solution. Recursion is another, typically more favored,
solution, which is actually implemented by a stack.
Memory Management
Any modern computer environment uses a stack as the primary memory management model for
a running program. Whether it's native code (x86, Sun, VAX) or JVM, a stack is at the center of
the run-time environment for Java, C++, Ada, FORTRAN, etc.
The discussion of JVM in the text is consistent with NT, Solaris, VMS, Unix runtime
environments.
Each program that is running in a computer system has its own memory allocation containing
the typical layout as shown below.
Call and return process
When a method/function is called
1. An activation record is created; its size depends on the number and size of the local
variables and parameters.
2. The Base Pointer value is saved in the special location reserved for it
3. The Program Counter value is saved in the Return Address location
4. The Base Pointer is now reset to the new base (top of the call stack prior to the creation
of the AR)
5. The Program Counter is set to the location of the first bytecode of the method being
called
6. Copies the calling parameters into the Parameter region
7. Initializes local variables in the local variable region
While the method executes, the local variables and parameters are simply found by adding a
constant associated with each variable/parameter to the Base Pointer.
When a method returns
1. Get the program counter from the activation record and replace what's in the PC
2. Get the base pointer value from the AR and replace what's in the BP
3. Pop the AR entirely from the stack.
Lecture-06
QUEUE
Queue is an abstract data structure, somewhat similar to Stacks. Unlike stacks, a queue is open
at both its ends. One end is always used to insert data (enqueue) and the other is used to
remove data (dequeue). Queue follows First-In-First-Out methodology, i.e., the data item stored
first will be accessed first.
A real-world example of queue can be a single-lane one-way road, where the vehicle enters
first, exits first. More real-world examples can be seen as queues at the ticket windows and bus-
stops.
Queue Representation
As we now understand that in queue, we access both ends for different reasons. The following
diagram given below tries to explain queue representation as data structure −
As in stacks, a queue can also be implemented using Arrays, Linked-lists, Pointers and
Structures. For the sake of simplicity, we shall implement queues using one-dimensional array.
Basic Operations
Queue operations may involve initializing or defining the queue, utilizing it, and then completely
erasing it from the memory. Here we shall try to understand the basic operations associated
with queues −
enqueue() − add (store) an item to the queue.
dequeue() − remove (access) an item from the queue.
Few more functions are required to make the above-mentioned queue operation efficient. These
are −
peek() − Gets the element at the front of the queue without removing it.
isfull() − Checks if the queue is full.
isempty() − Checks if the queue is empty.
In queue, we always dequeue (or access) data, pointed by front pointer and while enqueing (or
storing) data in the queue we take help of rear pointer.
Let's first learn about supportive functions of a queue −
peek()
This function helps to see the data at the front of the queue. The algorithm of peek() function is
as follows −
Algorithm
begin procedure peek
return queue[front]
end procedure
Implementation of peek() function in C programming language −
Example
int peek() {
return queue[front];
}
isfull()
As we are using single dimension array to implement queue, we just check for the rear pointer
to reach at MAXSIZE to determine that the queue is full. In case we maintain the queue in a
circular linked-list, the algorithm will differ. Algorithm of isfull() function −
Algorithm
begin procedure isfull
end procedure
Implementation of isfull() function in C programming language −
Example
bool isfull() {
if(rear == MAXSIZE - 1)
return true;
else
return false;
}
isempty()
Algorithm of isempty() function −
Algorithm
begin procedure isempty
end procedure
If the value of front is less than MIN or 0, it tells that the queue is not yet initialized, hence
empty.
Here's the C programming code −
Example
bool isempty() {
if(front < 0 || front > rear)
return true;
else
return false;
}
Enqueue Operation
Queues maintain two data pointers, front and rear. Therefore, its operations are comparatively
difficult to implement than that of stacks.
The following steps should be taken to enqueue (insert) data into a queue −
Step 1 − Check if the queue is full.
Step 2 − If the queue is full, produce overflow error and exit.
Step 3 − If the queue is not full, increment rear pointer to point the next empty space.
Step 4 − Add data element to the queue location, where the rear is pointing.
Step 5 − return success.
Sometimes, we also check to see if a queue is initialized or not, to handle any unforeseen
situations.
Algorithm for enqueue operation
procedure enqueue(data)
if queue is full
return overflow
endif
rear ← rear + 1
queue[rear] ← data
return true
end procedure
Implementation of enqueue() in C programming language −
Example
int enqueue(int data)
if(isfull())
return 0;
rear = rear + 1;
queue[rear] = data;
return 1;
end procedure
Dequeue Operation
Accessing data from the queue is a process of two tasks − access the data where front is
pointing and remove the data after access. The following steps are taken to
perform dequeue operation −
Step 1 − Check if the queue is empty.
Step 2 − If the queue is empty, produce underflow error and exit.
Step 3 − If the queue is not empty, access the data where front is pointing.
Step 4 − Increment front pointer to point to the next available data element.
Step 5 − Return success.
data = queue[front]
front ← front + 1
return true
end procedure
Implementation of dequeue() in C programming language −
Example
int dequeue() {
if(isempty())
return 0;
return data;
}
Lecture-07
LINKED LIST
A linked list is a sequence of data structures, which are connected together via links.
Linked List is a sequence of links which contains items. Each link contains a connection
to another link. Linked list is the second most-used data structure after array. Following
are the important terms to understand the concept of Linked List.
Link − Each link of a linked list can store a data called an element.
Next − Each link of a linked list contains a link to the next link called Next.
LinkedList − A Linked List contains the connection link to the first link called
First.
Linked List Representation
Linked list can be visualized as a chain of nodes, where every node points to the next
node.
As per the above illustration, following are the important points to be considered.
Linked List contains a link element called first.
Each link carries a data field(s) and a link field called next.
Each link is linked with its next link using its next link.
Last link carries a link as null to mark the end of the list.
Types of Linked List
Following are the various types of linked list.
Simple Linked List − Item navigation is forward only.
Doubly Linked List − Items can be navigated forward and backward.
Circular Linked List − Last item contains link of the first element as next and
the first element has a link to the last element as previous.
Basic Operations
Following are the basic operations supported by a list.
Insertion − Adds an element at the beginning of the list.
Deletion − Deletes an element at the beginning of the list.
Display − Displays the complete list.
Search − Searches an element using the given key.
Delete − Deletes an element using the given key.
Insertion Operation
Adding a new node in linked list is a more than one step activity. We shall learn this
with diagrams here. First, create a node using the same structure and find the location
where it has to be inserted.
Imagine that we are inserting a node B (NewNode), between A (LeftNode)
and C (RightNode). Then point B.next to C −
NewNode.next −> RightNode;
It should look like this −
Now, the next node at the left should point to the new node.
LeftNode.next −> NewNode;
This will put the new node in the middle of the two. The new list should look like this −
Similar steps should be taken if the node is being inserted at the beginning of the list.
While inserting it at the end, the second last node of the list should point to the new
node and the new node will point to NULL.
Deletion Operation
Deletion is also a more than one step process. We shall learn with pictorial
representation. First, locate the target node to be removed, by using searching
algorithms.
The left (previous) node of the target node now should point to the next node of the
target node −
LeftNode.next −> TargetNode.next;
This will remove the link that was pointing to the target node. Now, using the following
code, we will remove what the target node is pointing at.
TargetNode.next −> NULL;
We need to use the deleted node. We can keep that in memory otherwise we can
simply deallocate memory and wipe off the target node completely.
Reverse Operation
This operation is a thorough one. We need to make the last node to be pointed by the
head node and reverse the whole linked list.
First, we traverse to the end of the list. It should be pointing to NULL. Now, we shall
make it point to its previous node −
We have to make sure that the last node is not the lost node. So we'll have some temp
node, which looks like the head node pointing to the last node. Now, we shall make all
left side nodes point to their previous nodes one by one.
Except the node (first node) pointed by the head node, all nodes should point to their
predecessor, making them their new successor. The first node will point to NULL.
We'll make the head node point to the new first node by using the temp node.
struct node {
int data;
int key;
struct node *next;
};
struct node *head = NULL;
struct node *current = NULL;
printf(" ]");
}
link->key = key;
link->data = data;
int length() {
int length = 0;
struct node *current;
return length;
}
return current;
}
void sort() {
tempKey = current->key;
current->key = next->key;
next->key = tempKey;
}
current = current->next;
next = next->next;
}
}
}
void main() {
insertFirst(1,10);
insertFirst(2,20);
insertFirst(3,30);
insertFirst(4,1);
insertFirst(5,40);
insertFirst(6,56);
//print list
printList();
while(!isEmpty()) {
struct node *temp = deleteFirst();
printf("\nDeleted value:");
printf("(%d,%d) ",temp->key,temp->data);
}
if(foundLink != NULL) {
printf("Element found: ");
printf("(%d,%d) ",foundLink->key,foundLink->data);
printf("\n");
} else {
printf("Element not found.");
}
delete(4);
printf("List after deleting an item: ");
printList();
printf("\n");
foundLink = find(4);
if(foundLink != NULL) {
printf("Element found: ");
printf("(%d,%d) ",foundLink->key,foundLink->data);
printf("\n");
} else {
printf("Element not found.");
}
printf("\n");
sort();
reverse(&head);
printf("\nList after reversing the data: ");
printList();
}
If we compile and run the above program, it will produce the following result −
Output
Original List:
[ (6,56) (5,40) (4,1) (3,30) (2,20) (1,10) ]
Deleted value:(6,56)
Deleted value:(5,40)
Deleted value:(4,1)
Deleted value:(3,30)
Deleted value:(2,20)
Deleted value:(1,10)
List after deleting all items:
[]
Restored List:
[ (6,56) (5,40) (4,1) (3,30) (2,20) (1,10) ]
Element found: (4,1)
List after deleting an item:
[ (6,56) (5,40) (3,30) (2,20) (1,10) ]
Element not found.
List after sorting the data:
[ (1,10) (2,20) (3,30) (5,40) (6,56) ]
List after reversing the data:
[ (6,56) (5,40) (3,30) (2,20) (1,10) ]
Lecture-08
Polynomial List
A polynomial p(x) is the expression in variable x which is in the form (ax n + bxn-1 + …. +
jx+ k), where a, b, c …., k fall in the category of real numbers and 'n' is non negative
integer, which is called the degree of polynomial.
An important characteristics of polynomial is that each term in the polynomial
expression consists of two parts:
one is the coefficient
other is the exponent
Example:
10x2 + 26x, here 10 and 26 are coefficients and 2, 1 are its exponential value.
Points to keep in Mind while working with Polynomials:
The sign of each coefficient and exponent is stored within the coefficient and the
exponent itself
Additional terms having equal exponent is possible one
The storage allocation for each term in the polynomial must be done in
ascending and descending order of their exponent
Representation of Polynomial
Polynomial can be represented in the various ways. These are:
By the use of arrays
By the use of Linked List
Representation of Polynomials using Arrays
There may arise some situation where you need to evaluate many polynomial
expressions and perform basic arithmetic operations like: addition and subtraction with
those numbers. For this you will have to get a way to represent those polynomials. The
simple way is to represent a polynomial with degree 'n' and store the coefficient of n+1
terms of the polynomial in array. So every array element will consists of two values:
Coefficient and
Exponent
Representation of Polynomial Using Linked Lists
A polynomial can be thought of as an ordered list of non zero terms. Each non zero
term is a two tuple which holds two pieces of information:
The exponent part
The coefficient part
Adding two polynomials using Linked List
Given two polynomial numbers represented by a linked list. Write a function that add
these lists means add the coefficients who have same variable powers.
Example:
Input:
1st number = 5x^2 + 4x^1 + 2x^0
2nd number = 5x^1 + 5x^0
Output:
5x^2 + 9x^1 + 7x^0
Input:
1st number = 5x^3 + 4x^2 + 2x^0
2nd number = 5x^1 + 5x^0
Output:
5x^3 + 4x^2 + 5x^1 + 7x^0
struct Node
int coeff;
int pow;
};
z = *temp;
if(z == NULL)
r->coeff = x;
r->pow = y;
*temp = r;
r = r->next;
r->next = NULL;
else
r->coeff = x;
r->pow = y;
r->next = (struct Node*)malloc(sizeof(struct Node));
r = r->next;
r->next = NULL;
void polyadd(struct Node *poly1, struct Node *poly2, struct Node *poly)
poly->pow = poly1->pow;
poly->coeff = poly1->coeff;
poly1 = poly1->next;
poly->pow = poly2->pow;
poly->coeff = poly2->coeff;
poly2 = poly2->next;
else
poly->pow = poly1->pow;
poly->coeff = poly1->coeff+poly2->coeff;
poly1 = poly1->next;
poly2 = poly2->next;
poly = poly->next;
poly->next = NULL;
while(poly1->next || poly2->next)
if(poly1->next)
poly->pow = poly1->pow;
poly->coeff = poly1->coeff;
poly1 = poly1->next;
if(poly2->next)
poly->pow = poly2->pow;
poly->coeff = poly2->coeff;
poly2 = poly2->next;
poly = poly->next;
poly->next = NULL;
}
}
while(node->next != NULL)
node = node->next;
if(node->next != NULL)
printf(" + ");
int main()
create_node(5,2,&poly1);
create_node(4,1,&poly1);
create_node(2,0,&poly1);
create_node(5,1,&poly2);
create_node(5,0,&poly2);
show(poly1);
show(poly2);
poly = (struct Node *)malloc(sizeof(struct Node));
show(poly);
return 0;
Output:
After insertion, T is the last node so pointer last points to node T. And Node T is first
and last node, so T is pointing to itself.
Function to insert node in an empty List,
struct Node *addToEmpty(struct Node *last, int data)
{
// This function is only for empty list
if (last != NULL)
return last;
// Creating a node dynamically.
struct Node *last =
(struct Node*)malloc(sizeof(struct Node));
return last;
}
Run on IDE
After insertion,
return last;
}
After insertion,
return last;
}
cout << item << " not present in the list." << endl;
return last;
}
Module-2:
Lecture-11
Memory Allocation-
Whenever a new node is created, memory is allocated by the system. This memory is
taken from list of those memory locations which are free i.e. not allocated. This list is
called AVAIL List. Similarly, whenever a node is deleted, the deleted space becomes
reusable and is added to the list of unused space i.e. to AVAIL List. This unused space
can be used in future for memory allocation.
Memory allocation is of two types-
1. Static Memory Allocation
2. Dynamic Memory Allocation
1 #include<stdio.h>
2 char stack[20];
3 int top = -1;
4 void push(char x)
5 {
6 stack[++top] = x;
7 }
8
9 char pop()
10 {
11 if(top == -1)
12 return -1;
13 else
14 return stack[top--];
15 }
16
17 int priority(char x)
18 {
19 if(x == '(')
20 return 0;
21 if(x == '+' || x == '-')
22 return 1;
23 if(x == '*' || x == '/')
24 return 2;
25 }
26
27 main()
28 {
29 char exp[20];
30 char *e, x;
31 printf("Enter the expression :: ");
32 scanf("%s",exp);
33 e = exp;
34 while(*e != '\0')
35 {
36 if(isalnum(*e))
37 printf("%c",*e);
38 else if(*e == '(')
39 push(*e);
40 else if(*e == ')')
41 {
42 while((x = pop()) != '(')
43 printf("%c", x);
44 }
45 else
46 {
47 while(priority(stack[top]) >= priority(*e))
48 printf("%c",pop());
49 push(*e);
50 }
51 e++;
52 }
53 while(top != -1)
54 {
55 printf("%c",pop());
56 }
57 }
OUTPUT:
1 #include<stdio.h>
2 int stack[20];
4 void push(int x)
5 {
6 stack[++top] = x;
7 }
9 int pop()
10 {
11 return stack[top--];
12 }
13
14 int main()
15 {
16 char exp[20];
17 char *e;
18 int n1,n2,n3,num;
20 scanf("%s",exp);
21 e = exp;
22 while(*e != '\0')
23 {
24 if(isdigit(*e))
25 {
26 num = *e - 48;
27 push(num);
28 }
29 else
30 {
31 n1 = pop();
32 n2 = pop();
33 switch(*e)
34 {
35 case '+':
36 {
37 n3 = n1 + n2;
38 break;
39 }
40 case '-':
41 {
42 n3 = n2 - n1;
43 break;
44 }
45 case '*':
46 {
47 n3 = n1 * n2;
48 break;
49 }
50 case '/':
51 {
52 n3 = n2 / n1;
53 break;
54 }
55 }
56 push(n3);
57 }
58 e++;
59 }
61 return 0;
62
63 }
64
Output:
Binary Tree
A binary tree consists of a finite set of nodes that is either empty, or consists of one
specially designated node called the root of the binary tree, and the elements of two
disjoint binary trees called the left subtree and right subtree of the root.
Note that the definition above is recursive: we have defined a binary tree in terms of
binary trees. This is appropriate since recursion is an innate characteristic of tree
structures.
Diagram 1: A binary tree
Tree terminology is generally derived from the terminology of family trees (specifically,
the type of family tree called a lineal chart).
Each root is said to be the parent of the roots of its subtrees.
Two nodes with the same parent are said to be siblings; they are the children of
their parent.
The root node has no parent.
A great deal of tree processing takes advantage of the relationship between a
parent and its children, and we commonly say a directed edge (or simply
an edge) extends from a parent to its children. Thus edges connect a root with
the roots of each subtree. An undirected edge extends in both directions between
a parent and a child.
Grandparent and grandchild relations can be defined in a similar manner; we
could also extend this terminology further if we wished (designating nodes as
cousins, as an uncle or aunt, etc.).
The number of subtrees of a node is called the degree of the node. In a binary
tree, all nodes have degree 0, 1, or 2.
A node of degree zero is called a terminal node or leaf node.
A non-leaf node is often called a branch node.
The degree of a tree is the maximum degree of a node in the tree. A binary tree
is degree 2.
A directed path from node n1 to nk is defined as a sequence of nodes n1, n2,
..., nk such that ni is the parent of ni+1 for 1 <= i < k. An undirected path is a
similar sequence of undirected edges. The length of this path is the number of
edges on the path, namely k – 1 (i.e., the number of nodes – 1). There is a path
of length zero from every node to itself. Notice that in a binary tree there is
exactly one path from the root to each node.
The level or depth of a node with respect to a tree is defined recursively: the level
of the root is zero; and the level of any other node is one higher than that of its
parent. Or to put it another way, the level or depth of a node ni is the length of the
unique path from the root to ni.
The height of ni is the length of the longest path from ni to a leaf. Thus all leaves
in the tree are at height 0.
The height of a tree is equal to the height of the root. The depth of a tree is equal
to the level or depth of the deepest leaf; this is always equal to the height of the
tree.
If there is a directed path from n1 to n2, then n1 is an ancestor of n2 and n2 is a
descendant of n1.
Lecture-14
Array Representation
For a complete or almost complete binary tree, storing the binary tree as an array may
be a good choice.
One way to do this is to store the root of the tree in the first element of the array. Then,
for each node in the tree that is stored at subscript k, the node's left child can be stored
at subscript 2k+1 and the right child can be stored at subscript 2k+2. For example, the
almost complete binary tree shown in Diagram 2 can be stored in an array like so:
However, if this scheme is used to store a binary tree that is not complete or almost
complete, we can end up with a great deal of wasted space in the array.
For example, the following binary tree
Linked Representation
If a binary tree is not complete or almost complete, a better choice for storing it is to use
a linked representation similar to the linked list structures covered earlier in the
semester:
Each tree node has two pointers (usually named left and right). The tree class has a
pointer to the root node of the tree (labeled root in the diagram above).
Any pointer in the tree structure that does not point to a node will normally contain the
value NULL. A linked tree with N nodes will always contain N + 1 null links.
Lecture-15
Tree Traversal:
Traversal is a process to visit all the nodes of a tree and may print their values too.
Because, all nodes are connected via edges (links) we always start from the root
(head) node. That is, we cannot randomly access a node in a tree. There are three
ways which we use to traverse a tree −
In-order Traversal
Pre-order Traversal
Post-order Traversal
Generally, we traverse a tree to search or locate a given item or key in the tree or to
print all the values it contains.
In-order Traversal
In this traversal method, the left subtree is visited first, then the root and later the right
sub-tree. We should always remember that every node may represent a subtree itself.
If a binary tree is traversed in-order, the output will produce sorted key values in an
ascending order.
We start from A, and following in-order traversal, we move to its left subtree B. B is
also traversed in-order. The process goes on until all the nodes are visited. The output
of inorder traversal of this tree will be −
D→B→E→A→F→C→G
Algorithm
Pre-order Traversal
In this traversal method, the root node is visited first, then the left subtree and finally
the right subtree.
We start from A, and following pre-order traversal, we first visit A itself and then move
to its left subtree B. B is also traversed pre-order. The process goes on until all the
nodes are visited. The output of pre-order traversal of this tree will be −
A→B→D→E→C→F→G
Algorithm
We start from A, and following Post-order traversal, we first visit the left subtree B. B is
also traversed post-order. The process goes on until all the nodes are visited. The
output of post-order traversal of this tree will be −
D→E→B→F→G→C→A
Algorithm
Yes
Examination shows
that each left sub-tree
has a height 1 greater
than each right sub-
tree.
No
Sub-tree with root 8 has
height 4 and sub-tree
with root 18 has height
2
Insertion
As with the red-black tree, insertion is somewhat complex and involves a number of
cases. Implementations of AVL tree insertion may be found in many textbooks: they rely
on adding an extra attribute, the balance factor to each node. This factor indicates
whether the tree is left-heavy (the height of the left sub-tree is 1 greater than the right
sub-tree), balanced (both sub-trees are the same height) or right-heavy(the height of the
right sub-tree is 1 greater than the left sub-tree). If the balance would be destroyed by
an insertion, a rotation is performed to correct the balance.
A new item has been
added to the left subtree
of node 1, causing its
height to become 2
greater than 2's right sub-
tree (shown in green). A
right-rotation is performed
to correct the imbalance.
Lecture-17
B+-tree
A B+-tree requires that each leaf be the same distance from the root, as in this picture,
where searching for any of the 11 values (all listed on the bottom level) will involve
loading three nodes from the disk (the root block, a second-level block, and a leaf).
In practice, d will be larger — as large, in fact, as it takes to fill a disk block. Suppose a
block is 4KB, our keys are 4-byte integers, and each reference is a 6-byte file offset.
Then we'd choose d to be the largest value so that 4 (d − 1) + 6 d ≤ 4096; solving this
inequality for d, we end up with d ≤ 410, so we'd use 410 for d. As you can see, d can
be large.
A B+-tree maintains the following invariants:
Every node has one more references than it has keys.
All leaves are at the same distance from the root.
For every non-leaf node N with k being the number of keys in N: all keys in the
first child's subtree are less than N's first key; and all keys in the ith child's
subtree (2 ≤ i ≤ k) are between the (i − 1)th key of n and the ith key of n.
The root has at least two children.
Every non-leaf, non-root node has at least floor(d / 2) children.
Each leaf contains at least floor(d / 2) keys.
Every key from the table appears in a leaf, in left-to-right sorted order.
In our examples, we'll continue to use 4 for d. Looking at our invariants, this requires
that each leaf have at least two keys, and each internal node to have at least two
children (and thus at least one key).
2. Insertion algorithm
Descend to the leaf where the key fits.
1. If the node has an empty space, insert the key/reference pair into the node.
2. If the node is already full, split it into two nodes, distributing the keys evenly
between the two nodes. If the node is a leaf, take a copy of the minimum value in
the second of these two nodes and repeat this insertion algorithm to insert it into
the parent node. If the node is a non-leaf, exclude the middle value during the
split and repeat this insertion algorithm to insert this excluded value into the
parent node.
Initial:
Insert 20:
Insert 13:
Insert 15:
Insert 10:
Insert 11:
Insert 12:
3. Deletion algorithm
Delete 13:
Delete 15:
Delete 1:
Expression Trees:
Trees are used in many other ways in the computer science. Compilers and database
are two major examples in this regard. In case of compilers, when the languages are
translated into machine language, tree-like structures are used. We have also seen an
example of expression tree comprising the mathematical expression. Let’s have more
discussion on the expression trees. We will see what are the benefits of expression
trees and how can we build an expression tree. Following is the figure of an expression
tree.
In the above tree, the expression on the left side is a + b * c while on the right side, we
have d * e + f * g. If you look at the figure, it becomes evident that the inner nodes
contain operators while leaf nodes have operands. We know that there are two types of
nodes in the tree i.e. inner nodes and leaf nodes. The leaf nodes are such nodes which
have left and right subtrees as null. You will find these at the bottom level of the tree.
The leaf nodes are connected with the inner nodes. So in trees, we have some inner
nodes and some leaf nodes.
In the above diagram, all the inner nodes (the nodes which have either left or right child
or both) have operators. In this case, we have + or * as operators. Whereas leaf nodes
contain operands only i.e. a, b, c, d, e, f, g. This tree is binary as the operators are
binary. We have discussed the evaluation of postfix and infix expressions and have
seen that the binary operators need two operands. In the infix expressions, one operand
is on the left side of the operator and the other is on the right side. Suppose, if we have
+ operator, it will be written as 2 + 4. However, in case of multiplication, we will write as
5*6. We may have unary operators like negation (-) or in Boolean expression we have
NOT. In this example, there are all the binary operators. Therefore, this tree is a binary
tree. This is not the Binary Search Tree. In BST, the values on the left side of the nodes
are smaller and the values on the right side are greater than the node. Therefore, this is
not a BST. Here we have an expression tree with no sorting process involved.
This is not necessary that expression tree is always binary tree. Suppose we have a
unary operator like negation. In this case, we have a node which has (-) in it and there is
only one leaf node under it. It means just negate that operand.
Let’s talk about the traversal of the expression tree. The inorder traversal may be
executed here.
Lecture-18
Binary Search Tree (BST)
A Binary Search Tree (BST) is a tree in which all the nodes follow the below-mentioned
properties −
The left sub-tree of a node has a key less than or equal to its parent node's key.
The right sub-tree of a node has a key greater than to its parent node's key.
Thus, BST divides all its sub-trees into two segments; the left sub-tree and the right
sub-tree and can be defined as −
Representation
BST is a collection of nodes arranged in a way where they maintain BST properties.
Each node has a key and an associated value. While searching, the desired key is
compared to the keys in BST and if found, the associated value is retrieved.
Following is a pictorial representation of BST −
We observe that the root node key (27) has all less-valued keys on the left sub-tree
and the higher valued keys on the right sub-tree.
Basic Operations
Following are the basic operations of a tree −
Search − Searches an element in a tree.
Insert − Inserts an element in a tree.
Pre-order Traversal − Traverses a tree in a pre-order manner.
In-order Traversal − Traverses a tree in an in-order manner.
Post-order Traversal − Traverses a tree in a post-order manner.
Node
Define a node having some data, references to its left and right child nodes.
struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
Search Operation
Whenever an element is to be searched, start searching from the root node. Then if the
data is less than the key value, search for the element in the left subtree. Otherwise,
search for the element in the right subtree. Follow the same algorithm for each node.
Algorithm
while(current->data != data){
if(current != NULL) {
printf("%d ",current->data);
//not found
if(current == NULL){
return NULL;
}
}
}
return current;
}
Insert Operation
Whenever an element is to be inserted, first locate its proper location. Start searching
from the root node, then if the data is less than the key value, search for the empty
location in the left subtree and insert the data. Otherwise, search for the empty location
in the right subtree and insert the data.
Algorithm
tempNode->data = data;
tempNode->leftChild = NULL;
tempNode->rightChild = NULL;
if(current == NULL) {
parent->leftChild = tempNode;
return;
}
} //go to right of the tree
else {
current = current->rightChild;
4
Visit D and mark it as visited
and put onto the stack. Here,
we have B and C nodes,
which are adjacent to D and
both are unvisited. However,
we shall again choose in an
alphabetical order.
We choose B, mark it as
visited and put onto the stack.
Here Bdoes not have any
unvisited adjacent node. So,
we pop Bfrom the stack.
6
As C does not have any unvisited adjacent node so we keep popping the stack until we
find a node that has an unvisited adjacent node. In this case, there's none and we keep
popping until the stack is empty.
Lecture-21
Breadth First Search
Breadth First Search (BFS) algorithm traverses a graph in a breadthward motion and
uses a queue to remember to get the next vertex to start a search, when a dead end
occurs in any iteration.
As in the example given above, BFS algorithm traverses from A to B to E to F first then
to C and G lastly to D. It employs the following rules.
Rule 1 − Visit the adjacent unvisited vertex. Mark it as visited. Display it. Insert it
in a queue.
Rule 2 − If no adjacent vertex is found, remove the first vertex from the queue.
Rule 3 − Repeat Rule 1 and Rule 2 until the queue is empty.
We start from
visiting S(starting node), and
mark it as visited.
3
We then see an unvisited
adjacent node from S. In this
example, we have three nodes
but alphabetically we
choose A, mark it as visited
and enqueue it.
From A we have D as
unvisited adjacent node. We
mark it as visited and enqueue
it.
At this stage, we are left with no unmarked (unvisited) nodes. But as per the algorithm
we keep on dequeuing in order to get all unvisited nodes. When the queue gets
emptied, the program is over.
Lecture-22
Graph representation
You can represent a graph in many ways. The two most common ways of representing
a graph is as follows:
Adjacency matrix
An adjacency matrix is a VxV binary matrix A. Element Ai,j is 1 if there is an edge from
vertex i to vertex j else Ai,jis 0.
Note: A binary matrix is a matrix in which the cells can have only one of two possible
values - either a 0 or 1.
The adjacency matrix can also be modified for the weighted graph in which instead of
storing 0 or 1 in Ai,j, the weight or cost of the edge will be stored.
In an undirected graph, if Ai,j = 1, then Aj,i = 1. In a directed graph, if Ai,j = 1,
then Aj,i may or may not be 1.
Adjacency matrix provides constant time access (O(1) ) to determine if there is an
edge between two nodes. Space complexity of the adjacency matrix is O(V2).
The adjacency matrix of the following graph is:
i/j : 1 2 3 4
1:0101
2:1010
3:0101
4:1010
Consider the same undirected graph from an adjacency matrix. The adjacency list of the
graph is as follows:
A1 → 2 → 4
A2 → 1 → 3
A3 → 2 → 4
A4 → 1 → 3
Consider the same directed graph from an adjacency matrix. The adjacency list of the
graph is as follows:
A1 → 2
A2 → 4
A3 → 1 → 4
A4 → 2
Lecture-23
Topological Sorting:
Topological sorting for Directed Acyclic Graph (DAG) is a linear ordering of vertices
such that for every directed edge uv, vertex u comes before v in the
ordering. Topological Sorting for a graph is not possible if the graph is not a DAG.
For example, a topological sorting of the following graph is “5 4 2 3 1 0”. There can be
more than one topological sorting for a graph. For example, another topological sorting
of the following graph is “4 5 2 3 1 0”. The first vertex in topological sorting is always a
vertex with in-degree as 0 (a vertex with no in-coming edges).
Algorithm to find Topological Sorting:
In DFS, we start from a vertex, we first print it and then recursively call DFS for its
adjacent vertices. In topological sorting, we use a temporary stack. We don’t print the
vertex immediately, we first recursively call topological sorting for all its adjacent
vertices, then push it to a stack. Finally, print contents of stack. Note that a vertex is
pushed to stack only when all of its adjacent vertices (and their adjacent vertices and so
on) are already in stack.
Topological Sorting vs Depth First Traversal (DFS):
In DFS, we print a vertex and then recursively call DFS for its adjacent vertices. In
topological sorting, we need to print a vertex before its adjacent vertices. For example,
in the given graph, the vertex ‘5’ should be printed before vertex ‘0’, but unlike DFS, the
vertex ‘4’ should also be printed before vertex ‘0’. So Topological sorting is different
from DFS. For example, a DFS of the shown graph is “5 2 3 1 0 4”, but it is not a
topological sorting
Dynamic Programming
The Floyd Warshall Algorithm is for solving the All Pairs Shortest Path problem. The
problem is to find shortest distances between every pair of vertices in a given edge
weighted directed Graph.
Example:
Input:
graph[][] = { {0, 5, INF, 10},
{INF, 0, 3, INF},
{INF, INF, 0, 1},
{INF, INF, INF, 0} }
which represents the following graph
10
(0)------->(3)
| /|\
5| |
| |1
\|/ |
(1)------->(2)
3
Note that the value of graph[i][j] is 0 if i is equal to j
And graph[i][j] is INF (infinite) if there is no edge from vertex i to j.
Output:
Shortest distance matrix
0 5 8 9
INF 0 3 4
INF INF 0 1
INF INF INF 0
Floyd Warshall Algorithm
We initialize the solution matrix same as the input graph matrix as a first step. Then we
update the solution matrix by considering all vertices as an intermediate vertex. The
idea is to one by one pick all vertices and update all shortest paths which include the
picked vertex as an intermediate vertex in the shortest path. When we pick vertex
number k as an intermediate vertex, we already have considered vertices {0, 1, 2, .. k-1}
as intermediate vertices. For every pair (i, j) of source and destination vertices
respectively, there are two possible cases.
1) k is not an intermediate vertex in shortest path from i to j. We keep the value of
dist[i][j] as it is.
2) k is an intermediate vertex in shortest path from i to j. We update the value of dist[i][j]
as dist[i][k] + dist[k][j].
The following figure shows the above optimal substructure property in the all-pairs
shortest path problem.
Lecture-24
Bubble Sort
We take an unsorted array for our example. Bubble sort takes Ο(n 2) time so we're
keeping it short and precise.
Bubble sort starts with very first two elements, comparing them to check which one is
greater.
In this case, value 33 is greater than 14, so it is already in sorted locations. Next, we
compare 33 with 27.
We find that 27 is smaller than 33 and these two values must be swapped.
Next we compare 33 and 35. We find that both are in already sorted positions.
We know then that 10 is smaller 35. Hence they are not sorted.
We swap these values. We find that we have reached the end of the array. After one
iteration, the array should look like this −
To be precise, we are now showing how an array should look like after each iteration.
After the second iteration, it should look like this −
Notice that after each iteration, at least one value moves at the end.
And when there's no swap required, bubble sorts learns that an array is completely
sorted.
return list
end BubbleSort
Pseudocode
We observe in algorithm that Bubble Sort compares each pair of array element unless
the whole array is completely sorted in an ascending order. This may cause a few
complexity issues like what if the array needs no more swapping as all the elements
are already ascending.
To ease-out the issue, we use one flag variable swapped which will help us see if any
swap has happened or not. If no swap has occurred, i.e. the array requires no more
processing to be sorted, it will come out of the loop.
Pseudocode of BubbleSort algorithm can be written as follows −
procedure bubbleSort( list : array of items )
loop = list.count;
end for
end for
It finds that both 14 and 33 are already in ascending order. For now, 14 is in sorted
sub-list.
It swaps 33 with 27. It also checks with all the elements of sorted sub-list. Here we see
that the sorted sub-list has only one element 14, and 27 is greater than 14. Hence, the
sorted sub-list remains sorted after swapping.
By now we have 14 and 27 in the sorted sub-list. Next, it compares 33 with 10.
So we swap them.
We swap them again. By the end of third iteration, we have a sorted sub-list of 4 items.
This process goes on until all the unsorted values are covered in a sorted sub-list. Now
we shall see some programming aspects of insertion sort.
Algorithm
Now we have a bigger picture of how this sorting technique works, so we can derive
simple steps by which we can achieve insertion sort.
Step 1 − If it is the first element, it is already sorted. return 1;
Step 2 − Pick next element
Step 3 − Compare with all elements in the sorted sub-list
Step 4 − Shift all the elements in the sorted sub-list that is greater than the
value to be sorted
Step 5 − Insert the value
Step 6 − Repeat until list is sorted
Pseudocode
procedure insertionSort( A : array of items )
int holePosition
int valueToInsert
for i = 1 to length(A) inclusive do:
valueToInsert = A[i]
holePosition = i
end for
end procedure
Lecture-26
Selection Sort
Consider the following depicted array as an example.
For the first position in the sorted list, the whole list is scanned sequentially. The first
position where 14 is stored presently, we search the whole list and find that 10 is the
lowest value.
So we replace 14 with 10. After one iteration 10, which happens to be the minimum
value in the list, appears in the first position of the sorted list.
For the second position, where 33 is residing, we start scanning the rest of the list in a
linear manner.
We find that 14 is the second lowest value in the list and it should appear at the second
place. We swap these values.
After two iterations, two least values are positioned at the beginning in a sorted
manner.
The same process is applied to the rest of the items in the array.
Following is a pictorial depiction of the entire sorting process −
Now, let us learn some programming aspects of selection sort.
Algorithm
for i = 1 to n - 1
/* set current element as minimum*/
min = i
for j = i+1 to n
if list[j] < list[min] then
min = j;
end if
end for
end procedure
Lecture-27
Merge Sort
To understand merge sort, we take an unsorted array as the following −
We know that merge sort first divides the whole array iteratively into equal halves
unless the atomic values are achieved. We see here that an array of 8 items is divided
into two arrays of size 4.
This does not change the sequence of appearance of items in the original. Now we
divide these two arrays into halves.
We further divide these arrays and we achieve atomic value which can no more be
divided.
Now, we combine them in exactly the same manner as they were broken down. Please
note the color codes given to these lists.
We first compare the element for each list and then combine them into another list in a
sorted manner. We see that 14 and 33 are in sorted positions. We compare 27 and 10
and in the target list of 2 values we put 10 first, followed by 27. We change the order of
19 and 35 whereas 42 and 44 are placed sequentially.
In the next iteration of the combining phase, we compare lists of two data values, and
merge them into a list of found data values placing all in a sorted order.
After the final merging, the list should look like this −
Algorithm
Merge sort keeps on dividing the list into equal halves until it can no more be divided.
By definition, if it is only one element in the list, it is sorted. Then, merge sort combines
the smaller sorted lists keeping the new list sorted too.
Step 1 − if it is only one element in the list it is already sorted, return.
Step 2 − divide the list recursively into two halves until it can no more be divided.
Step 3 − merge the smaller lists into new list in sorted order.
Merge sort works with recursion and we shall see our implementation in the same way.
procedure mergesort( var a as array )
if ( n == 1 ) return a
var l1 as array = a[0] ... a[n/2]
var l2 as array = a[n/2+1] ... a[n]
l1 = mergesort( l1 )
l2 = mergesort( l2 )
return merge( l1, l2 )
end procedure
procedure merge( var a as array, var b as array )
var c as array
while ( a and b have elements )
if ( a[0] > b[0] )
add b[0] to the end of c
remove b[0] from b
else
add a[0] to the end of c
remove a[0] from a
end if
end while
The pivot value divides the list into two parts. And recursively, we find the pivot for
each sub-lists until all lists contains only one element.
Quick Sort Pivot Algorithm
Based on our understanding of partitioning in quick sort, we will now try to write an
algorithm for it, which is as follows.
Step 1 − Choose the highest index value has pivot
Step 2 − Take two variables to point left and right of the list excluding pivot
Step 3 − left points to the low index
Step 4 − right points to the high
Step 5 − while value at left is less than pivot move right
Step 6 − while value at right is greater than pivot move left
Step 7 − if both step 5 and step 6 does not match swap left and right
Step 8 − if left ≥ right, the point where they met is new pivot
Quick Sort Pivot Pseudocode
The pseudocode for the above algorithm can be derived as −
function partitionFunc(left, right, pivot)
leftPointer = left
rightPointer = right - 1
while True do
while A[++leftPointer] < pivot do
//do-nothing
end while
end while
swap leftPointer,right
return leftPointer
end function
Quick Sort Algorithm
Using pivot algorithm recursively, we end up with smaller possible partitions. Each
partition is then processed for quick sort. We define recursive algorithm for quicksort as
follows −
Step 1 − Make the right-most index value pivot
Step 2 − partition the array using pivot value
Step 3 − quicksort left partition recursively
Step 4 − quicksort right partition recursively
Quick Sort Pseudocode
To get more into it, let see the pseudocode for quick sort algorithm −
procedure quickSort(left, right)
if right-left <= 0
return
else
pivot = A[right]
partition = partitionFunc(left, right, pivot)
quickSort(left,partition-1)
quickSort(partition+1,right)
end if
end procedure
Lecture-29
Heap Sort
Heap sort is a comparison based sorting technique based on Binary Heap data
structure. It is similar to selection sort where we first find the maximum element and
place the maximum element at the end. We repeat the same process for remaining
element.
What is Binary Heap?
Let us first define a Complete Binary Tree. A complete binary tree is a binary tree in
which every level, except possibly the last, is completely filled, and all nodes are as far
left as possible
A Binary Heap is a Complete Binary Tree where items are stored in a special order
such that value in a parent node is greater(or smaller) than the values in its two children
nodes. The former is called as max heap and the latter is called min heap. The heap
can be represented by binary tree or array.
Why array based representation for Binary Heap?
Since a Binary Heap is a Complete Binary Tree, it can be easily represented as array
and array based representation is space efficient. If the parent node is stored at index I,
the left child can be calculated by 2 * I + 1 and right child by 2 * I + 2 (assuming the
indexing starts at 0).
Heap Sort Algorithm for sorting in increasing order:
Heapify procedure can be applied to a node only if its children nodes are heapified. So
the heapification must be performed in the bottom up order.
Lets understand with the help of an example:
Input data: 4, 10, 3, 5, 1
4(0)
/ \
10(1) 3(2)
/ \
5(3) 1(4)
We can’t use counting sort because counting sort will take O(n 2) which is worse than
comparison based sorting algorithms. Can we sort such an array in linear time?
Radix Sort is the answer. The idea of Radix Sort is to do digit by digit sort starting from
least significant digit to most significant digit. Radix sort uses counting sort as a
subroutine to sort.
Lecture-30
Radix Sort
1) Do following for each digit i where i varies from least significant digit to the most
significant digit.
………….a) Sort input array using counting sort (or any stable sort) according to the i’th
digit.
Example:
Original, unsorted list:
170, 45, 75, 90, 802, 24, 2, 66
Sorting by least significant digit (1s place) gives: [*Notice that we keep 802 before 2,
because 802 occurred before 2 in the original list, and similarly for pairs 170 & 90 and
45 & 75.]
170, 90, 802, 2, 24, 45, 75, 66
Sorting by next digit (10s place) gives: [*Notice that 802 again comes before 2 as 802
comes before 2 in the previous list.]
802, 2, 24, 45, 66, 170, 75, 90
Sorting by most significant digit (100s place) gives:
2, 24, 45, 66, 75, 90, 170, 802
What is the running time of Radix Sort?
Let there be d digits in input integers. Radix Sort takes O(d*(n+b)) time where b is the
base for representing numbers, for example, for decimal system, b is 10. What is the
value of d? If k is the maximum possible value, then d would be O(log b(k)). So overall
time complexity is O((n+b) * logb(k)). Which looks more than the time complexity of
comparison based sorting algorithms for a large k. Let us first limit k. Let k <= nc where
c is a constant. In that case, the complexity becomes O(nLog b(n)). But it still doesn’t
beat comparison based sorting algorithms.
Linear Search
Linear search is to check each element one by one in sequence. The following
method linearSearch() searches a target in an array and returns the index of the target; if
not found, it returns -1, which indicates an invalid index.
1 int linearSearch(int arr[], int target)
2 {
3 for (int i = 0; i < arr.length; i++)
4 {
5 if (arr[i] == target)
6 return i;
7 }
8 return -1;
9 }
Linear search loops through each element in the array; each loop body takes constant
time. Therefore, it runs in linear time O(n).
Lecture-31
Binary Search
For sorted arrays, binary search is more efficient than linear search. The process starts
from the middle of the input array:
If the target equals the element in the middle, return its index.
If the target is larger than the element in the middle, search the right half.
If the target is smaller, search the left half.
In the following binarySearch() method, the two index variables first and last indicates the
searching boundary at each round.
1 int binarySearch(int arr[], int target)
2 {
3 int first = 0, last = arr.length - 1;
4
5 while (first <= last)
6 {
7 int mid = (first + last) / 2;
8 if (target == arr[mid])
9 return mid;
10 if (target > arr[mid])
11 first = mid + 1;
12 else
13 last = mid - 1;
14 }
15 return -1;
16 }
1 arr: {3, 9, 10, 27, 38, 43, 82}
2
3 target: 10
4 first: 0, last: 6, mid: 3, arr[mid]: 27 -- go left
5 first: 0, last: 2, mid: 1, arr[mid]: 9 -- go right
6 first: 2, last: 2, mid: 2, arr[mid]: 10 -- found
7
8 target: 40
9 first: 0, last: 6, mid: 3, arr[mid]: 27 -- go right
10 first: 4, last: 6, mid: 5, arr[mid]: 43 -- go left
11 first: 4, last: 4, mid: 4, arr[mid]: 38 -- go right
12 first: 5, last: 4 -- not found
Binary search divides the array in the middle at each round of the loop. Suppose the
array has length n and the loop runs in t rounds, then we have n * (1/2)^t = 1 since at
each round the array length is divided by 2. Thus t = log(n). At each round, the loop
body takes constant time. Therefore, binary search runs in logarithmic time O(log n).
The following code implements binary search using recursion. To call the method, we
need provide with the boundary indexes, for example,
binarySearch(arr, 0, arr.length - 1, target);
1
2 binarySearch(int arr[], int first, int last, int target)
3 {
4 if (first > last)
5 return -1;
6
7 int mid = (first + last) / 2;
8
9 if (target == arr[mid])
10 return mid;
11 if (target > arr[mid])
12 return binarySearch(arr, mid + 1, last, target);
13 // target < arr[mid]
14 return binarySearch(arr, first, mid - 1, target);
15 }
Lecture-32
Hashing
Introduction
When we put objects into a hashtable, it is possible that different objects (by
the equals() method) might have the same hashcode. This is called a collision. Here is
the example of collision. Two different strings ""Aa" and "BB" have the same key: .
"Aa" = 'A' * 31 + 'a' = 2112
"BB" = 'B' * 31 + 'B' = 2112
The big attraction of using a hash table is a constant-time performance for the basic
operations add, remove, contains, size. Though, because of collisions, we cannot guarantee
the constant runtime in the worst-case. Why? Imagine that all our objects collide into the
same index. Then searching for one of them will be equivalent to searching in a list, that
takes a liner runtime. However, we can guarantee an expected constant runtime, if we
make sure that our lists won't become too long. This is usually implemnted by
maintaining a load factor that keeps a track of the average length of lists. If a load factor
approaches a set in advanced threshold, we create a bigger array and rehash all
elements from the old table into the new one.
Another technique of collision resolution is a linear probing. If we cannoit insert at index
k, we try the next slot k+1. If that one is occupied, we go to k+2, and so on.
Lecture-33
Hashing Functions
Choosing a good hashing function, h(k), is essential for hash-table based
searching. h should distribute the elements of our collection as uniformly as possible to
the "slots" of the hash table. The key criterion is that there should be a minimum
number of collisions.
If the probability that a key, k, occurs in our collection is P(k), then if there are m slots in
our hash table, a uniform hashing function, h(k), would ensure:
Sometimes, this is easy to ensure. For example, if the keys are randomly distributed in
(0,r], then,
h(k) = floor((mk)/r)
will provide uniform hashing.
Mapping keys to natural numbers
Most hashing functions will first map the keys to some set of natural numbers, say (0,r].
There are many ways to do this, for example if the key is a string of ASCII characters,
we can simply add the ASCII representations of the characters mod 255 to produce a
number in (0,255) - or we could xor them, or we could add them in pairs mod 2 16-1, or
...
Having mapped the keys to a set of natural numbers, we then have a number of
possibilities.
1. Use a mod function:
h(k) = k mod m.
When using this method, we usually avoid certain values of m. Powers of 2 are
usually avoided, for k mod 2b simply selects the b low order bits of k. Unless we
know that all the 2b possible values of the lower order bits are equally likely, this
will not be a good choice, because some bits of the key are not used in the hash
function.
Prime numbers which are close to powers of 2 seem to be generally good
choices for m.
For example, if we have 4000 elements, and we have chosen an overflow table
organization, but wish to have the probability of collisions quite low, then we
might choose m = 4093. (4093 is the largest prime less than 4096 = 2 12.)
2. Use the multiplication method:
o Multiply the key by a constant A, 0 < A < 1,
o Extract the fractional part of the product,
o Multiply this value by m.
Thus the hash function is:
h(k) = floor(m * (kA - floor(kA)))
In this case, the value of m is not critical and we typically choose a power of 2 so
that we can get the following efficient procedure on most digital computers:
o Choose m = 2p.
o Multiply the w bits of k by floor(A * 2w) to obtain a 2w bit product.
o Extract the p most significant bits of the lower half of this product.
It seems that:
A = (sqrt(5)-1)/2 = 0.6180339887
is a good choice (see Knuth, "Sorting and Searching", v. 3 of "The Art of
Computer Programming").
3. Use universal hashing:
A malicious adversary can always chose the keys so that they all hash to the
same slot, leading to an average O(n) retrieval time. Universal hashing seeks to
avoid this by choosing the hashing function randomly from a collection of hash
functions (cf Cormen et al, p 229- ). This makes the probability that the hash
function will generate poor behaviour small and produces good average
performance.
Scilab Textbook Companion for
Data Structures Using C And C++
by Y. Langsam, M. Augenstein And A. M.
Tenenbaum1
Created by
Dharmesh Majethiya
B.Tech (pursuing)
Computer Engineering
NIT Tiruchirappalli
College Teacher
Mr.Kunwar Singh
Cross-Checked by
Siddharth Jain
Edition: 2
Year: 2006
ISBN: 81-203-1177-9
1
Scilab numbering policy used in this document and the relation to the
above book.
For example, Exa 3.51 means solved example 3.51 of this book. Sec 2.3 means
a scilab code whose theory is explained in Section 2.3 of the book.
2
Contents
2 Stacks 21
3 Recursion 33
5 Trees 65
6 Sorting 79
7 Searching 86
8 Graphs 89
3
List of Scilab Codes
4
Exa 4.2 Implementing Queue Operarions . . . . . . . . . . . . 45
Exa 4.3 Implementing Circular Linked List . . . . . . . . . . . 46
Exa 4.4 Implementing Doubly connected Linked List . . . . . . 50
Exa 4.5 Implementing Stack using circular Linked list . . . . . 55
Exa 4.6 Implementing Priority Queue Using Lists . . . . . . . 61
Exa 5.1 Implementing Binary Tree . . . . . . . . . . . . . . . . 65
Exa 5.2 Tree Trversal Techniques . . . . . . . . . . . . . . . . 68
Exa 5.3 Implementing And traversing a Binary Search Tree . . 72
Exa 5.4 Checking the duplicate number using BST . . . . . . . 76
Exa 6.1 Bubble Sort . . . . . . . . . . . . . . . . . . . . . . . . 79
Exa 6.2 Quick Sort . . . . . . . . . . . . . . . . . . . . . . . . 80
Exa 6.3 Selection Sort . . . . . . . . . . . . . . . . . . . . . . . 80
Exa 6.4 Insertion Sort . . . . . . . . . . . . . . . . . . . . . . . 81
Exa 6.5 Shell sort . . . . . . . . . . . . . . . . . . . . . . . . . 81
Exa 6.6 Merge Sort . . . . . . . . . . . . . . . . . . . . . . . . 82
Exa 6.7 Binary Tree Sort . . . . . . . . . . . . . . . . . . . . . 84
Exa 7.1 Sequential Search . . . . . . . . . . . . . . . . . . . . 86
Exa 7.2 Sorted sequential search . . . . . . . . . . . . . . . . . 86
Exa 7.3 Binary Search . . . . . . . . . . . . . . . . . . . . . . 87
Exa 8.1 Simple Graph Functions . . . . . . . . . . . . . . . . . 89
Exa 8.2 Finding The Number Of Paths From One VertexToOther 90
Exa 8.3 Finding The Number Of Simple Paths From One Point 90
Exa 8.4 Finding Transitive Closure . . . . . . . . . . . . . . . 91
Exa 8.5 Warshalls Algorithm . . . . . . . . . . . . . . . . . . . 93
Exa 8.6 Depth First Search Traversal . . . . . . . . . . . . . . 94
Exa 8.7 BFS Traversal . . . . . . . . . . . . . . . . . . . . . . 95
Exa 8.8 Dijkstras Algorithm . . . . . . . . . . . . . . . . . . . 96
5
Chapter 1
Introduction To Data
Structures
1 // S o l v e d Example 1
2 // : To c a l c u a l t e A v e r a g e And D e v i a t i o n
3 function [ avg ]= average ( a )
4 i =1;
5 [j , k ]= size ( a ) ;
6 j =0;
7 for i =1: k
8 j=j+a(i);
9 end
10 avg = j / k ;
11 dev =0;
12 disp ( avg , ” A v e r a g e =” ) ;
13 disp ( ” The d e v i a t i o n s a r e : ” ) ;
14 for i =1: k
15 dev = a ( i ) - avg ;
16 disp ( dev ) ;
17 end
18 endfunction
19 // C a l l i n g r o u t i n e
6
20 a =[3 223 212 343]
21 avg = average ( a )
1 // E x e r c i s e 1 . 1 Example . 1 . 1 . 4
2 //To c a l c u l a t e D e c i m a l No . o f a g i v e n Number
3 // T r e a t i n g them a s i ) Normal b i n a r y n o s ( i i ) Twos
complemented i i i )BCD:
4 function [ c ]= twos1 ( a1 )
5 [ j1 , i1 ]= size ( a1 )
6 i4 =1
7 c = -( a1 ( i4 ) *2^( i1 -1) ) ;
8 i1 = i1 -1;
9 while ( i1 >=1)
10 i4 = i4 +1;
11 c = c + a1 ( i4 ) *2^( i1 -1) ;
12 i1 = i1 -1;
13 end
14 disp ( a1 , ” D e c i m a l form o f t h e Twos Complement
Number” ) ;
15 disp (c , ” i s ” ) ;
16 endfunction
17 function [ d ]= binary_dec ( a2 )
18 [ j2 , i2 ]= size ( a2 ) ;
19 k = modulo ( i2 ,4) ;
20 d =0;
21 if ( k ==0)
22 e = i2 /4;
23 i3 =1
24 while ( i3 <= i2 )
25 l =3
26 m =0
27 while (l >=0)
28 m = m +( a2 ( i3 ) *2^ l ) ;
7
29 l =l -1;
30 i3 = i3 +1;
31 end
32 if (m >9)
33 d = -1;
34 disp ( ” Cannot be c o d e d i n t h i s form ” )
35 break ;
36 end
37 if (m <=9)
38 d = d + m *10^( e -1)
39 e =e -1;
40 end
41 end
42 end
43 disp ( a2 , ” D e c i m a l form o f BCD number ” ) ;
44 disp (d , ” i s ” ) ;
45 endfunction
46 // Given Example :
47 // (A)
48 p1 =[1 0 0 1 1 0 0 1];
49 p2 = base2dec ([ ’ 1 0 0 1 1 0 0 1 ’ ] ,2)
50 p2 = twos1 ( p1 )
51 p2 = binary_dec ( p1 )
52 // ( b )
53 p3 =[1 0 0 1];
54 p4 = base2dec ([ ’ 1 0 0 1 ’ ] ,2)
55 p4 = twos1 ( p3 )
56 p4 = binary_dec ( p3 )
57 // (C)
58 p5 =[0 0 0 1 0 0 0 1 0 0 0 1];
59 p6 = base2dec ([ ’ 0 0 0 1 0 0 0 1 0 0 0 1 ’ ] ,2)
60 p6 = twos1 ( p5 )
61 p6 = binary_dec ( p5 )
62 // ( d )
63 p7 =[0 1 1 1 0 1 1 1];
64 p8 = base2dec ([ ’ 0 1 1 1 0 1 1 1 ’ ] ,2)
65 p8 = twos1 ( p7 )
66 p8 = binary_dec ( p7 )
8
67 // ( e )
68 p9 =[0 1 0 1 0 1 0 1];
69 p10 = base2dec ([ ’ 0 1 0 1 0 1 0 1 ’ ] ,2)
70 p10 = twos1 ( p9 )
71 p10 = binary_dec ( p9 )
72 // ( F )
73 p11 =[1 0 0 0 0 0 0 1 0 1 0 1];
74 p12 = base2dec ([ ’ 1 0 0 0 0 0 0 1 0 1 0 1 ’ ] ,2)
75 p12 = twos1 ( p11 )
76 p12 = binary_dec ( p11 )
Scilab code Exa 1.1.5 Add Substract And Multiply binary numbers
1 // E x e r c i s e 1 . 1 e x a m p l e 1 . 1 . 5
2 //Add , S u b s t r a c t And M u l t i p l y b i n a r y numbers
3 function [ a ]= add (b , c )
4 d = base2dec (b ,2)
5 e = base2dec (c ,2)
6 a=d+e
7 a = dec2bin ( a )
8 disp (a , ” R e s u l t o f a d d i t i o n ” )
9 endfunction
10 function [ a ]= subtract (b , c )
11 d = base2dec (b ,2)
12 e = base2dec (c ,2)
13 a =d - e
14 a = dec2bin ( a )
15 disp (a , ” R e s u l t o f s u b t r a c t i o n ” )
16 endfunction
17 function [ a ]= multiply (b , c )
18 d = base2dec (b ,2)
19 e = base2dec (c ,2)
20 a=d*e
21 a = dec2bin ( a )
22 disp (a , ” R e s u l t o f m u l t i p l i c a t i o n ”);
9
23 endfunction
24 // C a l l i n g R o u t i n e :
25 b=” 11001 ”;
26 c=” 10011 ”;
27 a = add (b , c )
28 a = subtract (b , c )
29 a = multiply (b , c )
1 // E x e r c i s e 1 . 1 Example 1 . 1 . 7
2 //TO C o n v e r t B i n a r y To T e r n a r y
3 function [ t ]= bin_ter ( a )
4 b =0
5 b = base2dec (a ,2) ;
6 disp ( b ) ;
7 [j , i ]= size ( a ) ;
8 t =[];
9 while ( b ~=0)
10 m = modulo (b ,3) ;
11 t =[ t (: ,:) m ];
12 b = b /3;
13 b =b - modulo (b ,10) ;
14 end
15 disp (t , ” T e r n a r y E q u i v a l e n t ” ) ;
16 endfunction
17 // C a l l i n g R o u t i n e :
18 a = ” 1 0 0 1 0 1 1 0 1 1 1 0 ”
19 disp (a , ” i n p u t s t r i n g i s ” ) ;
20 b = bin_ter ( a )
10
1 // S o l v e d Example 2
2 // : S t r i n g M a n i p u l a t i o n s
3 funcprot (0)
4 function [ l ]= strlen ( str )
5 i =1;
6 l =0;
7 [j , k ]= size ( str )
8 for i =1: k
9 l = l + length ( str ( i ) ) ;
10 end
11 disp (l , ” s t r i n g l e n g t h i s ” ) ;
12 endfunction
13 // C a l l i n g R o u t i n e :
14 str = ” H e l l o World ” ;
15 l = strlen ( str )
16 function [ c ]= strcat1 (a , b )
17 disp ( strcat ([ a b ]) ,” A f t e r c o n c a t i n a t i o n ” ) ;
18 c = strcat ([ a b ]) ;
19 endfunction
20 // C a l l i n g R o u t i n e :
21 a=” h e l l o ”;
22 b=” world ”;
23 c = strcat1 (a , b ) ;
1 // E x e r c i s e Example 1 . 2 . 1
2 // C a l c u l a t e s Median And Mode Of an Array
3 // (A)
4 function [ y ]= median1 ( a )
5 p = mtlb_sort ( a ) ;
6 [j , i ]= size ( a ) ;
7 y =0
8 j = modulo (i ,2) ;
9 if ( j ==0)
11
10 y =(( a ( i /2) + a ( i /2+1) ) /2) ;
11 end
12 if ( j ==1)
13 i = i /2;
14 i =i - modulo (i ,10) ;
15 y = a ( i +1) ;
16 end
17 disp (y , ” median i s ” ) ;
18 endfunction
19 // (B)
20 function [ z ]= mode1 ( a )
21 p = mtlb_sort ( a ) ;
22 disp ( p )
23 q =1;
24 r =1;
25 i =1;
26 [j , i1 ]= size ( a ) ;
27 if ( i1 >1)
28 for i =1: i1 -1
29 if ( p ( i ) ~= p ( i +1) )
30 q =[ q (: ,:) i +1];
31 r =[ r (: ,:) 1];
32 else
33 [c , d ]= size ( r ) ;
34 r ( d ) = r ( d ) +1;
35 end
36 end
37 q1 = mtlb_sort ( r ) ;
38 [j , i1 ]= size ( q1 )
39 if ( q1 ( i1 -1) == q1 ( i1 ) )
40 z = -1;
41 disp ( ”Mode d o e s n o t e x i s t ” ) ;
42 break ;
43 else
44 c = q1 ( i1 ) ;
45 k =1;
46 while ( r ( k ) ~= c )
47 k = k +1;
12
48 end
49 z=p(q(k));
50 end
51 end
52 if ( i1 ==1)
53 z = a (1) ;
54 end
55 disp (z , ” mode i s ” ) ;
56 endfunction
57 a =[223 12 233322 121]
58 y = median1 ( a ) ;
59 z = mode1 ( a ) ;
Scilab code Exa 1.2.6 Finding the adress in a row major array
1 // E x e r c i s e 1 . 2 Example 1 . 2 . 6
2 // F i n d i n g t h e a d r e s s i n a row m a j o r a r r a y
3 function []= add (m , n )
4 printf ( ” A d r e s s i s %d\n ” ,m + n *20) ;
5 endfunction
6
7 // ( a )
8 add (10 ,0) ;
9 // ( b )
10 add (100 ,0) ;
11 // ( c )
12 add (0 ,0) ;
13 // ( d )
14 add (2 ,1) ;
15 // ( e )
16 add (5 ,1) ;
17 // ( f )
18 add (1 ,10) ;
19 // ( g )
20 add (2 ,10) ;
13
21 // ( h )
22 add (5 ,3) ;
23 // ( i )
24 add (9 ,19) ;
Scilab code Exa 1.3 Writing name from structure and counting alphabets
1 // S o l v e d Example 5 :
2 // W r i t i n g a name from t h e g i v e n s t r u c t u r e and
3 // c o u n t i n g t h e number o f a l p h a b e t s p r i n t e d
4 function [ l ]= strlen ( str )
5 i =1;
6 l =0;
7 [j , k ]= size ( str )
8 for i =1: k
9 l = l + length ( str ( i ) ) ;
10 end
11 endfunction
12 function [ count ]= writename ( name )
13 printf ( ” \n ” ) ;
14 printf ( ”%s” , name . first ) ;
15 printf ( ”%c” , ’ ’ );
16 printf ( ”%s” , name . midinit ) ;
17 printf ( ” \ t ” ) ;
18 printf ( ”%s” , name . last ) ;
19 printf ( ” \n ” ) ;
20
21 a = string ( name . first ) ;
22 count = strlen ( a ) ;
23 a = string ( name . midinit ) ;
24 count = count + strlen ( a ) ;
25 a = string ( name . last ) ;
26 count = count + strlen ( a ) ;
27 disp ( count , ” Count i s : ” ) ;
28 endfunction
14
29 // C a l l i n g R o u t i n e
30 name = struct ( ’ f i r s t ’ , ’ p r a v e e n ’ , ’ m i d i n i t ’ , ’ r a j e e v ’ , ’
l a s t ’ , ’ chauhan ’ ) ;
31 count = writename ( name )
1 // E x e r c i s e 1 . 3
2 // Example 1 . 3 . 1
3 // I m p l e m e n t i n g Complex Numbers by s t r u c t u r e
4 function []= complexmanu ( x1 , x2 , x3 , x4 )
5
6 com1 = struct ( ’ r e a l ’ ,x1 , ’ c o m p l e x ’ , x2 ) ;
7 com2 = struct ( ’ r e a l ’ ,x3 , ’ c o m p l e x ’ , x4 ) ;
8 // a d d i n g 2 numbers
9 add = struct ( ’ r e a l ’ , x1 + x3 , ’ c o m p l e x ’ , x2 + x4 ) ;
10 disp ( add . complex , ”+ i ” , add . real , ” A d d i t i o n r e s u l t
i s ”);
11 // S u b s t r a c t
12 sub = struct ( ’ r e a l ’ ,x1 - x3 , ’ c o m p l e x ’ ,x2 - x4 ) ;
13 disp ( sub . complex , ”+ i ” , sub . real , ” S u b s t r a c t i o n
r e s u l t i s ”);
14 // N e g a t i n g
15 neg = struct ( ’ r e a l ’ ,-x1 , ’ c o m p l e x ’ ,- x2 ) ;
16 disp ( neg . complex , ”+ i ” , neg . real , ” N e g a t i o n r e s u l t
f o r the f i r s t i s ”);
17 // M u l t i p l i c a t i o n
18 mul = struct ( ’ r e a l ’ , x1 * x3 - x2 * x4 , ’ c o m p l e x ’ , x2 * x3 + x4 *
x1 ) ;
19 disp ( mul . complex , ”+ i ” , mul . real , ” M u l t i p l i c a t i o n
r e s u l t i s ”);
20 endfunction
21 x1 =3;
22 x2 =5;
23 x3 =5;
15
24 x4 =6;
25 complexmanu ( x1 , x2 , x3 , x4 ) ;
Scilab code Exa 1.3.6 Adding Substracting and multiplying Rational Nos
1 // E x e r c i s e 1 . 3
2 // Example 1 . 3 . 6
3 // Adding , S u b t r a c t i n g and m u l t i p l y i n g R a t i o n a l
Numbers
4 function []= rational ( x1 , x2 , x3 , x4 )
5 rational1 = struct ( ’ n u m e r a t o r ’ ,x1 , ’ d e n o m i n a t o r ’ , x2 ) ;
6 disp ( rational1 ) ;
7 rational2 = struct ( ’ n u m e r a t o r ’ ,x3 , ’ d e n o m i n a t o r ’ , x4 ) ;
8 disp ( rational2 ) ;
9 //Add
10 x5 = int32 ([ x2 x4 ]) ;
11 x5 = lcm ( x5 ) ;
12 x6 = x1 *( x5 / x2 ) + x3 *( x5 / x4 ) ;
13 rational3 = struct ( ’ n u m e r a t o r ’ ,x6 , ’ d e n o m i n a t o r ’ , x5 ) ;
14 disp ( rational3 , ” A f t e r a d d i t i o n ” ) ;
15 // s u b t r a c t
16 x6 = x1 *( x5 / x2 ) - x3 *( x5 / x4 )
17 rational4 = struct ( ’ n u m e r a t o r ’ ,x6 , ’ d e n o m i n a t o r ’ , x5 ) ;
18 disp ( rational4 , ” A f t e r S u b t r a c t i o n ” ) ;
19 // M u l t i p l y
20 x7 = x1 * x3 ;
21 x8 = x2 * x4 ;
22 rational5 = struct ( ’ n u m e r a t o r ’ ,x7 , ’ d e n o m i n a t o r ’ , x8 ) ;
23 disp ( rational5 , ” A f t e r m u l t i p l i c a t i o n ” ) ;
24 endfunction
25 x1 =43;
26 x2 =32;
27 x3 =233;
28 x4 =33;
29 rational ( x1 , x2 , x3 , x4 ) ;
16
Scilab code Exa 1.3.7 Checking Equality Of 2 Rational Numbers
1 // E x e r c i s e 1 . 3
2 // Example 1 . 3 . 7
3 // C h e c k i n g E q u a l i t y Of 2 R a t i o n a l Numbers Without
R e d u c i n g Them
4 function []= rational_equal ( x1 , x2 , x3 , x4 )
5 rational1 = struct ( ’ n u m e r a t o r ’ ,x1 , ’ d e n o m i n a t o r ’ , x2 ) ;
6 disp ( rational1 ) ;
7 rational2 = struct ( ’ n u m e r a t o r ’ ,x3 , ’ d e n o m i n a t o r ’ , x4 ) ;
8 disp ( rational2 ) ;
9 if ( x1 * x4 == x2 * x3 )
10 disp ( ” Equal ” ) ;
11 break ;
12 else
13 disp ( ” Not Equal ” ) ;
14 break ;
15 end
16 endfunction
17 // C a l l i n g R o u t i n e :
18 x1 =32;
19 x2 =45;
20 x3 =43;
21 x4 =55;
22 rational_equal ( x1 , x2 , x3 , x4 ) ;
1 // S o l v e d Example 6
2 //To R a i s e The s a l a r y o f an e m p l o y e e
3 function [ employee1 ]= raise ( employee , n ) // e m p l o y e e i s
the l i s t of employees
17
4 for i =1: n
5 if ( employee ( i ) (1) . year <=2000)
6 employee ( i ) (2) = employee ( i ) (2) *1.1;
7 else
8 employee ( i ) (2) = employee ( i ) (2) *1.05;
9 end
10 end
11 employee1 = employee ;
12 disp ( ” A f t e r R a i s i n g ” ) ;
13 for i =1: n
14 printf ( ” Employee no %d\n ” ,i ) ;
15 disp ( employee ( i ) (1) ) ;
16 disp ( employee ( i ) (2) ) ;
17 end
18
19 endfunction
20 // C a l l i n g R o u t i n e :
21 datehired = struct ( ’ y e a r ’ ,1993 , ’ month ’ ,12) ;
22 employee1 = list ( datehired ,14000) ;
23 datehired = struct ( ’ y e a r ’ ,1998 , ’ month ’ ,12) ;
24 employee2 = list ( datehired ,17000) ;
25 datehired = struct ( ’ y e a r ’ ,2003 , ’ month ’ ,12) ;
26 employee3 = list ( datehired ,25000) ;
27 datehired = struct ( ’ y e a r ’ ,2002 , ’ month ’ ,12) ;
28 employee4 = list ( datehired ,35000) ;
29 datehired = struct ( ’ y e a r ’ ,2006 , ’ month ’ ,12) ;
30 employee5 = list ( datehired ,13000) ;
31 employee = list ( employee1 , employee2 , employee3 ,
employee4 , employee5 ) ;
32 employee = raise ( employee ,5)
1 // S o l v e d Example 7 :
2 // R e d u c i n g The Given R a t i o n a l Number
18
3 funcprot (0)
4 function [ y ]= reduce ( nm , dn )
5 rational1 = struct ( ’ n u m e r a t o r ’ ,nm , ’ d e n o m i n a t o r ’ , dn )
6 y =0
7 if ( rational1 . numerator > rational1 . denominator )
8 a = rational1 . numerator ;
9 b = rational1 . denominator ;
10 else
11 a = rational1 . denominator ;
12 b = rational1 . numerator ;
13 end
14 while ( b ~=0)
15 rem = modulo (a , b ) ;
16 a=b;
17 b = rem ;
18 end
19 y = struct ( ’ n u m e r a t o r ’ , nm /a , ’ d e n o m i n a t o r ’ , dn / a ) ;
20 disp ( y ) ;
21 endfunction
22 nm =22;
23 dn =44;
24 y = reduce ( nm , dn )
1 // S o l v e d Example 8 :
2 // C h e c k i n g f o r t h e e q u a l i t y o f 2 r a t i o n a l numbers by
r e d u c i n g them
3 function []= equal ( x1 , x2 , x3 , x4 )
4 rational1 = struct ( ’ n u m e r a t o r ’ ,x1 , ’ d e n o m i n a t o r ’ , x2 )
5 rational2 = struct ( ’ n u m e r a t o r ’ ,x3 , ’ d e n o m i n a t o r ’ , x4 )
6 y =0
7 if ( rational1 . numerator > rational1 . denominator )
8 a = rational1 . numerator ;
9 b = rational1 . denominator ;
19
10 else
11 a = rational1 . denominator ;
12 b = rational1 . numerator ;
13 end
14 while ( b ~=0)
15 rem = modulo (a , b ) ;
16 a=b;
17 b = rem ;
18 end
19 y = struct ( ’ n u m e r a t o r ’ , x1 /a , ’ d e n o m i n a t o r ’ , x2 / a ) ;
20 y1 =0
21 if ( rational2 . numerator > rational2 . denominator )
22 a = rational2 . numerator ;
23 b = rational2 . denominator ;
24 else
25 a = rational2 . denominator ;
26 b = rational2 . numerator ;
27 end
28 while ( b ~=0)
29 rem = modulo (a , b ) ;
30 a=b;
31 b = rem ;
32 end
33 y1 = struct ( ’ n u m e r a t o r ’ , x3 /a , ’ d e n o m i n a t o r ’ , x4 / a ) ;
34 if ( y == y1 )
35 disp ( ” Equal ” )
36 break ;
37 else
38 disp ( ” Not Equal ” )
39 break ;
40 end
41 endfunction
42 x1 =5;
43 x2 =7;
44 x3 =35;
45 x4 =49;
46 equal ( x1 , x2 , x3 , x4 ) ;
20
Chapter 2
Stacks
1 // S o l v e d Example 1
2 //To d e t e r m i n e t h e s y n t a c t i c a l y v a l i d s t r i n g
3 function [ l ]= strlen ( x )
4 i =1;
5 l =0;
6 [j , k ]= size ( x )
7 for i =1: k
8 l = l + length ( x ( i ) ) ;
9 end
10 endfunction
11 function []= stringvalid ( str )
12 str = string ( str ) ;
13 stack = struct ( ’ a ’ , ’ 0 ’ , ’ t o p ’ ,0) ;
14 l1 = strlen ( str ) ;
15 valid =1;
16 l =1;
17 while (l <= l1 )
18 if ( str ( l ) == ’ ( ’ | str ( l ) == ’ [ ’ | str ( l ) == ’ { ’ )
19 if ( stack . top ==0)
20 stack . a = str ( l ) ;
21 stack . top = stack . top +1;
21
22 else
23 stack . a =[ stack . a (: ,:) str ( l ) ];
24 stack . top = stack . top +1;
25 end
26 end
27 if ( str ( l ) == ’ ) ’ | str ( l ) == ’ ] ’ | str ( l ) == ’ } ’ )
28 if ( stack . top ==0)
29 valid =0;
30 break ;
31 else
32 i = stack . a ( stack . top ) ;
33 stack . top = stack . top -1;
34 symb = str ( l ) ;
35 if ((( symb == ’ ) ’ ) &( i == ’ ( ’ ) ) |(( symb == ’ ] ’ ) &( i ==
’ [ ’ ) ) |(( symb == ’ } ’ ) &( i == ’ { ’ ) ) )
36 else
37 valid =0;
38 break ;
39 end
40 end
41 end
42 l = l +1;
43 end
44 if ( stack . top ~=0)
45 valid =0;
46 end
47 if ( valid ==0)
48 disp ( ” I n v a l i d S t r i n g ” ) ;
49 else
50 disp ( ” V a l i d S t r i n g ” ) ;
51 end
52 endfunction
53 // C a l l i n g R o u t i n e :
54 stringvalid ([ ’H ’ ’E ’ ’ L ’ ’ L ’ ’O ’ ])
22
Scilab code Exa 2.1.2 To determine the syntacticaly valid string
1 // S o l v e d Example 1
2 //To d e t e r m i n e t h e s y n t a c t i c a l y v a l i d s t r i n g
3 function [ l ]= strlen ( x )
4 i =1;
5 l =0;
6 [j , k ]= size ( x )
7 for i =1: k
8 l = l + length ( x ( i ) ) ;
9 end
10 endfunction
11 function []= stringvalid ( str )
12 str = string ( str ) ;
13 stack = struct ( ’ a ’ , ’ 0 ’ , ’ t o p ’ ,0) ;
14 l1 = strlen ( str ) ;
15 valid =1;
16 l =1;
17 while (l <= l1 )
18 if ( str ( l ) == ’ ( ’ | str ( l ) == ’ [ ’ | str ( l ) == ’ { ’ )
19 if ( stack . top ==0)
20 stack . a = str ( l ) ;
21 stack . top = stack . top +1;
22 else
23 stack . a =[ stack . a (: ,:) str ( l ) ];
24 stack . top = stack . top +1;
25 end
26 disp ( stack ) ;
27 end
28 if ( str ( l ) == ’ ) ’ | str ( l ) == ’ ] ’ | str ( l ) == ’ } ’ )
29 if ( stack . top ==0)
30 valid =0;
31 break ;
32 else
33 i = stack . a ( stack . top ) ;
34 b = stack . a (1) ;
35 for i1 =2: stack . top -1
36 b =[ b (: ,:) stack . a ( i1 ) ]
23
37 end
38 stack . a = b ;
39 stack . top = stack . top -1;
40 symb = str ( l ) ;
41 disp ( stack ) ;
42 if ((( symb == ’ ) ’ ) &( i == ’ ( ’ ) ) |(( symb == ’ ] ’ ) &( i = ’
[ ’ ) ) |(( symb = ’ } ’ ) &( i = ’ { ’ ) ) )
43 else
44 valid =0;
45 break ;
46 end
47 end
48 end
49 l = l +1;
50 end
51 if ( stack . top ~=0)
52 valid =0;
53 end
54 if ( valid ==0)
55 disp ( ” I n v a l i d S t r i n g ” ) ;
56 else
57 disp ( ” V a l i d S t r i n g ” ) ;
58 end
59 endfunction
60 // C a l l i n g R o u t i n e :
61 stringvalid ([ ’ ( ’ ’A ’ ’+ ’ ’B ’ ’ } ’ ’ ) ’ ])
62 stringvalid ([ ’ { ’ ’ [ ’ ’A ’ ’+ ’ ’B ’ ’ ] ’ ’− ’ ’ [ ’ ’ ( ’
’C ’ ’− ’ ’D ’ ’ ) ’ ’ ] ’ ])
63 stringvalid ([ ’ ( ’ ’A ’ ’+ ’ ’B ’ ’ ) ’ ’− ’ ’ { ’ ’C ’ ’+ ’ ’
D ’ ’ } ’ ’− ’ ’ [ ’ ’ F ’ ’+ ’ ’G ’ ’ ] ’ ])
64 stringvalid ([ ’ ( ’ ’ ( ’ ’H ’ ’ ) ’ ’ ∗ ’ ’ { ’ ’ ( ’ ’ [ ’ ’ J ’ ’
+ ’ ’K ’ ’ ] ’ ’ ) ’ ’ } ’ ’ ) ’ ])
65 stringvalid ([ ’ ( ’ ’ ( ’ ’ ( ’ ’A ’ ’ ) ’ ’ ) ’ ’ ) ’ ])
24
1 // S o l v e d Example 2 :
2 // I m p l e m e n t i n g S t a c k u s i n g u n i o n :
3 function [ stack ]= sta_union ( etype , a )
4 stackelement = struct ( ’ e t y p e ’ , etype ) ;
5 [k , l ]= size ( a ) ;
6 select stackelement . etype ,
7 case ’ i n t ’ then
8 a = int32 ( a ) ;
9 stack = struct ( ’ t o p ’ ,l , ’ i t e m s ’ ,a ) ; ,
10 case ’ f l o a t ’ then
11 a = double ( a ) ;
12 stack = struct ( ’ t o p ’ ,l , ’ i t e m s ’ ,a ) ; ,
13 case ’ c h a r ’ then
14 a = string ( a ) ;
15 stack = struct ( ’ t o p ’ ,l , ’ i t e m s ’ ,a ) ; ,
16 end
17 disp ( stack , ” S t a c k i s : ” ) ;
18 endfunction
19 a =[32 12.34 232 32.322]
20 stack = sta_union ( ’ f l o a t ’ ,a )
21 stack = sta_union ( ’ i n t ’ ,a )
22 stack = sta_union ( ’ c h a r ’ ,a )
1 function [ l ]= strlen ( x )
2 i =1;
3 l =0;
4 [j , k ]= size ( x )
5 for i =1: k
6 l = l + length ( x ( i ) ) ;
7 end
8 endfunction
9 function []= str ( st )
10 stack = struct ( ’ a ’ ,0 , ’ t o p ’ ,0) ;
25
11 st = string ( st ) ;
12 l =1;
13 l1 = strlen ( st ) ;
14 symb = st ( l ) ;
15 valid =1;
16 while (l < l1 )
17 while ( symb ~= ’C ’ )
18 if ( stack . top ==0)
19 stack . a = st ( l ) ;
20 stack . top = stack . top +1;
21 else
22 stack . a =[ stack . a (: ,:) st ( l ) ];
23 stack . top = stack . top +1;
24 end
25 l = l +1;
26 symb = st ( l ) ;
27 end
28 i = st ( l +1) ;
29 if ( stack . top ==0)
30 valid =0;
31 break ;
32 else
33 symb1 = stack . a ( stack . top ) ;
34 stack . top = stack . top -1;
35 if ( i ~= symb1 )
36 valid =0;
37 break ;
38 end
39 end
40 l = l +1;
41 end
42 if ( stack . top ~=0)
43 valid =0;
44 end
45 if ( valid ==0)
46 disp ( ” Not o f t h e g i v e n f o r m a t ” ) ;
47 else
48 disp ( ” S t r i n g Of t h e Given Format ” ) ;
26
49 end
50 endfunction
51 // C a l l i n g R o u t i n e :
52 st =[ ’A ’ ’A ’ ’B ’ ’A ’ ’C ’ ’A ’ ’B ’ ’A ’ ’A ’ ]
53 str ( st )
54 st =[ ’A ’ ’A ’ ’B ’ ’A ’ ’C ’ ’A ’ ’B ’ ’A ’ ]
55 str ( st )
1 // S o l v e d Example 3 :
2 // I m p l e m e n t i n g Push And Pop F u n c t i o n s :
3 function [y , sta1 ]= empty ( sta )
4 y =0;
5 sta1 =0;
6 if ( sta . top ==0)
7 y =0;
8 else
9 y =1;
10 end
11 sta1 = sta
12 endfunction
13
14 function [ sta ]= push ( stac , ele )
15 sta =0;
16 if ( empty ( stac ) ==0)
17 stac . a = ele ;
18 stac . top = stac . top +1;
19 else
20 stac . a =[ stac . a (: ,:) ele ]
21 stac . top = stac . top +1;
22 end
23 disp ( stac ) ;
24 sta = stac ;
25 endfunction
27
26
27 function [ ele , sta ]= pop ( stack )
28 ele = ’−1 ’ ;
29 if ( empty ( stack ) ==0)
30 disp ( ” S t a c k U n d e r f l o w ” ) ;
31 break ;
32 else
33 ele = stack . a ( stack . top ) ;
34 stack . top = stack . top -1;
35 if ( stack . top ~=0)
36 b = stack . a (1) ;
37 for i2 =2: stack . top
38 b =[ b (: ,:) stack . a ( i2 ) ];
39 end
40 stack . a = b ;
41 else
42 stack . a = ’ 0 ’ ;
43 end
44 end
45 disp ( stack ) ;
46 sta = stack ;
47 endfunction
48 global stack
49 // C a l l i n g R o u t i n e :
50 stack = struct ( ’ a ’ ,0 , ’ t o p ’ ,0) ;
51 stack = push ( stack ,4) ;
52 stack = push ( stack ,55) ;
53 stack = push ( stack ,199) ;
54 stack = push ( stack ,363) ;
55 [ ele , stack ]= pop ( stack ) ;
56 disp ( stack , ” A f t e r t h e a b o v e o p e r a t i o n s s t a c k i s : ”);
1 // S o l v e d Example 5 :
28
2 // C o n v e r i n g an i n f i x e x p r e s s i o n t o a P o s t f i x
Expression :
3 function [ sta ]= push ( stac , ele )
4 sta =0;
5 if ( stac . top ==0)
6 stac . a = ele ;
7 stac . top = stac . top +1;
8 else
9 stac . a =[ stac . a (: ,:) ele ]
10 stac . top = stac . top +1;
11 end
12 disp ( stac ) ;
13 sta = stac ;
14 endfunction
15
16 function [ ele , sta ]= pop ( stack )
17 ele = ’−1 ’ ;
18 if ( stack . top ==0)
19 disp ( ” S t a c k U n d e r f l o w ” ) ;
20 break ;
21 else
22 ele = stack . a ( stack . top ) ;
23 stack . top = stack . top -1;
24 if ( stack . top ~=0)
25 b = stack . a (1) ;
26 for i2 =2: stack . top
27 b =[ b (: ,:) stack . a ( i2 ) ];
28 end
29 stack . a = b ;
30 else
31 stack . a = ’ 0 ’ ;
32 end
33 end
34 sta = stack ;
35 endfunction
36 function [ l ]= strlen ( x )
37 i =1;
38 l =0;
29
39 [j , k ]= size ( x )
40 for i =1: k
41 l = l + length ( x ( i ) ) ;
42 end
43 endfunction
44 function [ p ]= pre ( s1 , s2 )
45 i1 =0;
46 select s1 ,
47 case ’+ ’ then i1 =5;
48 case ’− ’ then i1 =5;
49 case ’ ∗ ’ then i1 =9;
50 case ’ / ’ then i1 =9;
51 end
52 i2 =0;
53 select s2 ,
54 case ’+ ’ then i2 =5;
55 case ’− ’ then i2 =5;
56 case ’ ∗ ’ then i2 =9;
57 case ’ / ’ then i2 =9;
58 end
59 p =0;
60 p = i1 - i2 ;
61 if ( s1 == ’ ( ’ )
62 p = -1;
63 end
64 if ( s2 == ’ ( ’ & s1 ~= ’ ) ’ )
65 p = -1;
66 end
67 if ( s1 ~= ’ ( ’ & s2 == ’ ) ’ )
68 p =1;
69 end
70
71 endfunction
72 function [ a2 ]= intopo ( a1 , n )
73 stack = struct ( ’ a ’ ,0 , ’ t o p ’ ,0) ;
74 l1 =1;
75 l2 = strlen ( a1 (1) )
76 for i =2: n
30
77 l2 = l2 + strlen ( a1 ( i ) )
78 end
79 a2 = list () ;
80 while ( l1 <= l2 )
81 symb = a1 ( l1 ) ;
82 if ( isalphanum ( string ( a1 ( l1 ) ) ) )
83 a2 = list ( a2 , symb ) ;
84 else
85 while ( stack . top ~=0&( pre ( stack . a ( stack . top ) ,
symb ) >=0) )
86 [ topsymb , stack ]= pop ( stack ) ;
87 if ( topsymb == ’ ) ’ | topsymb == ’ ( ’ )
88 a2 = a2 ;
89 else
90 a2 = list ( a2 , topsymb ) ;
91 end
92 end
93 if ( stack . top ==0| symb ~= ’ ) ’ )
94 stack = push ( stack , symb ) ;
95 else
96 [ ele , stack ]= pop ( stack ) ;
97 end
98 end
99 l1 = l1 +1;
100 end
101 while ( stack . top ~=0)
102 [ topsymb , stack ]= pop ( stack ) ;
103 if ( topsymb == ’ ) ’ | topsymb == ’ ( ’ )
104 a2 = a2 ;
105 else
106 a2 = list ( a2 , topsymb ) ;
107 end
108 end
109 disp ( a2 ) ;
110 endfunction
111 // C a l l i n g R o u t i n e :
112 a1 =[ ’ ( ’ ’ 2 ’ ’+ ’ ’ 3 ’ ’ ) ’ ’ ∗ ’ ’ ( ’ ’ 5 ’ ’− ’ ’ 4 ’ ’ ) ’ ]
113 a2 = intopo ( a1 ,11)
31
32
Chapter 3
Recursion
1 // M u l t i p l i c a t i o n o f 2 numbers
2 funcprot (0)
3 function [ val ]= mul (a , b )
4 if ( b ==1)
5 val = a ;
6 else
7 val = a + mul (a ,b -1) ;
8 end
9 endfunction
10 // C a l l i n g R o u t i n e :
11 a =4;
12 b =3;
13 val = mul (4 ,3)
14 printf ( ” P r o d u c t o f %d and %d i s %d” ,a ,b , val ) ;
1 // F u n c t i o n To C a l u c u l a t e f a c t o r i a l o f a g i v e n
number
33
2 function [ value ]= fact ( a )
3 value = -1;
4 if (a <0| a >170)
5 disp ( ” I n v a l i d v a l u . ” ) ;
6 break ;
7 else
8 if ( a ==1| a ==0)
9 value =1;
10 else
11 value = a * fact (a -1) ;
12 end
13 end
14 endfunction
15 // C a l l i n g R o u t i n e :
16 a =5;
17 val = fact ( a ) ;
18 printf ( ”%d f a c t o r i a l i s %d” ,a , val ) ;
34
16 l =( fibbo (0) ) ;
17 for x =1: n -1
18 l =[ l (: ,:) , fibbo ( x ) ];
19 end
20 disp ( l ) ;
21 endfunction
22 // C a l l i n g R o u t i n e :
23 n =5;
24 l = fibbon ( n )
1 function [ b ]= bsear (a ,l ,u , n )
2 if (l > u )
3 b = -1;
4 else
5 mid = int32 (( l + u ) /2) ;
6 if ( n == a ( mid ) )
7 b=n;
8 else
9 if (n > a ( mid ) )
10 mid = int32 (( l + u ) /2) ;
11 b = bsear (a , mid +1 ,u , n ) ;
12 else
13 mid = int32 (( l + u ) /2) ;
14 b = bsear (a ,l , mid -1 , n ) ;
15 end
16 end
17 end
18 endfunction
19
20 function [ b ]= bsearc (a ,l ,u , n )
21 b = bsear (a ,l ,u , n ) ;
22 if ( b == -1)
23 disp ( ” The e l e m e n t i s n o t t h e r e ” ) ;
35
24 end
25 if ( b == n )
26 disp ( ” The e l e m e n t i s t h e r e ” ) ;
27 end
28 endfunction
29 // C a l l i n g R o u t i n e :
30 a =[12 122 3233 12121] // Must be s o r t e d :
31 b = bsearc (a ,1 ,4 ,12)
1 funcprot (0)
2 function [ y ]= find1 ( g )
36
3 length1 = strlen ( g ) ;
4 if ( length1 ==0)
5 y =0;
6 else
7 if ( isalphanum ( g (1) ) )
8 y =1;
9 else
10 if ( length1 <2)
11 y =0;
12 else
13 s = strsplit (g ,1) ;
14 s = s (2) ;
15 m = find1 ( s ) ;
16 if ( m ==0| length1 == m )
17 y =0;
18 else
19 e = strsplit (g , m +1) ;
20 e = e (2) ;
21 n = find1 ( e ) ;
22 if ( n ==0)
23 y =0;
24 else
25 y = m + n +1;
26 end
27 end
28 end
29 end
30 end
31 endfunction
32 function [ l ]= strlen ( x )
33 i =1;
34 l =0;
35 [j , k ]= size ( x )
36 for i =1: k
37 l = l + length ( x ( i ) ) ;
38 end
39 endfunction
40 function [ po ]= pr2po ( pr )
37
41 length1 = strlen ( pr ) ;
42 if ( length1 ==1)
43 if ( isalphanum ( pr ) )
44 po (1) = pr (1) ;
45 else
46 disp ( ” I n v a l i d s t r i n g \n ” ) ;
47 end
48 else
49 s = strsplit ( pr ,1) ;
50 g = s (2) ;
51 m = find1 ( g ) ;
52 s = strsplit ( pr , m +1) ;
53 g1 = s (2) ;
54 n = find1 ( g1 ) ;
55 f = strsplit ( pr ,1) ;
56 c = f (1) ;
57 if (( c ~= ’+ ’ & c ~= ’− ’ & c ~= ’ / ’ & c ~= ’ ∗ ’ ) | m ==0| n ==0| m + n
+1~= length1 )
58 printf ( ” I n v a l i d s t r i n g \n ” ) ;
59 else
60 s = strsplit ( pr ,1) ;
61 s = strsplit ( s (2) ,m ) ;
62 opnd1 = s (1) ;
63 s = strsplit ( pr , m +1) ;
64 opnd2 = s (2) ;
65 post1 = pr2po ( opnd1 ) ;
66 post2 = pr2po ( opnd2 ) ;
67 post =[ post1 (: ,:) post2 (: ,:) ]
68 f = strsplit ( pr ,1) ;
69 c = f (1) ;
70 post3 =[ post (: ,:) c ];
71 po = post3 ;
72 end
73 end
74 endfunction
75 // C a l l i n g R o u t i n e :
76
77 s1 = ”+−∗abcd ” ; // no s p a c e s b e t w e e n
38
78 po = pr2po ( s1 ) ;
79 disp ( po , ” p o s t f i x i s ” ) ;
80 s1 = ”+−∗/+−∗/ a b c d e f g h i ”
81 po = pr2po ( s1 ) ;
82 disp ( po , ” p o s t f i x i s ” ) ;
1
2 function []= simu_fact ( n ) ;
3 a =1;
4 while (n >0)
5 a=a*n;
6 n =n -1;
7 end
8 disp (a , ” F a c t o r i a l i s ” ) ;
9 endfunction
10 // C a l l i n g R o u t i n e :
11 a =9
12 simu_fact ( a )
39
Chapter 4
40
20 i =1;
21 while ( link1 ( i ) (1) . nexadd ~=0)
22 i = i +1;
23 end
24 j=i;
25 lin2 . data = ele ;
26 lin2 . add = link1 ( i ) . add +1;
27 lin2 . nexadd =0;
28 link1 ( i ) . nexadd = lin2 . add ;
29 link2 (1) = link1 (1) (1) ;
30 i =2;
31 while ( link1 ( i ) . nexadd ~= lin2 . add )
32 link2 ( i ) =( link1 ( i ) ) ;
33 i = i +1;
34 end
35 link2 ( i ) = link1 ( i ) ;
36 link2 ( i +1) = lin2 ;
37 end
38 end
39 endfunction
40 function [ link2 ]= add ( ele , pos , link1 ) ;
41 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
42 i =1;
43 while (i <= pos )
44 if ( link1 ( i ) . nexadd ==0)
45 break ;
46 else
47 i = i +1;
48 end
49 end
50 if ( link1 ( i ) . nexadd ~=0)
51 i =i -1;
52 lin2 . data = ele ;
53 lin2 . add = i ;
54 j=i;
55 while ( link1 ( j ) . nexadd ~=0)
41
56 link1 ( j ) . add = link1 ( j ) . add +1;
57 link1 ( j ) . nexadd = link1 ( j ) . nexadd +1;
58 j = j +1;
59 end
60 link1 ( j ) . add = link1 ( j ) . add +1;
61 lin2 . nexadd = link1 ( i ) . add ;
62 link1 (i -1) . nexadd = lin2 . add ;
63 k =1;
64 while (k < i )
65 link2 ( k ) = link1 ( k ) ;
66 k = k +1;
67 end
68 link2 ( k ) = lin2 ;
69 k = k +1;
70 link2 ( k ) = link1 (k -1) ;
71 k = k +1
72 l =k -1;
73 while ( k ~= j )
74 link2 ( k ) = link1 ( l ) ;
75 k = k +1;
76 l = l +1;
77 end
78 link2 ( j ) = link1 (j -1) ;;
79 link2 ( j +1) = link1 ( j ) ;
80 else
81 if ( i == pos & i ~=1)
82 k =1;
83 lin2 . data = ele ;
84 lin2 . add = link1 (i -1) . add +1;
85 link1 ( i ) . add = link1 ( i ) . add +1;
86 lin2 . nexadd = link1 ( i ) . add ;
87 k =1;
88 while (k < pos )
89 link2 ( k ) = link1 ( k ) ;
90 k = k +1;
91 end
92 link2 ( k ) = lin2 ;
93 link2 ( k +1) = link1 ( k )
42
94 end
95 if ( i == pos & i ==1)
96 link2 = append ( ele , link1 ) ;
97 return link2 ;
98 end
99 end
100 endfunction
101 function [ link2 ]= delete1 ( pos , link1 )
102 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
103 i =1;
104 while (i <= pos )
105 if (( link1 ( i ) . nexadd ==0) )
106 break ;
107 else
108 i = i +1;
109 end
110 end
111 if ( link1 ( i ) . nexadd ~=0)
112 i =i -1;
113 j =1;
114 if ( i ==1)
115 j =1;
116 while ( link1 ( j ) . nexadd ~=0)
117 link2 ( j ) = link1 ( j ) ;
118 j = j +1;
119 end
120 link2 ( j ) = link1 ( j ) ;
121 else
122 link1 (i -1) . nexadd = link1 ( i +1) . add ;
123 while ( link1 ( j ) . nexadd ~= link1 ( i +1) . add )
124 link2 ( j ) = link1 ( j ) ;
125 j = j +1;
126 end
127 if ( j ~= i -1)
128 link2 ( j ) = link1 ( j ) ;
129 link2 ( j +1) = link1 ( j +1) ;
43
130 k = i +1;
131 l =2;
132 else
133 link2 ( j ) = link1 ( j ) ;
134 k = i +1;
135 l =1;
136 end
137 while ( link1 ( k ) . nexadd ~=0)
138 link2 ( j + l ) = link1 ( k ) ;
139 k = k +1;
140 l = l +1;
141 end
142 link2 ( j + l ) = link1 ( k ) ;
143 end
144 else
145 if ( i == pos )
146 j =1;
147 link1 (i -1) . nexadd =0;
148 while (j <= i -1)
149 link2 ( j ) = link1 ( j ) ;
150 j = j +1;
151 end
152 end
153 end
154 endfunction
155
156
157
158 // C a l l i n g R o u t i n e :
159 link1 = struct ( ’ d a t a ’ ,0 , ’ add ’ ,0 , ’ nexadd ’ ,0) ; // C r e a t e s
empty l i s t
160 link1 = append (4 , link1 )
161 link1 = append (6 , link1 )
162 link1 = add (7 ,2 , link1 )
163 link1 = append (8 , link1 )
164 link1 = delete1 (4 , link1 )
165 disp ( link1 , ” The l i n k e d l i s t a f t e r t h e a b o v e
m o d i f i c a t i o n s i s : ”);
44
Scilab code Exa 4.2 Implementing Queue Operarions
1 // Queue Operations
2 function [ q2 ]= push ( ele , q1 )
3 if ( q1 . rear == q1 . front )
4 q1 . a = ele ;
5 q1 . rear = q1 . rear +1;
6 else
7 q1 . a =[ q1 . a (: ,:) ele ];
8 q1 . rear = q1 . rear +1;
9 end
10 q2 = q1 ;
11 endfunction
12 function [ ele , q2 ]= pop ( q1 )
13 ele = -1;
14 q2 =0;
15 if ( q1 . rear == q1 . front )
16 disp ( ” Queue U n d e r f l o w ” ) ;
17 return ;
18 else
19 ele = q1 . a ( q1 . rear - q1 . front ) ;
20 q1 . front = q1 . front +1;
21 i =1;
22 a = q1 . a (1) ;
23 for i =2:( q1 . rear - q1 . front )
24 a =[ a (: ,:) q1 . a ( i ) ];
25 end
26 q1 . a = a ;
27 end
28 q2 = q1 ;
29 endfunction
30 // C a l l i n g R o u t i n e :
31 q1 = struct ( ’ a ’ ,0 , ’ r e a r ’ ,0 , ’ f r o n t ’ ,0)
32 q1 = push (3 , q1 )
45
33 q1 = push (22 , q1 ) ;
34 q1 = push (21 , q1 ) ;
35 disp ( q1 , ” Queue a f t e r i n s e r t i o n ” ) ;
36 [ ele , q1 ]= pop ( q1 )
37 disp ( ele , ” poped e l e m e n t ” ) ;
38 disp ( q1 , ” Queue a f t e r p o p i n g ” ) ;
39 [ ele , q1 ]= pop ( q1 ) ;
40 [ ele , q1 ]= pop ( q1 ) ;
41 [ ele , q1 ]= pop ( q1 ) ; // U n d e r f l o w C o n d i t i o n
46
22 i = i +1;
23 end
24 j=i;
25 lin2 . data = ele ;
26 lin2 . add = link1 ( i ) . add +1;
27 lin2 . nexadd = link1 (1) (1) . add ;
28 link1 ( i ) . nexadd = lin2 . add ;
29 link2 (1) = link1 (1) (1) ;
30 i =2;
31 while ( link1 ( i ) . nexadd ~= lin2 . add )
32 link2 ( i ) =( link1 ( i ) ) ;
33 i = i +1;
34 end
35 link2 ( i ) = link1 ( i ) ;
36 link2 ( i +1) = lin2 ;
37 end
38 end
39 endfunction
40 function [ link2 ]= add ( ele , pos , link1 ) ;
41 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
42 i =1;
43 while (i <= pos )
44 if ( link1 ( i ) . nexadd == link1 (1) (1) . add )
45 break ;
46 else
47 i = i +1;
48 end
49 end
50 if ( link1 ( i ) . nexadd ~= link1 (1) (1) . add )
51 i =i -1;
52 lin2 . data = ele ;
53 lin2 . add = i ;
54 j=i;
55 while ( link1 ( j ) . nexadd ~= link1 (1) (1) . add )
56 link1 ( j ) . add = link1 ( j ) . add +1;
57 link1 ( j ) . nexadd = link1 ( j ) . nexadd +1;
47
58 j = j +1;
59 end
60 link1 ( j ) . add = link1 ( j ) . add +1;
61 lin2 . nexadd = link1 ( i ) . add ;
62 link1 (i -1) . nexadd = lin2 . add ;
63 k =1;
64 while (k < i )
65 link2 ( k ) = link1 ( k ) ;
66 k = k +1;
67 end
68 link2 ( k ) = lin2 ;
69 k = k +1;
70 link2 ( k ) = link1 (k -1) ;
71 k = k +1
72 l =k -1;
73 while ( k ~= j )
74 link2 ( k ) = link1 ( l ) ;
75 k = k +1;
76 l = l +1;
77 end
78 link2 ( j ) = link1 (j -1) ;;
79 link2 ( j +1) = link1 ( j ) ;
80 else
81 if ( i == pos )
82 k =1;
83 lin2 . data = ele ;
84 lin2 . add = link1 (i -1) . add +1;
85 link1 ( i ) . add = link1 ( i ) . add +1;
86 lin2 . nexadd = link1 ( i ) . add ;
87 link1 ( i ) . nexadd = link1 (1) (1) . add ;
88 k =1;
89 while (k < pos )
90 link2 ( k ) = link1 ( k ) ;
91 k = k +1;
92 end
93 link2 ( k ) = lin2 ;
94 link2 ( k +1) = link1 ( k )
95 end
48
96 end
97
98 endfunction
99 function [ link2 ]= delete1 ( pos , link1 )
100 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
101 i =1;
102 j =1;
103 while (i < pos )
104 if (( link1 ( j ) . nexadd == link1 (1) (1) . add ) )
105 j =1;
106 i = i +1;
107 else
108 i = i +1;
109 j = j +1;
110 end
111 end
112 if ( link1 ( j ) . nexadd ~= link1 (1) (1) . add )
113 k =1;
114 if ( j ==1)
115 k =2;
116 while ( link1 ( k ) . nexadd ~= link1 (1) (1) . add )
117 link2 (k -1) = link1 ( k ) ;
118 k = k +1;
119 end
120 link2 (k -1) = link1 ( k ) ;
121 link2 (k -1) . nexadd = link2 (1) . add ;
122 else
123 lin2 = link1 ( j ) ;
124 link1 (j -1) . nexadd = link1 ( j +1) . add ;
125 k =1;
126 while ( link1 ( k ) . nexadd ~= link1 ( j +1) . add )
127 link2 ( k ) = link1 ( k ) ;
128 k = k +1;
129 end
130 link2 ( k ) = link1 ( k ) ;
131 k = k +2;
49
132 while ( link1 ( k ) . nexadd ~= link1 (1) (1) . add )
133 link2 (k -1) = link1 ( k ) ;
134 k = k +1;
135 end
136 link2 (k -1) = link1 ( k ) ;
137 end
138 else
139 link1 (j -1) . nexadd = link1 (1) (1) . add ;
140 l =1;
141 while ( link1 ( l ) . nexadd ~= link1 (1) (1) . add )
142 link2 ( l ) = link1 ( l ) ;
143 l = l +1;
144 end
145 link2 ( l ) = link1 ( l ) ;
146 end
147 endfunction
148 // C a l l i n g R o u t i n e :
149 link1 = struct ( ’ d a t a ’ ,0 , ’ add ’ ,0 , ’ nexadd ’ ,0) ;
150 link1 = append (4 , link1 ) ; // T h i s w i l l a c t u a l y c r e a t e a
l i s t and 4 a s s t a r t
151 link1 = append (6 , link1 ) ;
152 link1 = add (10 ,2 , link1 ) ;
153 link1 = delete1 (4 , link1 ) ; // As t h e l i s t i s c i r c u l a r t h e
4 ’ t h e l e m e n t r e f e r s t o a c t u a l y t h e 1 ’ s t one
154 disp ( link1 , ” A f t e r t h e a b o v e m a n u p l a t i o n s t h e l i s t i s
”);
50
5 link1 (1) (1) . data = ele ;
6 link1 (1) (1) . add =1;
7 link1 (1) (1) . nexadd =0;
8 link1 (1) (1) . prevadd =0;
9 link2 (1) = link1 (1) (1) ;
10 else
11 if ( link1 (1) (1) . nexadd ==0)
12 lin2 = link1 (1) (1) ;
13 lin2 . data = ele ;
14 lin2 . add = link1 (1) (1) . add +1;
15 link1 (1) (1) . nexadd = lin2 . add ;
16 lin2 . nexadd =0;
17 lin2 . prevadd = link1 (1) (1) . add ;
18 link2 (1) = link1 (1) (1) ;
19 link2 (2) = lin2 ;
20 else
21 lin2 = link1 (1) (1) ;
22 i =1;
23 while ( link1 ( i ) (1) . nexadd ~=0)
24 i = i +1;
25 end
26 j=i;
27 lin2 . data = ele ;
28 lin2 . add = link1 ( i ) . add +1;
29 lin2 . nexadd =0;
30 link1 ( i ) . nexadd = lin2 . add ;
31 lin2 . prevadd = link1 ( i ) . add ;
32 link2 (1) = link1 (1) (1) ;
33 i =2;
34 while ( link1 ( i ) . nexadd ~= lin2 . add )
35 link2 ( i ) =( link1 ( i ) ) ;
36 i = i +1;
37 end
38 link2 ( i ) = link1 ( i ) ;
39 link2 ( i +1) = lin2 ;
40 end
41 end
42 endfunction
51
43 function [ link2 ]= add ( ele , pos , link1 ) ;
44 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
45 i =1;
46 while (i <= pos )
47 if ( link1 ( i ) . nexadd ==0)
48 break ;
49 else
50 i = i +1;
51 end
52 end
53 if ( link1 ( i ) . nexadd ~=0)
54 i =i -1;
55 lin2 . data = ele ;
56 lin2 . add = i ;
57 j=i;
58 while ( link1 ( j ) . nexadd ~=0)
59 link1 ( j ) . prevadd = link1 ( j ) . prevadd +1;
60 link1 ( j ) . add = link1 ( j ) . add +1;
61 link1 ( j ) . nexadd = link1 ( j ) . nexadd +1;
62 j = j +1;
63 end
64 link1 ( j ) . prevadd = link1 ( j ) . prevadd +1;
65 link1 ( j ) . add = link1 ( j ) . add +1;
66 lin2 . nexadd = link1 ( i ) . add ;
67 link1 ( i ) . prevadd = lin2 . add ;
68 lin2 . prevadd = link1 (i -1) . add ;
69 link1 (i -1) . nexadd = lin2 . add ;
70 k =1;
71 while (k < i )
72 link2 ( k ) = link1 ( k ) ;
73 k = k +1;
74 end
75 link2 ( k ) = lin2 ;
76 k = k +1;
77 link2 ( k ) = link1 (k -1) ;
78 k = k +1
52
79 l =k -1;
80 while ( k ~= j )
81 link2 ( k ) = link1 ( l ) ;
82 k = k +1;
83 l = l +1;
84 end
85 link2 ( j ) = link1 (j -1) ;;
86 link2 ( j +1) = link1 ( j ) ;
87 else
88 if ( i == pos )
89 k =1;
90 lin2 . data = ele ;
91 lin2 . add = link1 (i -1) . add +1;
92 link1 ( i ) . add = link1 ( i ) . add +1;
93 lin2 . nexadd = link1 ( i ) . add ;
94 link1 ( i ) . prevadd = lin2 . add ;
95 lin2 . prevadd = link1 (i -1) . add ;
96 k =1;
97 while (k < pos )
98 link2 ( k ) = link1 ( k ) ;
99 k = k +1;
100 end
101 link2 ( k ) = lin2 ;
102 link2 ( k +1) = link1 ( k )
103 end
104 end
105
106 endfunction
107 function [ link2 ]= delete1 ( pos , link1 )
108 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
109 i =1;
110 while (i <= pos )
111 if (( link1 ( i ) . nexadd ==0) )
112 break ;
113 else
114 i = i +1;
53
115 end
116 end
117 if ( link1 ( i ) . nexadd ~=0)
118 i =i -1;
119 j =1;
120 if ( i ==1)
121 j =1;
122 while ( link1 ( j ) . nexadd ~=0)
123 link2 ( j ) = link1 ( j ) ;
124 j = j +1;
125 end
126 link2 ( j ) = link1 ( j ) ;
127 else
128 link1 (i -1) . nexadd = link1 ( i +1) . add ;
129 link1 ( i +1) . prevadd = link1 (i -1) . add ;
130 while ( link1 ( j ) . nexadd ~= link1 ( i +1) . add )
131 link2 ( j ) = link1 ( j ) ;
132 j = j +1;
133 end
134 if ( j ~= i -1)
135 link2 ( j ) = link1 ( j ) ;
136 link2 ( j +1) = link1 ( j +1) ;
137 k = i +1;
138 l =2;
139 else
140 link2 ( j ) = link1 ( j ) ;
141 k = i +1;
142 l =1;
143 end
144 while ( link1 ( k ) . nexadd ~=0)
145 link2 ( j + l ) = link1 ( k ) ;
146 k = k +1;
147 l = l +1;
148 end
149 link2 ( j + l ) = link1 ( k ) ;
150 end
151 else
152 if ( i == pos )
54
153 j =1;
154 link1 (i -1) . nexadd =0;
155 while (j <= i -1)
156 link2 ( j ) = link1 ( j ) ;
157 j = j +1;
158 end
159 end
160 end
161 endfunction
162 // C a l l i n g R o u t i n e :
163 link1 = struct ( ’ d a t a ’ ,0 , ’ add ’ ,0 , ’ nexadd ’ ,0) ;
164 link1 = append (4 , link1 ) ;
165 link1 = append (6 , link1 ) ;
166 link1 = add (10 ,2 , link1 ) ;
167 link1 = delete1 (3 , link1 ) ;
168 disp ( link1 , ” A f t e r t h e a b o v e m a n u p l a t i o n s t h e l i s t is
”);
Scilab code Exa 4.5 Implementing Stack using circular Linked list
55
14 lin2 . add = link1 (1) (1) . add +1;
15 link1 (1) (1) . nexadd = lin2 . add ;
16 lin2 . nexadd = link1 (1) (1) . add ;
17 link2 (1) = link1 (1) (1) ;
18 link2 (2) = lin2 ;
19 else
20 lin2 = link1 (1) (1) ;
21 i =1;
22 while ( link1 ( i ) (1) . nexadd ~= link1 (1) (1) . add )
23 i = i +1;
24 end
25 j=i;
26 lin2 . data = ele ;
27 lin2 . add = link1 ( i ) . add +1;
28 lin2 . nexadd = link1 (1) (1) . add ;
29 link1 ( i ) . nexadd = lin2 . add ;
30 link2 (1) = link1 (1) (1) ;
31 i =2;
32 while ( link1 ( i ) . nexadd ~= lin2 . add )
33 link2 ( i ) =( link1 ( i ) ) ;
34 i = i +1;
35 end
36 link2 ( i ) = link1 ( i ) ;
37 link2 ( i +1) = lin2 ;
38 end
39 end
40 endfunction
41 function [ link2 ]= add ( ele , pos , link1 ) ;
42 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
43 i =1;
44 while (i <= pos )
45 if ( link1 ( i ) . nexadd == link1 (1) (1) . add )
46 break ;
47 else
48 i = i +1;
49 end
56
50 end
51 if ( link1 ( i ) . nexadd ~= link1 (1) (1) . add )
52 i =i -1;
53 lin2 . data = ele ;
54 lin2 . add = i ;
55 j=i;
56 while ( link1 ( j ) . nexadd ~= link1 (1) (1) . add )
57 link1 ( j ) . add = link1 ( j ) . add +1;
58 link1 ( j ) . nexadd = link1 ( j ) . nexadd +1;
59 j = j +1;
60 end
61 link1 ( j ) . add = link1 ( j ) . add +1;
62 lin2 . nexadd = link1 ( i ) . add ;
63 link1 (i -1) . nexadd = lin2 . add ;
64 k =1;
65 while (k < i )
66 link2 ( k ) = link1 ( k ) ;
67 k = k +1;
68 end
69 link2 ( k ) = lin2 ;
70 k = k +1;
71 link2 ( k ) = link1 (k -1) ;
72 k = k +1
73 l =k -1;
74 while ( k ~= j )
75 link2 ( k ) = link1 ( l ) ;
76 k = k +1;
77 l = l +1;
78 end
79 link2 ( j ) = link1 (j -1) ;;
80 link2 ( j +1) = link1 ( j ) ;
81 else
82 if ( i == pos )
83 k =1;
84 lin2 . data = ele ;
85 lin2 . add = link1 (i -1) . add +1;
86 link1 ( i ) . add = link1 . add +1;
87 lin2 . nexadd = link1 ( i ) . add ;
57
88 link1 ( i ) . nexadd = link1 (1) (1) . add ;
89 k =1;
90 while (k < pos )
91 link2 ( k ) = link1 ( k ) ;
92 k = k +1;
93 end
94 link2 ( k ) = lin2 ;
95 link2 ( k +1) = link1 ( k )
96 end
97 end
98
99 endfunction
100 function [ link2 ]= delete1 ( pos , link1 )
101 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
102 i =1;
103 if ( link1 (1) (1) . add ==0)
104 disp ( ” I n v a l i d ” ) ;
105 else
106 if ( link1 (1) (1) . nexadd == link1 (1) (1) . add )
107 link1 (1) (1) . add =0;
108 link1 (1) (1) . nexadd =0;
109 link1 (1) (1) . data =0;
110 link2 (1) = link1 (1) (1) ;
111 else
112 while (i <= pos )
113 if (( link1 ( i ) . nexadd == link1 (1) (1) . add ) )
114 break ;
115 else
116 i = i +1;
117 end
118 end
119 if ( link1 ( i ) . nexadd ~= link1 (1) (1) . add )
120 i =i -1;
121 j =1;
122 if ( i ==1)
123 j =1;
58
124 while ( link1 ( j ) . nexadd ~= link1 (1) (1) . add )
125 link2 ( j ) = link1 ( j ) ;
126 j = j +1;
127 end
128 link2 ( j ) = link1 ( j ) ;
129 else
130 link1 (i -1) . nexadd = link1 ( i +1) . add ;
131 while ( link1 ( j ) . nexadd ~= link1 ( i +1) . add )
132 link2 ( j ) = link1 ( j ) ;
133 j = j +1;
134 end
135 if ( j ~= i -1)
136 link2 ( j ) = link1 ( j ) ;
137 link2 ( j +1) = link1 ( j +1) ;
138 k = i +1;
139 l =2;
140 else
141 link2 ( j ) = link1 ( j ) ;
142 k = i +1;
143 l =1;
144 end
145 while ( link1 ( k ) . nexadd ~= link1 (1) (1) . add )
146 link2 ( j + l ) = link1 ( k ) ;
147 k = k +1;
148 l = l +1;
149 end
150 link2 ( j + l ) = link1 ( k ) ;
151 end
152 else
153 if ( i == pos )
154 j =1;
155 link1 (i -1) . nexadd = link1 (1) (1) . add ;
156 while (j <= i -1)
157 link2 ( j ) = link1 ( j ) ;
158 j = j +1;
159 end
160 end
161 end
59
162 end
163 end
164
165 endfunction
166 function [ sta ]= push ( ele , stack )
167 if ( stack . top ==0)
168 stack . a = ele ;
169 stack . top = stack . top +1;
170 sta = stack ;
171 else
172 i =1;
173 link1 = struct ( ’ d a t a ’ ,0 , ’ add ’ ,0 , ’ nexadd ’ ,0) ;
174 while (i <= stack . top )
175 link1 = append ( stack . a ( i ) , link1 ) ;
176 i = i +1;
177 end
178 link1 = append ( ele , link1 ) ;
179 stack . top = stack . top +1;
180 a =[ stack . a (: ,:) link1 ( stack . top ) . data ];
181 stack . a = a ;
182 sta = stack ;
183 end
184 endfunction
185 function [ ele , sta ]= pop ( stack )
186 ele = -1;
187 sta =0;
188 if ( stack . top ==0)
189 disp ( ” S t a c k U n d e r f l o w ” ) ;
190 return ;
191 else
192 i =1;
193 link1 = struct ( ’ d a t a ’ ,0 , ’ add ’ ,0 , ’ nexadd ’ ,0) ;
194 while (i <= stack . top )
195 link1 = append ( stack . a ( i ) , link1 ) ;
196 i = i +1;
197 end
198 ele = link1 ( stack . top ) . data ;
199 link1 = delete1 ( stack . top , link1 ) ;
60
200 stack . top = stack . top -1;
201 i =2;
202 a = link1 (1) (1) . data
203 while (i <= stack . top )
204 a =[ a (: ,:) link1 ( i ) . data ];
205 i = i +1;
206 end
207 stack . a = a ;
208 sta = stack ;
209 end
210 endfunction
211 function [ stack ]= empty ()
212 stack = struct ( ’ a ’ ,0 , ’ t o p ’ ,0) ;
213 endfunction
214 // C a l l i n g R o u t i n e :
215 stack = empty () // C r e a t e an empty s t a c k
216 stack = push (4 , stack ) ;
217 stack = push (55 , stack ) ;
218 stack = push (199 , stack ) ;
219 stack = push (363 , stack ) ;
220 [ ele , stack ]= pop ( stack ) ;
221 disp ( stack , ” A f t e r t h e a b o v e o p e r a t i o n s s t a c k i s : ”);
1 // I m p l e m e n t i n g P r i o r i t y Queue U s i n g L i s t s
2 funcprot (0)
3 function [ link2 ]= insert_pri ( ele , link1 )
4 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
5 if ( link1 (1) (1) . add ==0)
6 link1 (1) (1) . data = ele ;
7 link1 (1) (1) . add =1;
8 link1 (1) (1) . nexadd =1;
61
9 link2 (1) = link1 (1) (1) ;
10 else
11 if ( link1 (1) (1) . nexadd == link1 (1) (1) . add )
12 if ( ele >= link1 (1) (1) . data )
13 t = ele ;
14 p = link1 (1) (1) . data ;
15 else
16 t = link1 (1) (1) . data ;
17 p = ele ;
18 end
19 link1 (1) (1) . data = t ;
20 lin2 = link1 (1) (1) ;
21 lin2 . data = p ;
22 lin2 . add =2;
23 lin2 . nexadd = link1 (1) (1) . add ;
24 link1 (1) (1) . nexadd = lin2 . add ;
25 link2 (1) = link1 (1) (1) ;
26 link2 (2) = lin2 ;
27 else
28 i =1;
29 a =[];
30 while ( link1 ( i ) . nexadd ~= link1 (1) (1) . add )
31 a =[ a (: ,:) link1 ( i ) . data ];
32 i = i +1;
33 end
34 a =[ a (: ,:) link1 ( i ) . data ];
35 a = gsort ( a ) ;
36 j =1;
37 while (j <= i )
38 link1 ( j ) . data = a ( j ) ;
39 j = j +1;
40 end
41 k =1;
42 while ( link1 ( k ) . data >= ele )
43 if ( link1 ( k ) . nexadd == link1 (1) (1) . add )
44 break ;
45 else
46 link2 ( k ) = link1 ( k ) ;
62
47 k = k +1;
48 end
49 end
50 if ( link1 ( k ) . nexadd ~= link1 (1) (1) . add )
51 lin2 = link1 ( k ) ;
52 lin2 . data = ele ;
53 lin2 . add = link1 ( k ) . add ;
54 j=k;
55 y = link1 (1) (1) . add ;
56 while ( link1 ( k ) . nexadd ~= y )
57 link1 ( k ) . add = link1 ( k ) . add +1;
58 link1 ( k ) . nexadd = link1 ( k ) . nexadd +1;
59 k = k +1;
60 end
61 link1 ( k ) . add = link1 ( k ) . add +1;
62 lin2 . nexadd = link1 ( j ) . add ;
63 link2 ( j ) = lin2 ;
64 j = j +1;
65 while (j <= k +1)
66 link2 ( j ) = link1 (j -1) ;
67 j = j +1;
68 end
69 else
70 lin2 = link1 ( k ) ;
71 lin2 . data = ele ;
72 lin2 . nexadd = link1 (1) (1) . add ;
73 lin2 . add = link1 ( k ) . add +1;
74 link1 ( k ) . nexadd = lin2 . add ;
75 j =1;
76 while (j <= k )
77 link2 ( j ) = link1 ( j ) ;
78 j = j +1;
79 end
80 link2 ( j ) = lin2 ;
81 end
82 end
83 end
84 endfunction
63
85 function [ ele , link2 ]= extract_min ( link1 ) ;
86 link2 = list
(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , ,0 ,0)
;
87 i =1;
88 ele = -1;
89 if ( link1 (1) (1) . add ==0)
90 disp ( ” U n d e r f l o w ” ) ;
91 return ;
92 else
93 if ( link1 (1) (1) . nexadd == link1 (1) (1) . add )
94 link1 (1) (1) . add =0;
95 link1 (1) (1) . nexadd =0;
96 ele = link1 (1) (1) . data ;
97 link1 (1) (1) . data =0;
98 link2 (1) = link1 (1) (1) ;
99 else
100 i =1;
101 while ( link1 ( i ) . nexadd ~= link1 (1) (1) . add )
102 link2 ( i ) = link1 ( i ) ;
103 i = i +1;
104 end
105 ele = link1 ( i ) . data ;
106 link2 (i -1) . nexadd = link2 (1) . add ;
107 end
108 end
109 endfunction
110 // C a l l i n g R o u t i n e :
111 link1 = struct ( ’ d a t a ’ ,0 , ’ add ’ ,0 , ’ nexadd ’ ,0) ;
112 link1 = insert_pri (3 , link1 ) ;
113 link1 = insert_pri (4 , link1 ) ;
114 link1 = insert_pri (22 , link1 ) ;
115 link1 = insert_pri (21 , link1 ) ;
116 link1 = insert_pri (11 , link1 ) ;
117 disp ( link1 , ” L i s t A f t e r I n s e r t i o n s ” ) ;
118 [ ele , link1 ]= extract_min ( link1 )
119 disp ( ele , ” Element a f t e r t h e min e x t r a c t i o n ” ) ;
64
Chapter 5
Trees
1
2 funcprot (0) ;
3 function [ tree ]= maketree ( x )
4 tree = zeros (30 ,1) ;
5 for i =1:30
6 tree ( i ) = -1;
7 end
8 tree (1) = x ;
9 tree (2) = -2;
10 endfunction
11 function [ tree1 ]= setleft ( tree , tre , x )
12 tree1 =[];
13 i =1;
14 while ( tree ( i ) ~= -2)
15 if ( tree ( i ) == tre )
16 j=i;
17 end
18 i = i +1;
19 end
20 if (i >2* j )
21 tree (2* j ) = x ;
65
22 else
23 tree (2* j ) = x ;
24 tree (2* j +1) = -2;
25 for l = i :2* j -1
26 tree ( i ) = -1;
27 end
28 end
29 tree1 = tree ;
30 endfunction
31 function [ tree1 ]= setright ( tree , tre , x )
32 tree1 =[];
33 i =1;
34 while ( tree ( i ) ~= -2)
35 if ( tree ( i ) == tre )
36 j=i;
37 end
38 i = i +1;
39 end
40 if (i >2* j +1)
41 tree (2* j +1) = x ;
42 else
43 tree (2* j +1) = x ;
44 tree (2* j +2) = -2;
45 for l = i :2* j
46 tree ( i ) = -1;
47 end
48 end
49 tree1 = tree ;
50 endfunction
51 function [ x ]= isleft ( tree , tre )
52 i =1;
53 x =0;
54 while ( tree ( i ) ~= -2)
55 if ( tree ( i ) == tre )
56 j=i;
57 end
58 i = i +1;
59 end
66
60 if (i >=2* j )
61 if (( tree (2* j ) ~= -1) |( tree (2* j ) ~= -2) )
62 x =1;
63 return 1;
64 else
65 return 0;
66 end
67 else
68 x =0;
69 return x ;
70 end
71 endfunction
72 function [ x ]= isright ( tree , tre )
73 i =1;
74 x =0;
75 while ( tree ( i ) ~= -2)
76 if ( tree ( i ) == tre )
77 j=i;
78 end
79 i = i +1;
80 end
81 if (i >=2* j +1)
82 if (( tree (2* j +1) ~= -1) |( tree (2* j +1) ~= -2) )
83 x =1;
84 return 1;
85 else
86 return 0;
87 end
88 else
89 x =0;
90 return x ;
91 end
92 endfunction
93 // C a l l i n g R o u t i n e :
94 tree = maketree (3) ;
95 disp ( tree , ” T r e e made ” ) ;
96 tree = setleft ( tree ,3 ,1) ;
97 disp ( tree , ” A f t e r s e t t i n g 1 t o l e f t o f 3 ” ) ;
67
98 tree = setright ( tree ,3 ,2) ;
99 disp ( tree , ” A f t e r s e t t i n g 2 t o r i g h t o f 3 ” ) ;
100 tree = setright ( tree ,2 ,4) ;
101 tree = setleft ( tree ,2 ,5) ;
102 tree = setright ( tree ,1 ,6) ;
103 tree = setright ( tree ,5 ,8) ;
104 disp ( tree , ” A f t e r a b o v e o p e r a t i o n s : ” ) ;
105 x = isright ( tree ,3) ;
106 disp (x , ” C h e c k i n g f o r t h e r i g h t s o n o f 3 y e s i f 1
e l s e no ” ) ;
107 x = isleft ( tree ,2) ;
108 disp (x , ” Check f o r l e f t s o n o f 2 ” ) ;
1 funcprot (0) ;
2 function [ tree ]= maketree ( x )
3 tree = zeros (30 ,1) ;
4 for i =1:30
5 tree ( i ) = -1;
6 end
7 tree (1) = x ;
8 tree (2) = -2;
9 endfunction
10 function [ tree1 ]= setleft ( tree , tre , x )
11 tree1 =[];
12 i =1;
13 while ( tree ( i ) ~= -2)
14 if ( tree ( i ) == tre )
15 j=i;
16 end
17 i = i +1;
18 end
19 if (i >2* j )
20 tree (2* j ) = x ;
68
21 else
22 tree (2* j ) = x ;
23 tree (2* j +1) = -2;
24 for l = i :2* j -1
25 tree ( i ) = -1;
26 end
27 end
28 tree1 = tree ;
29 endfunction
30 function [ tree1 ]= setright ( tree , tre , x )
31 tree1 =[];
32 i =1;
33 while ( tree ( i ) ~= -2)
34 if ( tree ( i ) == tre )
35 j=i;
36 end
37 i = i +1;
38 end
39 if (i >2* j +1)
40 tree (2* j +1) = x ;
41 else
42 tree (2* j +1) = x ;
43 tree (2* j +2) = -2;
44 for l = i :2* j
45 tree ( i ) = -1;
46 end
47 end
48 tree1 = tree ;
49 endfunction
50 function [ x ]= isleft ( tree , tre )
51 i =1;
52 x =0;
53 while ( tree ( i ) ~= -2)
54 if ( tree ( i ) == tre )
55 j=i;
56 end
57 i = i +1;
58 end
69
59 if (i >=2* j )
60 if (( tree (2* j ) ~= -1) |( tree (2* j ) ~= -2) )
61 x =1;
62 return 1;
63 else
64 return 0;
65 end
66 else
67 x =0;
68 return x ;
69 end
70 endfunction
71 function [ x ]= isright ( tree , tre )
72 i =1;
73 x =0;
74 while ( tree ( i ) ~= -2)
75 if ( tree ( i ) == tre )
76 j=i;
77 end
78 i = i +1;
79 end
80 if (i >=2* j +1)
81 if (( tree (2* j +1) ~= -1) |( tree (2* j +1) ~= -2) )
82 x =1;
83 return 1;
84 else
85 return 0;
86 end
87 else
88 x =0;
89 return x ;
90 end
91 endfunction
92 funcprot (0) ;
93 function []= inorder ( tree , p )
94 if ( tree ( p ) == -1| tree ( p ) == -2)
95 return ;
96 else
70
97 inorder ( tree ,2* p ) ;
98 printf ( ”%d\ t ” , tree ( p ) ) ;
99 inorder ( tree ,2* p +1) ;
100 end
101 endfunction
102 function []= preorder ( tree , p )
103 if ( tree ( p ) == -1| tree ( p ) == -2)
104 return ;
105 else
106 printf ( ”%d\ t ” , tree ( p ) ) ;
107 preorder ( tree ,2* p ) ;
108 preorder ( tree ,2* p +1) ;
109 end
110 endfunction
111 function []= postorder ( tree , p )
112 if ( tree ( p ) == -1| tree ( p ) == -2)
113 return ;
114 else
115 postorder ( tree ,2* p ) ;
116 postorder ( tree ,2* p +1) ;
117 printf ( ”%d\ t ” , tree ( p ) ) ;
118 end
119 endfunction
120 // C a l l i n g R o u t i n e :
121 tree = maketree (3) ;
122 tree = setleft ( tree ,3 ,1) ;
123 tree = setright ( tree ,3 ,2) ;
124 tree = setleft ( tree ,2 ,4) ;
125 tree = setright ( tree ,2 ,5) ;
126 disp ( ” I n o r d e r t r a v e r s a l ” ) ;
127 inorder ( tree ,1) ;
128 disp ( ” P r e o r d e r t r a v e r s a l ” ) ;
129 preorder ( tree ,1) ;
130 disp ( ” P o s t o r d e r t r a v e r s a l ” ) ;
131 postorder ( tree ,1) ;
71
Scilab code Exa 5.3 Implementing And traversing a Binary Search Tree
1 funcprot (0) ;
2 function [ tree ]= maketree ( x )
3 tree = zeros (1 ,30) ;
4 for i =1:30
5 tree ( i ) = -1;
6 end
7 tree (1) = x ;
8 tree (2) = -2;
9 endfunction
10 function [ tree1 ]= setleft ( tree , tre , x )
11 tree1 =[];
12 i =1;
13 while ( tree ( i ) ~= -2)
14 if ( tree ( i ) == tre )
15 j=i;
16 end
17 i = i +1;
18 end
19 if (i >2* j )
20 tree (2* j ) = x ;
21 else
22 tree (2* j ) = x ;
23 tree (2* j +1) = -2;
24 for l = i :2* j -1
25 tree ( i ) = -1;
26 end
27 end
28 tree1 = tree ;
29 endfunction
30 function [ tree1 ]= setright ( tree , tre , x )
31 tree1 =[];
32 i =1;
72
33 while ( tree ( i ) ~= -2)
34 if ( tree ( i ) == tre )
35 j=i;
36 end
37 i = i +1;
38 end
39 if (i >2* j +1)
40 tree (2* j +1) = x ;
41 else
42 tree (2* j +1) = x ;
43 tree (2* j +2) = -2;
44 for l = i :2* j
45 tree ( i ) = -1;
46 end
47 end
48 tree1 = tree ;
49 endfunction
50 function [ x ]= isleft ( tree , tre )
51 i =1;
52 x =0;
53 while ( tree ( i ) ~= -2)
54 if ( tree ( i ) == tre )
55 j=i;
56 end
57 i = i +1;
58 end
59 if (i >=2* j )
60 if (( tree (2* j ) ~= -1) |( tree (2* j ) ~= -2) )
61 x =1;
62 return 1;
63 else
64 return 0;
65 end
66 else
67 x =0;
68 return x ;
69 end
70 endfunction
73
71 function [ x ]= isright ( tree , tre )
72 i =1;
73 x =0;
74 while ( tree ( i ) ~= -2)
75 if ( tree ( i ) == tre )
76 j=i;
77 end
78 i = i +1;
79 end
80 if (i >=2* j +1)
81 if (( tree (2* j +1) ~= -1) |( tree (2* j +1) ~= -2) )
82 x =1;
83 return 1;
84 else
85 return 0;
86 end
87 else
88 x =0;
89 return x ;
90 end
91 endfunction
92 funcprot (0) ;
93 function []= inorder ( tree , p )
94 if ( tree ( p ) == -1| tree ( p ) == -2)
95 return ;
96 else
97 inorder ( tree ,2* p ) ;
98 disp ( tree ( p ) ,” ” ) ;
99 inorder ( tree ,2* p +1) ;
100 end
101 endfunction
102 function []= preorder ( tree , p )
103 if ( tree ( p ) == -1| tree ( p ) == -2)
104 return ;
105 else
106 disp ( tree ( p ) ,” ” ) ;
107 preorder ( tree ,2* p ) ;
108 preorder ( tree ,2* p +1) ;
74
109 end
110 endfunction
111 function []= postorder ( tree , p )
112 if ( tree ( p ) == -1| tree ( p ) == -2)
113 return ;
114 else
115 postorder ( tree ,2* p ) ;
116 postorder ( tree ,2* p +1) ;
117 disp ( tree ( p ) ,” ” ) ;
118 end
119 endfunction
120 function [ tree1 ]= binary ( tree , x )
121 p =1;
122 while ( tree ( p ) ~= -1& tree ( p ) ~= -2)
123 q=p;
124 if ( tree ( p ) >x )
125 p =2* p ;
126 else
127 p =2* p +1;
128 end
129 end
130 i =1;
131 while ( tree ( i ) ~= -2)
132 i = i +1;
133 end
134 if ( tree ( q ) >x )
135 if ( i ==2* q )
136 tree (2* q ) = x ;
137 tree (2* q +1) = -2
138 else
139 if (i <2* q )
140 tree ( i ) = -1;
141 tree (2* q +1) = -2;
142 tree (2* q ) = x ;
143 end
144 end
145
146 else
75
147 if ( i ==2* q +1)
148 tree (2* q +1) = x ;
149 tree (2* q +2) = -2;
150 else
151 if (i <2* q +1)
152 tree ( i ) = -1;
153 tree (2* q +1) = x ;
154 tree (2* q +2) = -2;
155 end
156 end
157
158 end
159 tree1 = tree ;
160 endfunction
161 // C a l l i n g R o u t i n e :
162 tree = maketree (3) ;
163 tree = binary ( tree ,1) ;
164 tree = binary ( tree ,2) ;
165 tree = binary ( tree ,4) ;
166 tree = binary ( tree ,5) ;
167 disp ( tree , ” B i n a r y t r e e t h u s o b t a i n e by i n s e r t i n g
1 , 2 , 4 and5 i n t r e e r o o t e d 3 i s : ” ) ;
Scilab code Exa 5.4 Checking the duplicate number using BST
76
11 if ( tree ( q ) >x )
12 if ( tree (2* q ) == -2)
13 tree (2* q ) = x ;
14 tree (2* q +1) = -2;
15 else
16 tree (2* q ) = x ;
17 end
18 else
19 if ( tree (2* q +1) == -2)
20 tree (2* q +1) = x ;
21 tree (2* q +2) = -2;
22 else
23 tree (2* q +1) = x ;
24 end
25 end
26 tree1 = tree ;
27 endfunction
28 funcprot (0) ;
29 function [ tree ]= maketree ( x )
30 tree = zeros (40 ,1) ;
31 for i =1:40
32 tree ( i ) = -1;
33 end
34 tree (1) = x ;
35 tree (2) = -2;
36 endfunction
37 function []= duplicate1 (a , n )
38 tree = maketree ( a (1) ) ;
39 q =1;
40 p =1;
41 i =2;
42 x=a(i)
43 while (i < n )
44 while ( tree ( p ) ~= x & tree ( q ) ~= -1& tree ( q ) ~= -2)
45 p=q;
46 if ( tree ( p ) <x )
47 q =2* p ;
48 else
77
49 q =2* p +1;
50 end
51 end
52 if ( tree ( p ) == x )
53 disp (x , ” D u p l i c a t e ” ) ;
54 else
55 tree = binary ( tree , x ) ;
56 end
57 i = i +1;
58 x=a(i);
59 end
60 while ( tree ( p ) ~= x & tree ( q ) ~= -1& tree ( q ) ~= -2)
61 p=q;
62 if ( tree ( p ) <x )
63 q =2* p ;
64 else
65 q =2* p +1;
66 end
67 end
68 if ( tree ( p ) == x )
69 disp (x , ” D u p l i c a t e ” ) ;
70 else
71 tree = binary ( tree , x ) ;
72 end
73 endfunction
74 // C a l l i n g A d r e s s :
75 a =[22 11 33 22 211 334]
76 duplicate1 (a ,6)
77 a =[21 11 33 22 22 334]
78 duplicate1 (a ,6)
78
Chapter 6
Sorting
1 function [ a1 ]= bubble (a , n )
2 i =1;
3 j =1;
4 temp =0;
5 for i =1: n -1
6 for j =1: n - i
7 if ( a ( j ) >a ( j +1) )
8 temp = a ( j ) ;
9 a ( j ) = a ( j +1) ;
10 a ( j +1) = temp ;
11 end
12 j = j +1;
13 end
14 i = i +1;
15 end
16 a1 = a ;
17 disp ( a1 , ” S o r t e d a r r a y i s : ” ) ;
18 endfunction
19 // C a l l i n g R o u t i n e :
20 a =[23 21 232 121 2324 1222433 1212]
21 disp (a , ” Given Array ” ) ;
79
22 a1 = bubble (a ,7)
1 function [ a1 ]= quick ( a ) ;
2 a = gsort ( a ) ; // IN BUILT QUICK SORT FUNCTION
3 n = length ( a ) ;
4 a1 =[];
5 for i =1: n
6 a1 =[ a1 (: ,:) a ( n +1 - i ) ];
7 end
8 disp ( a1 , ” S o r t e d a r r a y i s : ” ) ;
9 endfunction
10 // C a l l i n g R o u t i n e :
11 a =[23 21 232 121 2324 1222433 1212]
12 disp (a , ” Given Array ” ) ;
13 a1 = quick ( a )
1 function [ a1 ]= selection (a , n )
2 i=n;
3 while (i >=1)
4 large = a (1) ;
5 indx =1;
6 for j =1: i
7 if ( a ( j ) > large )
8 large = a ( j ) ;
9 indx = j ;
10 end
11 end
12 a ( indx ) = a ( i ) ;
13 a ( i ) = large ;
80
14 i =i -1;
15 end
16 a1 = a ;
17 disp ( a1 , ” S o r t e d a r r a y i s : ” ) ;
18 endfunction
19 // C a l l i n g R o u t i n e :
20 a =[23 21 232 121 2324 1222433 1212]
21 disp (a , ” Given Array ” ) ;
22 a1 = selection (a ,7)
1 function [ a1 ]= insertion (a , n )
2 for k =1: n
3 y=a(k);
4 i=k;
5 while (i >=1)
6 if (y < a ( i ) )
7 a ( i +1) = a ( i ) ;
8 a(i)=y;
9 end
10 i =i -1;
11 end
12 end
13 a1 = a ;
14 disp ( a1 , ” S o r t e d a r r a y i s : ” ) ;
15 endfunction
16 // C a l l i n g R o u t i n e :
17 a =[23 21 232 121 2324 1222433 1212]
18 disp (a , ” Given Array ” ) ;
19 a1 = insertion (a ,7)
81
1 function [ a1 ]= shell (a ,n , incr , nic )
2 for i =1: nic
3 span = incr ( i ) ;
4 for j = span +1: n
5 y=a(j);
6 k =j - span ;
7 while (k >=1& y < a ( k ) )
8 a ( k + span ) = a ( k ) ;
9 k =k - span ;
10 end
11 a ( k + span ) = y ;
12 end
13 end
14 a1 = a ;
15 disp ( a1 , ” S o r t e d a r r a y i s : ” ) ;
16 endfunction
17 // C a l l i n g R o u t i n e :
18 a =[23 21 232 121 2324 1222433 1212]
19 disp (a , ” Given Array ” ) ;
20 incr =[5 3 1] // must a l w a y s end w i t h 1
21 a1 = shell (a ,7 , incr ,3)
1 function [ a1 ]= mergesort (a ,p , r )
2 if (p < r )
3 q = int (( p + r ) /2) ;
4 a = mergesort (a ,p , q ) ;
5 a = mergesort (a , q +1 , r ) ;
6 a = merge (a ,p ,q , r ) ;
7 else
8 a1 = a ;
9 return ;
10 end
11 a1 = a ;
82
12 endfunction
13 function [ a1 ]= merge (a ,p ,q , r )
14 n1 =q - p +1;
15 n2 =r - q ;
16 left = zeros ( n1 +1) ;
17 right = zeros ( n2 +1) ;
18 for i =1: n1
19 left ( i ) = a ( p +i -1) ;
20 end
21 for i1 =1: n2
22 right ( i1 ) = a ( q + i1 ) ;
23 end
24 left ( n1 +1) =999999999;
25 right ( n2 +1) =999999999;
26 i =1;
27 j =1;
28 k=p;
29 for k = p : r
30 if ( left ( i ) <= right ( j ) )
31 a ( k ) = left ( i ) ;
32 i = i +1;
33 else
34 a ( k ) = right ( j ) ;
35 j = j +1;
36 end
37 end
38 a1 = a ;
39 endfunction
40 // C a l l i n g R o u t i n e :
41 a =[23 21 232 121 26324 1222433 14212]
42 disp (a , ” Given Array ” ) ;
43 a1 = mergesort (a ,1 ,7)
44 disp ( a1 , ” S o r t e d a r r a y i s : ” ) ;
45 a =[232 11212 3443 23221 123424 32334 12212 2443 232]
46 disp (a , ” Given Array ” ) ;
47 a1 = mergesort (a ,1 ,9) ;
48 disp ( a1 , ” S o r t e d Array ” ) ;
83
Scilab code Exa 6.7 Binary Tree Sort
84
33 inorder ( tree ,2* p +1) ;
34 end
35 endfunction
36 function []= binsort (a , n )
37 a1 = maketree ( a (1) )
38 for i =2: n
39 a1 = binary ( a1 , a ( i ) ) ;
40 end
41 disp ( ” S o r t e d a r r a y i s : ” ) ;
42 inorder ( a1 ,1) ;
43 endfunction
44 // C a l l i n g R o u t i n e :
45 a =[23 21 232 121 2324 1222433 1212]
46 disp (a , ” Given Array ” ) ;
47 a1 = binsort (a ,7)
85
Chapter 7
Searching
86
1 function []= sortedsearch (a ,n , ele )
2 if ( a (1) > ele | a ( n ) < ele )
3 disp ( ”NOT IN THE LIST ” ) ;
4 else
5 i =1;
6 j =0;
7 for i =1: n
8 if ( a ( i ) == ele )
9 printf ( ”FOUND %d AT %d” ,ele , i ) ;
10 j =1;
11 else
12 if ( a ( i ) > ele )
13 break ;
14 end
15 end
16 end
17 if ( j ==0)
18 disp ( ”%d NOT FOUND” , ele ) ;
19 end
20 end
21 endfunction
22 // C a l l i n g R o u t i n e :
23 a =[2 22 23 33 121 222 233] // a s h o u l d be sorted
24 disp (a , ” Given a r r a y ” ) ;
25 search (a ,7 ,23)
87
8 break ;
9 else
10 if ( a ( mid ) >i )
11 h = mid -1;
12 else
13 l = mid +1;
14 end
15 end
16 end
17 endfunction
18 // C a l l i n g R o u t i n e :
19 a =[2 22 23 33 121 222 233] // a s h o u l d be sorted
20 disp (a , ” Given a r r a y ” ) ;
21 search (a ,7 ,23)
88
Chapter 8
Graphs
1 // S i m p l e Graph F u n c t i o n s
2 function []= graph () ;
3
4 i =1 , j =1;
5 adj = zeros (10000) ;
6 for i =1: n
7 for j =1: n
8
9 adj (( i -1) * n + j ) = temp ;
10 end
11 end
12 for i =1: n
13 for j =1: n
14 if (( adj (( i -1) * n + j ) ) ==1)
15 printf ( ” V e r t e x %d i s c o n n e c t e d t o v e r t e x %d\
n ” ,i , j ) ;
16 end
17 end
18 end
19
20 endfunction
89
Scilab code Exa 8.2 Finding The Number Of Paths From One Vertex-
ToOther
Scilab code Exa 8.3 Finding The Number Of Simple Paths From One
Point
90
2 funcprot (0)
3 function []= sim_path (n , adj ,i , j ) ;
4 l =0;
5 m =1;
6 for m =1: n
7 l = l + path (m ,n , adj ,i , j ) ;
8 end
9 printf ( ” There a r e %d s i m p l e p a t h s from %d t o %d
i n t h e g i v e n g r a p h \n ” ,l ,i , j ) ;
10 endfunction
11 function [ b ]= path (k ,n , adj ,i , j )
12 b =0;
13 if ( k ==1)
14 b = adj (( i -1) * n + j ) ;
15 else
16 for c =1: n
17 if ( adj (( i -1) * n + c ) ==1)
18 b = b + path (k -1 ,n , adj ,c , j ) ;
19 end
20 end
21 end
22 return b ;
23 endfunction
24 n =3;
25 adj =[0 1 1 0 0 1 0 0 0];
26 b = sim_path (n , adj ,1 ,3)
1 // F i n n d i n g T r a n s i t i v e C l o s u r e
2 funcprot (0)
3 function [ path ]= Tranclose ( adj , n ) ;
4 i =1 , j =1;
5 path = zeros ( n *n ,1) ;
6 path = tranclose ( adj , n ) ;
91
7 printf ( ” T r a n s i t i v e C l o s u r e Of Given Graph i s : \ n ” ) ;
8 for i =1: n
9 printf ( ” For V e r t e x %d\n ” ,i ) ;
10 for j =1: n
11 printf ( ” %d %d i s %d\n ” ,i ,j , path (( i -1) * n + j ) ) ;
12 end
13 end
14
15 endfunction
16 function [ path ]= tranclose ( adj , n )
17 adjprod = zeros ( n *n ,1) ;
18 k =1;
19 newprod = zeros ( n *n ,1) ;
20 for i =1: n
21 for j =1: n
22 path (( i -1) * n + j ) = adj (( i -1) * n + j ) ;
23 adjprod (( i -1) * n + j ) = path (( i -1) * n + j ) ;
24 end
25 end
26 for i =1: n
27 newprod = prod1 ( adjprod , adj , n ) ;
28 for j =1: n
29 for k =1: n
30 path (( j -1) * n + k ) = path (( j -1) * n + k ) | newprod (( j
-1) * n + k ) ;
31 end
32 end
33 for j =1: n
34 for k =1: n
35 adjprod (( j -1) * n + k ) = newprod (( j -1) * n + k ) ;
36 end
37 end
38 end
39 endfunction
40 function [ c ]= prod1 (a ,b , n )
41 for i =1: n
42 for j =1: n
43 val =0
92
44 for k =1: n
45 val = val |( a (( i -1) * n + k ) & b (( k -1) * n + j ) ) ;
46 end
47 c (( i -1) * n + j ) = val ;
48 end
49 end
50 endfunction
51 // C a l l i n g R o u t i n e :
52 n =3;
53 adj =[0 1 0 0 0 1 0 0 0]
54 path = Tranclose ( adj , n )
1 // W a r s h a l l ’ s A l g o r i t h m
2 funcprot (0)
3 function [ path ]= transclose ( adj , n )
4 for i =1: n
5 for j =1: n
6 path (( i -1) * n + j ) = adj (( i -1) * n + j ) ;
7 end
8 end
9 for k =1: n
10 for i =1: n
11 if ( path (( i -1) * n + k ) ==1)
12 for j =1: n
13 path (( i -1) * n + j ) = path (( i -1) * n + j ) | path (( k -1)
*n+j);
14 end
15 end
16 end
17 end
18 printf ( ” T r a n s i t i v e c l o s u r e f o r t h e g i v e n g r a p h i s
: \ n”);
19 for i =1: n
93
20 printf ( ” For v e r t e x %d \n ” ,i ) ;
21 for j =1: n
22 printf ( ”%d %d i s %d\n ” ,i ,j , path (( i -1) * n + j ) ) ;
23 end
24 end
25 endfunction
26 // C a l l i n g R o u t i n e :
27 n =3;
28 adj =[0 1 0 0 0 1 0 0 0]
29 path = Tranclose ( adj , n )
1 // Depth F i r s t S e a r c h T r a v e r s a l
2 funcprot (0)
3 function []= Dfs ( adj , n ) ;
4 i =1 , j =1;
5 colour =[];
6 for i =1: n
7 for j =1: n
8 colour =[ colour (: ,:) 0];
9 end
10 end
11 disp ( ” The DFS t r a v e r s a l i s ” ) ;
12 dfs ( adj , colour ,1 , n ) ;
13 endfunction
14 function []= dfs ( adj , colour ,r , n )
15 colour ( r ) =1;
16 disp (r , ” ” ) ;
17 for i =1: n
18 if ( adj (( r -1) * n + i ) &( colour ( i ) ==0) )
19 dfs ( adj , colour ,i , n ) ;
20 end
21 end
22 colour ( r ) =2;
94
23 endfunction
24 // C a l l i n g R o u t i n e :
25 n =4;
26 adj =[0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0]
27 Dfs ( adj , n )
1 // //BFS T r a v e r s a l
2 funcprot (0)
3 function [ q2 ]= push ( ele , q1 )
4 if ( q1 . rear == q1 . front )
5 q1 . a = ele ;
6 q1 . rear = q1 . rear +1;
7 else
8 q1 . a =[ q1 . a (: ,:) ele ];
9 q1 . rear = q1 . rear +1;
10 end
11 q2 = q1 ;
12 endfunction
13 function [ ele , q2 ]= pop ( q1 )
14 ele = -1;
15 q2 =0;
16 if ( q1 . rear == q1 . front )
17 return ;
18 else
19 ele = q1 . a ( q1 . rear - q1 . front ) ;
20 q1 . front = q1 . front +1;
21 i =1;
22 a = q1 . a (1) ;
23 for i =2:( q1 . rear - q1 . front )
24 a =[ a (: ,:) q1 . a ( i ) ];
25 end
26 q1 . a = a ;
27 end
95
28 q2 = q1 ;
29 endfunction
30
31 function []= Bfs ( adj , n ) ;
32 i =1 , j =1;
33 colour =[];
34 for i =1: n
35 for j =1: n
36 colour =[ colour (: ,:) 0];
37 end
38 end
39 disp ( ” The BFS T r a v e r s a l i s ” ) ;
40 bfs ( adj , colour ,1 , n ) ;
41 endfunction
42 function []= bfs ( adj , colour ,s , n )
43 colour ( s ) =1;
44 q = struct ( ’ r e a r ’ ,0 , ’ f r o n t ’ ,0 , ’ a ’ ,0) ;
45 q = push (s , q ) ;
46 while (( q . rear ) -( q . front ) >0)
47 [u , q ]= pop ( q ) ;
48 disp (u , ” ” ) ;
49 for i =1: n
50 if ( adj (( u -1) * n + i ) &( colour ( i ) ==0) )
51 colour ( i ) =1;
52 q = push (i , q ) ;
53 end
54 end
55 colour ( u ) =2;
56 end
57 endfunction
58 // C a l l i n g R o u t i n e :
59 n =4;
60 adj =[0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0]
61 Bfs ( adj , n )
96
Scilab code Exa 8.8 Dijkstras Algorithm
1 // D i j k s t r a s A l g o r i t h m
2 funcprot (0)
3 function [ l ]= short ( adj ,w , i1 , j1 , n )
4 for i =1: n
5 for j =1: n
6 if ( w (( i -1) * n + j ) ==0)
7 w (( i -1) * n + j ) =9999;
8 end
9 end
10 end
11
12 distance =[];
13 perm =[];
14 for i =1: n
15 distance =[ distance (: ,:) 99999];
16 perm =[ perm (: ,:) 0];
17 end
18 perm ( i1 ) =1;
19 distance ( i1 ) =0;
20 current = i1 ;
21 while ( current ~= j1 )
22 smalldist =9999;
23 dc = distance ( current ) ;
24 for i =1: n
25 if ( perm ( i ) ==0)
26 newdist = dc + w (( current -1) * n + i ) ;
27 if ( newdist < distance ( i ) )
28 distance ( i ) = newdist ;
29 end
30 if ( distance ( i ) < smalldist )
31 smalldist = distance ( i ) ;
32 k=i;
33 end
34 end
35 end
36 current = k ;
97
37 perm ( current ) =1;
38 end
39 l = distance ( j1 ) ;
40 printf ( ” The s h o r t e s t p a t h b e t w e e n %d and %d i s %d
” ,i1 , j1 , l ) ;
41 endfunction
42 // C a l l i n g R o u t i n e :
43 n =3;
44 adj =[0 1 1 0 0 1 0 0 0] // A d j a c e n c y List
45 w =[0 12 22 0 0 9 0 0 0] // w e i g h t l i s t f i l l 0 f o r no
edge
46 short ( adj ,w ,1 ,3 , n ) ;
98