Upcoming SlideShare
×

# 358 33 powerpoint-slides_5-arrays_chapter-5

675 views

Published on

Reema Thareja on Data Structure Arrays

Published in: Education, Technology
2 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
• sry bruhh my acc have been hack...sry

Are you sure you want to  Yes  No

Are you sure you want to  Yes  No
Views
Total views
675
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
0
2
Likes
2
Embeds 0
No embeds

No notes for slide

### 358 33 powerpoint-slides_5-arrays_chapter-5

1. 1. © Oxford University Press 2011. All rights reserved. Data Structures Using C Reema Thareja, Assistant Professor, Institute of Information Technology and Management, New Delhi
3. 3. © Oxford University Press 2011. All rights reserved. INTRODUCTION • An array is a collection of similar data elements. • These data elements have the same data type. • The elements of the array are stored in consecutive memory locations and are referenced by an index (also known as the subscript). • Declaring an array means specifying three things: The data type- what kind of values it can store ex, int, char, float Name- to identify the array The size- the maximum number of values that the array can hold • Arrays are declared using the following syntax. type name[size]; 1st element 2nd element 3rd element 4th element 5th element 6th element 7th element 8th element 9th element 10th element marks[0] marks[1] marks[2] marks[3] marks[4] marks[5] marks[6] marks[7] marks[8] marks[9]
4. 4. © Oxford University Press 2011. All rights reserved. ACCESSING ELEMENTS OF THE ARRAY To access all the elements of the array, you must use a loop. That is, we can access all the elements of the array by varying the value of the subscript into the array. But note that the subscript must be an integral value or an expression that evaluates to an integral value. int i, marks[10]; for(i=0;i<10;i++) marks[i] = -1; CALCULATING THE ADDRESS OF ARRAY ELEMENTS Address of data element, A[k] = BA(A) + w( k – lower_bound) Here, A is the array k is the index of the element of which we have to calculate the address BA is the base address of the array A. w is the word size of one element in memory, for example, size of int is 2. 99 67 78 56 88 90 34 85 Marks[0] marks[1] marks[2] marks[3] marks[4] marks[5] marks[6] marks[7] marks[7] 1000 1002 1004 1006 1008 1010 1012 1014 Marks[4] = 1000 + 2(4 – 0) = 1000 + 2(4) = 1008
5. 5. © Oxford University Press 2011. All rights reserved. STORING VALES IN ARRAYS Store values in the array Initialize the elements Input values for the elements Assign values to the elements Initialization of Arrays Arrays are initialized by writing, type array_name[size]={list of values}; int marks[5]={90, 82, 78, 95, 88}; int i, marks[10]; for(i=0;i<10;i++) scanf(“%d”, &marks[i]); Assigning Values int i, arr1[10], arr2[10]; for(i=0;i<10;i++) arr2[i] = arr1[i]; Inputting Values CALCULATING THE LENGTH OF THE ARRAY Length = upper_bound – lower_bound + 1 Where, upper_bound is the index of the last element and lower_bound is the index of the first element in the array 99 67 78 56 88 90 34 85 Marks[0] marks[1] marks[2] marks[3] marks[4] marks[5] marks[6 marks[7]] Here, lower_bound = 0, upper_bound = 7 Therefore, length = 7 – 0 + 1 = 8
6. 6. © Oxford University Press 2011. All rights reserved. WRITE A PROGRAM TO READ AND DISPLAY N NUMBERS USING AN ARRAY #include<stdio.h> #include<conio.h> int main() { int i=0, n, arr[20]; clrscr(); printf(“n Enter the number of elements : “); scanf(“%d”, &n); for(i=0;i<n;i++) { printf(“n Arr[%d] = “, i); scanf(“%d”,&num[i]); } printf(“n The array elements are “); for(i=0;i<n;i++) printf(“Arr[%d] = %dt”, i, arr[i]); return 0; }
7. 7. © Oxford University Press 2011. All rights reserved. INSERTING AN ELEMENT IN THE ARRAY Algorithm to insert a new element to the end of the array. Step 1: Set upper_bound = upper_bound + 1 Step 2: Set A[upper_bound] = VAL Step 3; EXIT The algorithm INSERT will be declared as INSERT( A, N, POS, VAL). Step 1: [INITIALIZATION] SET I = N Step 2: Repeat Steps 3 and 4 while I >= POS Step 3: SET A[I + 1] = A[I] Step 4: SET I = I – 1 [End of Loop] Step 5: SET N = N + 1 Step 6: SET A[POS] = VAL Step 7: EXIT Calling INSERT (Data, 6, 3, 100) will lead to the following processing in the array 45 23 34 12 56 20 20 Data[0] Data[1] Data[2] Data[3] Data[4] Data[5] Data[6] 45 23 34 12 56 56 20 Data[0] Data[1] Data[2] Data[3] Data[4] Data[5] Data[6] 45 23 34 12 12 56 20 Data[0] Data[1] Data[2] Data[3] Data[4] Data[5] Data[6] 45 23 34 100 12 56 20 Data[0] Data[1] Data[2] Data[3] Data[4] Data[5] Data[6]
8. 8. © Oxford University Press 2011. All rights reserved. DELETING AN ELEMENT FROM THE ARRAY Algorithm to delete an element from the end of the array Step 1: Set upper_bound = upper_bound - 1 Step 2: EXIT Step 1: [INITIALIZATION] SET I = POS Step 2: Repeat Steps 3 and 4 while I <= N - 1 Step 3: SET A[I] = A[I + 1] Step 4: SET I = I + 1 [End of Loop] Step 5: SET N = N - 1 Step 6: EXIT The algorithm DELETE will be declared as DELETE( A, N, POS). Calling DELETE (Data, 6, 2) will lead to the following processing in the array 45 23 12 12 56 20 Data[0] Data[1] Data[2] Data[3] Data[4] Data[5] 45 23 34 12 56 20 Data[0] Data[1] Data[2] Data[3] Data[4] Data[5] 45 23 12 56 56 20 Data[0] Data[1] Data[2] Data[3] Data[4] Data[5] 45 23 12 56 20 20 Data[0] Data[1] Data[2] Data[3] Data[4] Data[5] 45 23 12 56 20 Data[0] Data[1] Data[2] Data[3] Data[4]
9. 9. © Oxford University Press 2011. All rights reserved. LINEAR SEARCH LINEAR_SEARCH(A, N, VAL, POS) Step 1: [INITIALIZE] SET POS = -1 Step 2: [INITIALIZE] SET I = 0 Step 3: Repeat Step 4 while I<N Step 4: IF A[I] = VAL, then SET POS = I PRINT POS Go to Step 6 [END OF IF] [END OF LOOP] Step 5: PRINT “Value Not Present In The Array” Step 6: EXIT BINARY SEARCH BEG = lower_bound and END = upper_bound MID = (BEG + END) / 2 If VAL < A[MID], then VAL will be present in the left segment of the array. So, the value of END will be changed as, END = MID – 1 If VAL > A[MID], then VAL will be present in the right segment of the array. So, the value of BEG will be changed as, BEG = MID + 1
10. 10. © Oxford University Press 2011. All rights reserved. BINARY_SEARCH(A, lower_bound, upper_bound, VAL, POS) Step 1: [INITIALIZE] SET BEG = lower_bound, END = upper_bound, POS = -1 Step 2: Repeat Step 3 and Step 4 while BEG <= END Step 3: SET MID = (BEG + END)/2 Step 4: IF A[MID] = VAL, then POS = MID PRINT POS Go to Step 6 IF A[MID] > VAL then; SET END = MID - 1 ELSE SET BEG = MID + 1 [END OF IF] [END OF LOOP] Step 5: IF POS = -1, then PRINTF “VAL IS NOT PRESENT IN THE ARRAY” [END OF IF] Step 6: EXIT int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; and VAL = 9, the algorithm will proceed in the following manner. BEG = 0, END = 10, MID = (0 + 10)/2 = 5 Now, VAL = 9 and A[MID] = A[5] = 5 A[5] is less than VAL, therefore, we will now search for the value in the later half of the array. So, we change the values of BEG and MID. Now, BEG = MID + 1 = 6, END = 10, MID = (6 + 10)/2 =16/2 = 8 Now, VAL = 9 and A[MID] = A[8] = 8 A[8] is less than VAL, therefore, we will now search for the value in the later half of the array. So, again we change the values of BEG and MID. Now, BEG = MID + 1 = 9, END = 10, MID = (9 + 10)/2 = 9 Now VAL = 9 and A[MID] = 9. Now VAL = 9 and A[MID] = 9.
11. 11. © Oxford University Press 2011. All rights reserved. ONE DIMENSIONAL ARRAYS FOR INTER FUNCTION COMMUNICATION 1D Arrays For Inter Function Communication Passing individual elements Passing entire array Passing individual elements Passing entire array Passing data values main() { int arr[5] ={1, 2, 3, 4, 5}; func(arr[3]); } void func(int num) { printf("%d", num); } Passing addresses main() { int arr[5] ={1, 2, 3, 4, 5}; func(&arr[3]); } void func(int *num) { printf("%d", num); } Passing the entire array main() { int arr[5] ={1, 2, 3, 4, 5}; func(arr); } moid func(int arr[5]) { int i; for(i=0;i<5;i++) printf("%d", arr[i]);
13. 13. © Oxford University Press 2011. All rights reserved. POINTERS AND ARRAYS int arr[5] = {1, 2, 3, 4, 5}; int *ptr = &arr[0]; ptr++; printf(“n The value of the second element of the array is %d”, *ptr); Write a program to read and display an array of n integers #include<stdio.h> int main() { int i, n; int arr[10], *parr; parr = arr; printf(“n Enter the number of elements : “); scanf(“%d”, &n); for(i=0; i <n; i++) scanf(“%d”, (parr+i)); for(i=0; i <n; i++) printf(“n arr[%d] = %d”, i, *(parr+i)); }
14. 14. © Oxford University Press 2011. All rights reserved. ARRAY OF POINTERS An array of pointers can be declared as int *ptr[10] The above statement declares an array of 10 pointers where each of the pointer points to an integer variable. For example, look at the code given below. int *ptr[10]; int p=1, q=2, r=3, s=4, t=5; ptr[0]=&p; ptr[1]=&q; ptr[2]=&r; ptr[3]=&s; ptr[4]=&t Can you tell what will be the output of the following statement? printf(“n %d”, *ptr[3]); Yes, the output will be 4 because ptr[3] stores the address of integer variable s and *ptr[3] will therefore print the value of s that is 4.
15. 15. © Oxford University Press 2011. All rights reserved. TWO DIMENSIONAL ARRAYS • A two dimensional array is specified using two subscripts where one subscript denotes row and the other denotes column. • C looks a two dimensional array as an array of a one dimensional array. Second Dimension A two dimensional array is declared as: data_type array_name[row_size][column_size]; Therefore, a two dimensional mXn array is an array that contains m*n data elements and each element is accessed using two subscripts, i and j where i<=m and j<=n int marks[3][5] Rows/Columns Col 0 Col 1 Col2 Col 3 Col 4 Row 0 Marks[0][0] Marks[0][1] Marks[0][2] Marks[0][3] Marks[0][4] Row 1 Marks[1][0] Marks[1][1] Marks[1][2] Marks[1][3] Marks[1][4] Row 2 Marks[2][0] Marks[2][1] Marks[2][2] Marks[2][3] Marks[2][4] Two Dimensional Array
16. 16. © Oxford University Press 2011. All rights reserved. MEMORY REPRESENTATION OF A TWO DIMENSIONAL ARRAY There are two ways of storing a 2-D array can be stored in memory. The first way is row major order and the second is column major order. In the row major order the elements of the first row are stored before the elements of the second and third row. That is, the elements of the array are stored row by row where n elements of the first row will occupy the first nth locations. (0,0) (0, 1) (0,2) (0,3) (1,0) (1,1) (1,2) (1,3) (2,0) (2,1) (2,2) (2,3) However, when we store the elements in a column major order, the elements of the first column are stored before the elements of the second and third column. That is, the elements of the array are stored column by column where n elements of the first column will occupy the first nth locations. (0,0) (1,0) (2,0) (3,0) (0,1) (1,1) (2,1 (3,1) (0,2) (1,2) (2,2) (3,2) Address(A[I][J] = Base_Address + w{M ( J - 1) + (I - 1)}, if the array elements are stored in column major order. And, Address(A[I][J] = Base_Address + w{N ( I - 1) + (J - 1)}, if the array elements are stored in row major order. Where, w is the number of words stored per memory location m, is the number of columns n, is the number of rows I and J are the subscripts of the array element
17. 17. © Oxford University Press 2011. All rights reserved. TWO DIMENSIONAL ARRAYS CONTD.. • A two dimensional array is initialized in the same was as a single dimensional array is initialized. For example, int marks[2][3]={90, 87, 78, 68, 62, 71}; int marks[2][3]={{90,87,78},{68, 62, 71}}; Write a program to print the elements of a 2D array • #include<stdio.h> • #include<conio.h> • main() • { • int arr[2][2] = {12, 34, 56,32}; • int i, j; • for(i=0;i<2;i++) • { • printf("n"); • for(j=0;j<2;j++) • printf("%dt", arr[i][j]); • } • return 0; • }
18. 18. © Oxford University Press 2011. All rights reserved. TWO DIMENSIONAL ARRAYS FOR INTER FUNCTION COMMUNICATION Passing individual elements Passing a row 2D Array for Inter Function Communication Passing the entire 2D array There are three ways of passing parts of the two dimensional array to a function. First, we can pass individual elements of the array. This is exactly same as we passed element of a one dimensional array. Passing a row main() { int arr[2][3]= ( {1, 2, 3}, {4, 5, 6} }; func(arr[1]); } void func(int arr[]) { int i; for(i=0;i<5;i++) printf("%d", arr[i] * 10); } Passing the entire 2D array To pass a two dimensional array to a function, we use the array name as the actual parameter. (The same we did in case of a 1D array). However, the parameter in the called function must indicate that the array has two dimensions.
19. 19. © Oxford University Press 2011. All rights reserved. PROGRAM ILLUSTRATING PASSING ENTIRE ARRAY TO A FUNCTION • #include<stdio.h> • void read_matrix(int mat[][], int, int); • void sum_matrix(int mat1[][], int mat2[][], int, int); • void display_matrix(int mat[5][5], int r, int c); • int main() • { int row, col, mat1[5][5], mat2[5][5]; • printf(“n Enter the number of rows and columns of the matrix : “); • scanf(“%d %d”, row, col); • read_matrix(mat1, row, col); • printf(“n Enter the second matrix : “); • read_matrix(mat2, row, col); • sum_matrix(mat1, mat2, row, col); • } • void read_matrix(int mat[5][5], int r, int c) • { int i, j; • for(i=0;i<r;i++) • { for(j=0;j<c;j++) • { printf(“n mat[%d][%d] = “); • scanf(“%d“, &mat[i][j]); • } • } • } • void sum_matrix(int mat1[5][5], mat2[5][5], int r, int c) • { int i, j, sum[5][5]; • for(i=0;i<r;i++) • { for(j=0;j<c;j++) • sum[i][j] = mat1[i][j] + mat2[i][j]; • } • display_matrix(sum, r, c); • } • void display_matrix(int mat[5][5], int r, int c) • { int i, j; • for(i=0;i<r;i++) • { printf(“n”); • for(j=0;j<c;j++) • printf(“t mat[%d][%d] = %d“, mat[i][j]);
20. 20. © Oxford University Press 2011. All rights reserved. ARRAY OF FUNCTION POINTERS When an array of function pointers is made the appropriate function is selected using an index. The code given below shows the way to define and use an array of function pointers in C. Step 1: Use typedef keyword so that 'fp' can be used as type typedef int (*fp)(int, int); Step2: Define the array and initialize each element to NULL. This can be done in two ways // with 10 pointers to functions which return an int and take two ints First Way: fp funcArr[10] = {NULL}; Second Way: int (*funcArr[10])(int, int) = {NULL}; Step 3: Assign the function's address - 'Add' and 'Subtract' funcArr1[0] = funcArr2[1] = &Add; funcArr[0] = &Add; funcArr[1] = &Subtract; Step 4: Call the function using an index to address the function pointer printf("%dn", funcArr[1](2, 3)); // short form printf("%dn", (*funcArr[0])(2, 3)); // "correct" way Let us now write a program that uses array of function pointers
21. 21. © Oxford University Press 2011. All rights reserved. • #include <stdio.h> int sum(int a, int b); int subtract(int a, int b); int mul(int a, int b); int div(int a, int b); int (*fp[4]) (int a, int b); int main(void) { int result; int num1, num2, op; p[0] = sum; p[1] = subtract; p[2] = mul; p[3] = div; printf("n Enter the numbers: "); • scanf("%d %d", &num1, &num2); • do • { printf("n 0: Add n 1: Subtract n 2: Multiply n 3: Divide n 4. EXIT"); • printf("Enter the operation: "); • scanf("%d", &op); result = (*fp[op]) (num1, num2); printf("%d", result); } while(op!=4); } int sum(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { if(b) return a / b;
22. 22. © Oxford University Press 2011. All rights reserved. POINTERS AND TWO DIMENSIONAL ARRAY • Individual elements of the array mat can be accessed using either: mat[i][j] or *(*(mat + i) + j) or*(mat[i]+j); • See pointer to a one dimensional array can be declared as, int arr[]={1,2,3,4,5}; int *parr; parr=arr; • Similarly, pointer to a two dimensional array can be declared as, int arr[2][2]={{1,2},{3,4}}; int (*parr)[2]; parr=arr; • Look at the code given below which illustrates the use of a pointer to a two dimensional array. • #include<stdio.h> main() { int arr[2][2]={{1,2}.{3,4}}; int i, (*parr)[2]; parr=arr; for(i=0;i<2;i++) { for(j=0;j<2;j++) printf(" %d", (*(parr+i))[j]); } } OUTPUT
23. 23. © Oxford University Press 2011. All rights reserved. MULTI DIMENSIONAL ARRAYS • A multi dimensional array is an array of arrays. • Like we have one index in a single dimensional array, two indices in a two dimensional array, in the same way we have n indices in a n-dimensional array or multi dimensional array. • Conversely, an n dimensional array is specified using n indices. • An n dimensional m1 x m2 x m3 x ….. mn array is a collection m1*m2*m3* ….. *mn elements. • In a multi dimensional array, a particular element is specified by using n subscripts as A[I1][I2][I3]…[In], where, I1<=M1 I2<=M2 I3 <= M3 ……… In <= Mn
24. 24. © Oxford University Press 2011. All rights reserved. PROGRAM TO READ AND DISPLAY A 2X2X2 ARRAY #include<stdio.h> int main() { int array1[3][3][3], i, j, k; printf(“n Enter the elements of the matrix”); printf(“n ******************************”); for(i=0;i<2;i++) { for(j=0;j<2;j++) { for(k=0;k<2;k++) { printf(“n array[%d][ %d][ %d] = ”, i, j, k); scanf(“%d”, &array1[i][j][k]); } } } printf(“n The matrix is : “); printf(“n *********************************”)l for(i=0;i<2;i++) { printf(“nn”); for(j=0;j<2;j++) { printf(“n”); for(k=0;k<2;k++) printf(“t array[%d][ %d][ %d] = %d”, i, j, k, array1[i][j][k]); } }
25. 25. © Oxford University Press 2011. All rights reserved. SPARSE MATRIX • Sparse matrix is a matrix that has many elements with a value zero. • In order to efficiently utilize the memory, specialized algorithms and data structures that take advantage of the sparse structure of the matrix should be used. Otherwise, execution will slow down and the matrix will consume large amounts of memory. • There are two types of sparse matrices. In the first type of sparse matrix, all elements above the main diagonal have a value zero. This type of sparse matrix is also called a (lower) triagonal matrix. In a lower triangular matrix, Ai,j = 0 where i<j. • An nXn lower triangular matrix A has one non zero element in the first row, two non zero element in the second row and likewise, n non zero elements in the nth row. 1 5 3 2 7 -1 3 1 4 2 -9 2 -8 1 7 • In an upper triangular matrix Ai,j = 0 where i>j. •An nXn upper triangular matrix A has n non zero element in the first row, n-1 non zero element in the second row and likewise, 1 non zero elements in the nth row. 1 2 3 4 5 3 6 7 8 -1 9 1 9 3 7
26. 26. © Oxford University Press 2011. All rights reserved. SPARSE MATRIX CONTD. • In the second variant of a sparse matrix, elements with a non-zero value can appear only on the diagonal or immediately above or below the diagonal. This type of matrix is also called a tridiagonal matrix. • In a tridiagonal matrix, Ai,j = 0 where | i – j| > 1. Therefore, if elements are present on • the main diagonal the, it contains non-zero elements for i=j. In all there will be n elements • diagonal below the main diagonal, it contains non zero elements for i=j+1. In all there will be n-1 elements • diagonal above the main diagonal, it contains non zero elements for i=j-1. In all there will be n-1 elements 4 1 5 1 2 9 3 1 4 2 2 5 1 9 6 7