Module-1 DS Notes
Module-1 DS Notes
MODULE-1
Syllabus
Introduction: Data Structures, Classifications (Primitive & Non Primitive), Data structure
Operations, Review of Arrays, Structures, Self-Referential Structures, and Unions. Pointers and
Dynamic Memory Allocation Functions. Representation of Linear Arrays in Memory, Dynamically
allocated arrays, Array Operations: Traversing, inserting, deleting, searching, and sorting.
Multidimensional Arrays, Polynomials and Sparse Matrices. Strings: Basic Terminology, Storing,
Operations and Pattern Matching algorithms. Programming Examples.
Introduction
Data is a value or a set of values. Data as such may not convey any meaning.
Example 90, Bob
When data is interpreted to convey a meaning we call it an information.
For example Bob scored 90 marks
A data item refers to a single unit of values. Data items that are divided into sub items are
called group items.
Example :Name of an employee can be divided to three subitems- first name, middle
name and last name
Data items that are not divided into sub items are called elementary items.
Data Structures: A data structure is a particular method of storing and organizing data
in acomputer so that it can be used efficiently. The data Structure is classified into
a. Primitive data structure: These can be manipulated directly by the machine instructions.
Example integer character, float etc
b. Non primitive data structures: They cannot be manipulated directly by the machine
instructions. The non primitive data structures are further classified into linear and non linear
data structures.
Linear data structures: show the relationship of adjacency between the elements of
the data structures. Example are arrays, stacks, queues , list etc.
Non linear data structure: They do not show the relationship of adjacency between
the elements. Example are Trees and graphs
Review of arrays
Array is a collection of elements of the same data type
An array is declared by appending brackets to the name of a variable.
For example
In C all array index start at 0 and so list[0],list[1],list[2],list[3],list[4] are the names of the five array
elements each of which contains an integer value.
Structures : Structure is basically a user-defined data type that can store related information
that may be of same or different data types together.
The major difference between a structure and an array is that an array can store only information of
same data type. A structure is therefore a collection of variables under a single name. The variables
within a structure are of different data types and each has a name that is used to select it from the
structure.
For example,
Struct student {
char sname[10];
int age;
float average_marks;
} st;
To assign values to these fields dot operator (. ) is used as the structure member operator. We use
this operator to select a particular member of the structure.
strcpy(st.sname,"james");
st.age = 10;
st.average_marks = 35;
We can create our own structure data types by using the typedef statement. Consider an example
that creates a structure for the employee details.
Comparing structures: Return TRUE if employee 1 and employee 2 are the same
otherwisereturn FALSE
Nested Structure: A structure can be embedded within another structure. That is a structure
canhave another structure as its member such a structure is called a nested structure.
For example, associated with our employee structure we may wish to include the date of Birth of an
employee by using nested stucture
typedef struct {
int month;
int day;
int year;
} date;
typedef struct {
char name[10];
int age;
float salary;
date dob;
}employee;
A person born on September 10, 1974, would have the values for the date struct set as:
p1.dob.month = 9;
p1.dob.day = 10;
p1.dob.year = 1974;
Array of Structures: In the case of a student or the employee we may not store the details
ofonly 1 student or 1 employee. When we have to store the details of a group of students
we can declare an array of structures.
Example:
typedef struct list {
int data;
list *link ;
};
Each instance of the structure list will have two components, data and link. data is a single
character, while link is a pointer to a list structure.
The value of link is either the address in memory of an instance of list or the null pointer.
Consider these statements, which create three structures and assign values to their respective fields:
list item1, item2, item3;
item1.data = 5
item2.data = 10
item3.data = 15
item1.link = item2.link = item3.link = NULL;
We can attach these structures together by replacing the null link field in item 2 with one that points
to item 3 and by replacing the null link field in item 1 with one that points to item 2.
item1.link = &item2; item2.1ink = &item3;
Unions: A union is a user-defined data type that can store related information that may be of
different data types or same data type, but the fields of a union must share their memory
space. This means that only one field of the union is "active" at any given time.
Example1: Suppose a program uses either a number that is int or float we can define a union as
Union num
{
int a;
float b;
};
Union num n1;
Now we can store values as n1.a=5 or n2.b= 3.14 only one member is active at a point of time.
These errors are difficult to debug and correct, therefore a pointer should always be initialized with a
valid memory address.
//Here the variable a and the pointer variable p are of the same data type. To make p to point at a we
have to write a statement
p=&a; // now the address of a is stored in the pointer variable p and now p is said to be
pointing at a.
If we do not want the pointer variable to point at anything we can initialize it to point at NULL
NOTE: A pointer variable can only point at a variable of the same type.
We can have more than one pointer variable pointing at the same variable. For example
int a;
int *p,*q;
p=&a;
q=&a;
now both the pointer variable p and q are pointing at the same variable a. There is no limit to the
number of pointer variable that can point to a variable.
Note:
we need parenthesis for expressions like (*p) ++ as the precedence of postfix increment is
more than precedence of the indirection operator (*). If the parenthesis is not used the address
will be incremented.
The indirection and the address operators are the inverse of each other when combined in an
expression such as *&a they cancel each other
Memory allocation functions: In high level languages the data structures are fully defined
at compile time. Modern languages like C can allocate memory at execution this feature is
known as dynamic memory allocation.
There are two ways in which we can reserve memory locations for a variable
Static memory allocation: the declaration and definition of memory should be specified in
the source program. The number of bytes reserved cannot be changed during runtime
Dynamic memory allocation : Data definition can be done at runtime .It uses predefined
functions to allocate and release memory for data while the program is running. To use
dynamic memory allocation the programmer must use either standard data types or must
declare derived data types
Memory usage: Four memory management functions are used with dynamic memory. malloc, calloc
and realloc are used for memory allocation. The function free is used to return memory when it is not
used.
Heap: It is the unused memory allocated to the program When requests are made by memory
allocating functions, memory is allocated from the heap at run time.
Releasing memory (free): When memory locations allocated are no longer needed, they should be
freed by using the predefined function free.
Syntax: free(void*);
Example: int *p,a;
p=&a;
free(p);
Example: To allocate a one dimensional array of integers whose capacity is n the following code can
be written.
int *ptr
ptr=(int*)calloc(n,sizeof(int))
Reallocation of memory(realloc): The function realloc resizes the memory previously allocated by
either malloc or calloc.
Example
int *p;
p=(int*)calloc(n,sizeof(int))
p=realloc(p,s) /*where s is the new size*/
The statement realloc(p,s) -- Changes the size of the memory pointed by p to s. The existing contents
of the block remain unchanged.
When s> oldsize(Block size increases) the additional (s – oldsize )have unspecified value
When s<oddsize (Block size reduces) the rightmost (oldsize-s) bytes of the old block are freed.
When realloc is able to do the resizing it returns a pointer to the start of the new block
When is not able to do the resizing the old block is unchanged and the function returns the
value NULL.
Dangling Reference: Once a pointer is freed using the free function then there is no way to retrieve
this storage and any reference to this location is called dangling reference.
Example2:
int i,*p,*f;
i=2;
p=&i;
f=p;
free(p);
*f=*f+2 /* Invalid dangling reference*/
The location that holds the value 2 is freed but still there exist a reference to this location through f
and pointer f will try to access a location that is freed so the pointer f is a dangling reference
Pointers can be dangerous: When pointers are used the following points needs to be taken care
1. When a pointer is not pointing at any object it is a good practise to set it to NULL so that there
is no attempt made to access a memory location that is out of range of our program or that does
not contain a pointer reference to the legitimate object.
One dimensional array: When we cannot determine the exact size of the array the space of the array
can be allocated at runtime.
For example consider the code given below
int i,n,*list;
printf(“enter the size of the array”);
scanf(“%d”,&n);
if (n<1)
{
fprintf(stderr,”Improper values of n \n”);
exit();
}
list=(int*) malloc (n*sizeof(n))/* or list=(int*)calloc(n,sizeof(int))
In C we find the element x[i][j] by first accessing the pointer in x[i]. This pointer gives the address
of the zeroth element of row i of the array. Then by adding j*sizeof(int) to this pointer, the address
of the jth element of the ith row is determined
Example to find x[1][3] we first access the pointer in x[1] this pointer gives the address of x[1][0]
now by adding 3*sizeof (int) the address of the element x[1][3] is determined.
Arrays
Linear Arrays: A Linear Array is a list of finite number (n) of homogenous data elements.
a. The elements of the array are referenced by an index set consisting of n consecutive
numbers(0... (n-1)).
b. The elements of the array are stored in successive memory locations
c. The number n of elements is called the length or size of the array. Length of the array can be
obtained from the index set using the formula
Length = Upper bound – Lowe bound +1
d. The elements of an array may be denoted by a[0],a[2]........... a[n-1]. The number k in a[k] is
called a subscript or index and a[k] is called the subscripted value.
e. An array is usually implemented as a consecutive set of memory locations
Declaration: Linear arrays are declared by adding a bracket to the name of a variable. The size of
the array is mentioned within the brackets.
In C all arrays start at index 0. Therefore, list[0], list[1], list[2], list[3], and list[4] are the names of
the five array elements ,each of which contains an integer value.
Two dimensional arrays: C uses the array of array representation to represent a multidimensional
array. In this representation a 2 dimensional array is represented as a one dimensional array in which
each element is itself a one dimensional array.
A two dimensional m X n array A is a collection of m* n data elements such that each element
is specified by a pair of integers called subscripts.
An element with subscript i and j will be represented as A[i][j]
Declaration: int A[3][5];
// It declares an array A that contains three elements where each element is a one
dimensional array. Each one dimensional array has 5 integer elements.
0 1 2 3
0 A[0][0] A[0][1] A[0][2] A[0][3]
Rows 1 A[1][0] A[1][1] A[1][2] A[1][3]
2 A[2][0] A[2][1] A[2][2] A[2][3]
Example: Representation of the two dimensional array A[3][4] in row major order and column major
order
A Subscript A Subscript
A[0][0] A[0][0] Column1
A[0][1] A[1][0]
Row1
A[0][2] A[2][0]
A[0][3] A[0][1] Column2
A[1][0] A[1][1]
A[1][1] A[2][1]
Row2
A[1][2] A[0][2] Column3
A[1][3] A[1][2]
A[2][0] A[2][2]
A[2][1] A[0][3] Column4
Row3
A[2][2] A[1][3]
A[2][3] A[2][3]
Using the base address , the address of any element in an array A of size row X col can be
calculated using the formula.
Row Major order
Address (A[i][j]) = Base address + w[ i*col+ j] considering the array indexing starts at 0
Column Major order
Address (A[i][j]) = Base address + w[ i+row.j] considering the array indexing starts at 0
Example : When the compiler encounters an array declaration such as int A[3][4] it creates an array
A and allocates 20 consecutive memory locations. Each memory location is large enough to hold a
single integer.
Let α be the address of the first element A[0][0], is called the base address
Considering Row major order: Using the bases address we can calculate the addresses of other
element
Address of A[0][1] = 100 +2[0*4+ 1]= 100 +2=102
Address of A[0][2] = 100 +2[0*4+ 2]= 100 +4=104
Address of A[1][0] = 100 +2[1*4+ 0]= 100 +8=108
Addres of A[2][3]= 100 +2[2*4+3]= 100+22= 122
where Π is the product of the upperi's. For instance, if we declare a as a[10][10][10], then we require
10·10·10 = 1000 memory cell to hold the array. There are two common ways to represent
multidimensional arrays: row major order and column major order. We consider only row major order
here. As its name implies, row major order stores multidimensional arrays by rows.
Array Operations: Operations that can be performed on any linear structure whether it is
anarray or a linked list include the following
a. Traversal- processing each element in the list
b. Search- Finding the location of the element with a given key.
c. Insertion- Adding a new element to the list
d. Deletion- Removing an element from the list.
e. Sorting- Arranging the elements in some type of order.
f. Merging- combining two list into a single list.
Traversing Linear Arrays: Traversing an array is accessing and processing each element exactly
once. Considering the processing applied during traversal as display of elements the array can be
traversed as follows
void displayarray(int a[])
{
int i;
printf("The Array Elements are:\n");
for(i=0;i<n;i++)
printf("%d\t",a[i]);
}
Insertion
Inserting an element at the end of the array can be done provided the memory space allocated
for the array is large enough to accommodate the additional element.
If an element needs to be inserted in the middle then all the elements form the specified position
to the end of the array should be moved down wards to accommodate the new element and to
keep the order of the other element.
The following function inserts an element at the specified position
else
{
for(i=n-1;i>=pos;i--)
a[i+1]=a[i]; //Make space for the new element in the given position
a[pos]=element;
*n++;
}
}
Deletion
If an element needs to be deleted in the middle then all the elements form the specified position
to the end of the array should be moved upwards to fill up the array.
The following function deletes an element at the specified position
*n--;
}
}
Sorting: Sorting refers to the operation of rearranging the elements of an array in increasing or
decreasing order.
Example: Write a program to sort the elements of the array in ascending order using bubble
sort.
#include<stdio.h>
void main()
{
int a[10],i,j,temp,n;
printf("enter the size of the array : ");
scanf("%d",&n);
printf("enter the elements of the array\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n-1;i++)
for(j=0;j<n-i ;j++)
if (a[j] >a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]= temp;
}
printf("the sorted array is \n");
for(i=0;i<n;i++)
printf("%d \t",a[i]);
return(0);
}
Searching:
Let DATA be a collection of data elements in memory and suppose a specific ITEM of
information is given.
Searching refers to the operation of finding the Location LOC of the ITEM in DATA or
printing a message that the item does not appear here.
The search is successful if the ITEM appear in DATA and unsuccessful otherwise.
The algorithm chosen for searching depends on the way the data is organised. The two algorithm
considered here is linear search and binary search.
LINEAR SEARCH: This program traverses the array sequentially to locate key
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a[10],i,key,pos,n,flag=0;
printf("enter the size of the array : ");
scanf("%d",&n);
printf("enter the elements of the array\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("enter the key \n");
scanf("%d",&key);
for(i=0;i<=n-1;i++)
if (a[i]== key)
{
printf("key %d found at %d",key,pos+1);
exit();
}
printf("key not found");
}
Complexity of Linear search: The complexity is based on the number of comparison C(n) required
to find the key in the array element.
The best case occurs when the key is found at first position. C(n)O(1)
Worst case occurs when key element is not found in the array or when the element is in the
last position. Thus in worst case the running time is proportional to n C(n) O(n)
The running time of the average case uses the probabilistic notation of expectation. Number
of comparison can be any number from 1 to n and each occurs with probability p= 1/n then
c(n) = 1.1/n +2.1/n+ .............. n.1/n
= (1+2+3… ..... +n).1/n
=n(n+1)/2.1/n=n+1/2
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a[10],i,key,mid,low,high,n;
printf("enter the size of the array : ");
scanf("%d",&n);
printf("enter the elements of the array in ascending order\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("enter the key \n");
scanf("%d",&key);
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if (key==a[mid])
{
printf("element %d found at %d",key,mid+1);
exit(0);
}
else
{
if (key<a[mid])
high = mid-1;
else
low=mid+1;
}
}
printf("key not found");
return(0);
}
Polynomials: A polynomial is a sum of terms, where each term has a form axe, where x is the variable,
a is the coefficient, and e is the exponent.
The largest (or leading) exponent of a polynomial is called its degree. Coefficients that are zero are
not displayed.
Standard mathematical definitions for the sum and product of polynomials are:
Assume that we have two polynomials
then
ADT Polynomial is objects: a set of ordered pairs of <ei, ai> where ai is Coefficients and ei is
Exponents, ei are integers >= 0
Functions:
for all poly,poly1,poly2 ∈ Polynomial,coef ∈ Coefficients, expon ∈ Exponents
Polynomial Representation:
A polynomial can be represented as an array of structures as follows.
Only one global array, terms, is used to store all the polynomials.
The C declarations needed are:
For our example, startA = 0, finishA = 1, startB = 2, finishB = 5, and avail =6.
Coef 2 1 1 10 3 1
Exp 1000 0 4 3 2 0
0 1 2 3 4 5 6 7 8
since A (x) = 2x 1000 + 1 uses only six units of storage: one for startA, one for finishA, two for the
coefficients, and two for the exponents. However, when all the terms are nonzero, the current
representation requires about twice as much space as the first one. This representation is useful only
when the number of non zero terms are more.
Polynomial addition
C function that adds two polynomials, A and B to obtain the resultant polynomial D = A + B.
The polynomial is added term by term.
The attach function places the terms of D into the array, terms starting at position avail,.
If there is not enough space in terms to accommodate D, an error message is printed to the
standard error device and we exit the program with an error condition.
void padd(int startA,int finishA,int startB, int finishB, int *startD,int *finishD)
{
/ * add A(x) and B(x) to obtain D(x) */
float coefficient;
*startD = avail;
while (startA <= finishA && startB <= finishB)
{
switch(COMPARE(terms[startA].expon, terms[startB].expon))
{
case -1: attach(terms[startB].coef,terms[startB].expon);
startB++;
break;
case 0: coefficient = terms[startA].coef + terms[startB].coef;
if (coefficient)
attach(coefficient,terms[startA].expon);
startA++;
startB++;
break;
case 1: attach(terms[startA].coef,terms[startA].expon);
startA++;
}
}
while(startA <= finishA)
{
attach(terms[startA].coef,terms[startA].expon); /* add in remaining terms of A(x) */
startA++;
}
*finishD = avail-1;
}
Sparse Matrices
If a matrix contains m rows and n columns the total number of elements in such a matrix is
m*n. If m equals n the matrix is a square matrix.
When a sparse matrix is represented as a two dimensional array space is wasted for example if we
have 1000x 1000 matrix with only 2000 non zero element, the corresponding 2 dimensional array
requires space for 1,000,000 elements
ADT Sparse Matrix objects: a set of triples, <row, column, value>, where row and column are
integers and form a unique combination, and value comes from the set item.
Functions:
for all a, b∈SparseMatrix, x∈item, i, j, maxCol, maxRow∈index
Example
Figure 1.4 two dimensional array and its sparse matrix stored as triples
Write a program to store a sparse matrix in triplet form and search an element specified by
the user
#include<stdio.h>
#include<stdlib.h>
int main()
{
struct sparse
{
int r;
int c;
int v;
};
struct poly s[100];
int ele,i,j,k,n,m,key;
printf("enter the size of the array ; ");
scanf("%d %d",&m,&n);
k=1;
s[0].r=m;
s[0].c=n;
printf("\n enter the elements of the array\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
scanf("%d",&ele);
if(ele !=0)
{
s[k].r=i;
s[k].c=j;
s[k].v= ele;
k++;
}
s[0].v=k-1;
}
for(i=0;i<=s[0].v;i++)
printf(" %d\t %d \t %d \n ",s[i].r, s[i].c, s[i].v);
printf(" enter the key to be searched");
scanf("%d",&key);
for(i=0;i<=s[0].v;i++)
if (key== s[i].v)
{
printf("element found at %d row and %d column",s[i].r,s[i].c);
exit(0);
}
printf("element not found ");
return(0);
}
Transposing a Matrix: To transpose a matrix we must interchange the rows and columns.
This means that each element a[i][j] in the original matrix becomes element b[j][i] in the
transposematrix.
The algorithm finds all the elements in column 0 and store them in row 0 of the transpose matrix, find
all the elements in column 1 and store them in row 1, etc." Since the original matrix was ordered by
rows and the columns were ordered within each row. The transpose matrix will also be arranged in
ascending order. The variable, currentb, holds the position in b that will contain the next transposed
term. The terms in b is generated by rows by collecting the nonzero terms from column i of a
The transpose b of the sparse matrix a of figure 1.4b is shown in figure 1.5
Analysis of transpose: Hence, the asymptotic time complexity of the transpose algorithm is
O(columns·elements).
It first determines the number of elements in each column of the original matrix. This gives us the
number of elements in each row of the transpose matrix. From this information, we can determine the
starting position of each row in the transpose matrix. We now can move the elements in the original
matrix one by one into their correct position in the transpose matrix. We assume that the number of
columns in the original matrix never exceeds MAX_COL.
The first two for loops compute the values for rowTerms, the third for loop carries out the
computation of startingPos, and the last for loop places the triples into the transpose matrix.
These four loops determine the computing time of fastTranspose.
The bodies of the loops are executed numCols, numTerms, numCols - 1, and numTerms times,
respectively. The computing time for the algorithm is O(columns + elements).
However, transpose requires less space than fastTranspose since the latter function must
allocate space for the rowTerms and startingPos arrays.
Strings: A string is an array of characters that is delimited by the null character (\0).
C L A S S \0
S[0] S[1] S[2] S[3] S[4] S[5]
Using this declaration the compiler would have reserved just enough space to hold each character
word including the null character. In such cases we cannot store a string of length more than 5 in s
String Null(m) ::= Return a string whose length is m characters long, but is initially set to
NULL. We write NULL as “”
Integer compare(s, t)::= If s equals t return 0
Else if s precedes t return -1
Else return +1
Boolean ISNull(s) ::= If (compare(s, NULL)) return FALSE
Else return TRUE
Integer Length(s) ::= If(compare(s, NULL))
Returns the number of characters in s else returns 0
String concat(s,t) ::= If(compare(t, NULL))
Return a string s whose elements are those of s followed by those of t
C provides several string functions which we access by including the header file string.h
Given below is a set of C string functions
char *strcat(char *dest, const char Appends the string pointed to, by src to the end of the
*src) string pointed to by dest.
char *strncat(char *dest, const char Appends the string pointed to, by src to the end of the
*src, size_t n) string pointed to, by dest up to n characters long.
int strcmp(const char *str1, const Compares the string pointed to, by str1 to the string
char *str2) pointed to bystr2.
char *strcpy(char *dest, const char Copies the string pointed to, by src to dest and return dest
*src)
char *strncpy(char *dest, const char Copies n characters from the string pointed to,
*src, size_t n) by src to dest and returns dest
size_t strlen(const char *str) Returns the length of the string str . But not including the
terminating null character.
char *strchr(const char *str, int c) Returns pointer to the first occurrence of c in str . Returns
NULL if not present
char *strrchr(const char *str, int c) Returns pointer to the last occurrence of c in str . Returns
NULL if not present
char *strtok(char *str, const char Returns a token from string str . Tokens are separated
*delim) by delim.
char *strstr(char *str, const char Returns pointer to start of pat in str
*pat)
size_t strspn(const char *str, const Scan str for characters in spanset, returns the length of the
char *spanset) span
size_t strcspn(const char *str, const Scans str for character not in spanset, returns the length of
char *spanset) the span
char *strpbrk(const char *str, const Scan str for characters in spanset, returns pointer to first
char *spanset) occurrence of a character from spanset
Storing Strings
Strings are stored in three types of structures
1. Fixed Length structure
2. Variable Length structure with fixed maximums
3. Linked structures
1. Fixed length Storage, record oriented: In this structure each line of text is viewed as a record
where all records have the same length or have the same number of characters
Example: Assuming our record has a maximum of 12 characters per record the strings are stored as
follows
0 D A T A
1 S T R U C T U R E S
2 A N D
3 A P P L L I C A T I O N
4
5
Advantages:
Ease of accessing data from any given record
Ease of updating data in any given record( provided the length of the new data does not exceed
the record length
Disadvantages
Time is wasted reading an entire record if most of the storage consist of in essential blank
spaces
Certain records may require more space or data than available
When the correction consist of more or fewer characters than original text, updation requires
the entire record to be changed( the disadvantage can be resolved by using array of pointers)
2. Variable Length storage with fixed maximum: The storage of variable length strings in memory
cells wth fixed lengths can be done in two ways
Use a marker such as ($) to mark the end of the string
List the length of the string as an additional field in the pointer array
Example :
0 5 D A T A $
1 11 S T R U C T U R E S $
2 4 A N D $
3 12 A P P L I C A T I O N $
4 0
5 0
3. Linked storage: Linked list is an ordered sequence of memory cells called nodes, where each node
stores two information the data and also stores the address of the next node in the list. Strings may be
stored in linked list as each node storing one character or a fixed number of characters and a link
containing the address of the node containing the next group of characters.
Example:
S= A m o b i l e ‘\0\
t= U t o ‘\0\
Initially
Temp= ‘\0\
Strncpy(temp,s,i)
a ‘\0\
Strcat(temp,t)
a U t o ‘\0\
Strcat(temp,(s+i))
a u T o m o b i L e ‘\0\
Consider two string str1 and str2 . insert srting str2 into str1 at position i.
# include<string.h>
# define max_size 100
Char str1[max_size];
Char str2 [max_size];
strncpy(temp,s,i);
strcat(temp,t);
strcat(temp,(s+i));
strcpy(s,temp);
}}
Pattern matching : Consider two strings str and pat where pat is a pattern to be searched for in
stri. The easiest way to find if the pat is in str is by using the built in function strstr.
Since there are different methods to find pattern matching discussed below are two functions that
finds pattern matching in a more efficient way.
The easiest and the least efficient method in pattern matching is sequential search. The computing
time is of O(n.m).
for(i=0;endmatch<=lasts;endmatch++,strt++)
{
If(string[endmatch] == pat[lastp])
{
j=0;i= start;
while(j<lastp && string[i]== pat[j])
{
i++;
j++);
}
}
if(j==lastp)
return start;
}
return -1
}
Simulation of nfind
Pattern
a A b
j lastp
a B a b b A a b a a
s em ls
No Match
a B a b b A a b a a
S em ls
No Match
a B a b b A a b a a
s i em ls
No Match
a B a b b A a b a a
s Em ls
No Match
a B a b b A a b a a
s em ls
No Match
A B a b b A a b a a
S em ls
Match
Analysis of nfind algorithm: The speed of the program is linear O(m) the length of the string in the
best and average case but the worst case computing is still O(n.m)
Example: For the pattern pat=abcabcacab we have the failure values calculated as below
j 1 2 3 4 5 6 7 8 9 10
pat a b c a b c a c a b
failure 0 0 0 1 2 3 1 3 1 2
Therefore when the failure function is not known in advance the total computing time is
O(strlen(string)) + O(strlem(pa))