Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lectures on data structures and C 3ed CS(CSI33) By, CHANDRASHEKAR A.M.

Similar presentations


Presentation on theme: "Lectures on data structures and C 3ed CS(CSI33) By, CHANDRASHEKAR A.M."— Presentation transcript:

1 Lectures on data structures and C 3ed CS(CSI33) By, CHANDRASHEKAR A.M.

2 Data Structures and Algorithms
Programs. Different problems. Operations. Size of data. Resources available. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview of Lecture Basic data structures. How to manipulate them. How to implement them. Other algorithms and how to implement them. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

4 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
This Lecture - Review Basic C data types Boolean 1D and multidimensional arrays Strings Input/Output File I/O Structures and typedef copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Basic Data types in C int char float double copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Boolean Has two values, true and false. In C we use integers as Booleans. Zero represents false. Any non-zero integer represents true. The library <stdbool.h> contains definition for bool, true, and false. (This doesn’t work in Borland) In Borland programs, use #define to define the constants true and false copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

7 #include <stdbool.h>
bool leapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) return true; } else return false;

8 For Borland use #define or const int
#define true 1 #define false 0 int leapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) return true; } else return false;

9 Recall: File inclusion header #include <stdbool.h>
bool leapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) return true; } else return false; File inclusion header

10 Recall: Function definition #include <stdbool.h>
bool leapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) return true; } else return false;

11 Recall: Function name #include <stdbool.h>
bool leapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) return true; } else return false;

12 Recall: Function return type
#include <stbool.h> bool leapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) return true; } else Must be compatible with the function’s return type

13 Recall: Function parameter Parameter type #include <stdbool.h>
bool leapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) return true; } else return false; Function parameter Parameter type

14 Recall: Function call int main() { int year, month, day;
printf(“Enter year, month and day: ”); scanf(“%d %d %d”, &year, &month, &day); day = dayOfYear(year, month, day); printf(“\nDay of Year = %d\n”, day); } Function call

15 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Review - Arrays (1D) array1D: 1 N - 1 All the elements are of the same type. An element: array1D[index] In C, the first element has index 0 (zero). copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

16 Review - Multidimensional Arrays
array2D: Arrays of arrays. All the elements are of the same type. An element: array2D[row][column] copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

17 int dayTable[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; int dayOfYear(int year, int month, int day) { int i; int isLeap = leapYear(year); for (i = 1; i < month; i++) { day += dayTable[isLeap][i]; } return day;

18 Recall: Global variable Local variable int dayTable[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; int dayOfYear(int year, int month, int day) { int i; int isLeap = leapYear(year); for (i = 1; i < month; i++) { day += dayTable[isLeap][i]; } return day; Global variable Local variable

19 Recall: 2-dimensional array of int int dayTable[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; int dayOfYear(int year, int month, int day) { int i; int isLeap = leapYear(year); for (i = 1; i < month; i++) { day += dayTable[isLeap][i]; } return day; 2-dimensional array of int

20 Recall: Index goes from 0 to 12 int dayTable[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; int dayOfYear(int year, int month, int day) { int i; int isLeap = leapYear(year); for (i = 1; i < month; i++) { day += dayTable[isLeap][i]; } return day; Index goes from 0 to 12

21 Review – Input/Output Input/Output is done via streams
Uses the library stdio.h Streams that are available in the library are stdin (keyboard), stdout and stderr (screen). These can be redirected. Data is written to stdout using the printf() function. printf("%s\n%f\n%c\n%d\n", name, age, gender, idNumber); Data is read in from stdin using the scanf() function. scanf("%s %f %c %d", name, &age, &gender, &idNumber); Format control string Variables containing data to be printed copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE Conversion specifiers Pointers to variables where input will be stored

22 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Review – Input/Output scanf() returns the number of values successfully read and converted or returns a special value EOF when input ends. Note for when reading a single character (%c): if there is a \n character left in the buffer from reading another value (%d) then that \n will be read into your character variable. Conversion specifiers: i or d: display a signed decimal integer f: display a floating point value e or E: display a floating point value in exponential notation g or G: display a floating point value in either f form or e form L: placed before any float conversion specifier to indicate that a long double is displayed copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

23 Note: no ampersand for strings
#include <stdio.h> int main() { int day; int month; int year; char name[30]; printf(“Enter your name:\n”> scanf(“%s”, name); /* skipping spaces */ printf(“Hi %s. Enter birthdate as: dd mm yyyy\n”, name); scanf("%d %d %d", &day, &month, &year); /* alternative */ printf(“Hi %s. Enter birthdate as: dd-mm-yyyy\n”, name); scanf("%d-%d-%d", &day, &month, &year); return 0; } Note: no ampersand for strings Conversion specifier Literal characters

24 Review - Strings Strings : array of characters Example: char name[30];
Unlike other arrays, strings require an end-of-string character : ‘\0’ String functions you will use from the string.h library include: Length - strlen(string1) Assignment - strcpy(dest, source) Concatenation - strcat(dest, string2) Comparison - strcmp(string1, string2) Max length including ‘\0’ Copies string2 onto the end of the destination string Returns: positive if string1 sorts after string2, 0 if they are the same string negative if string1 sorts before string2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

25 string2 needs to be the same length as string 1
#include <stdio.h> #include <string.h> #define MAXLENGTH 100 int main() { char string1[MAXLENGTH]; char string2[MAXLENGTH]; strcpy(string1, “Hello World!”); strcpy(string2, string1); length = strlen(string1); printf(“length of string1 = %d\n”, length); strcpy(string1, “Apple”); strcpy(string2, “Orange”); string1 needs to fit the number of characters of the second string, +1 for the ‘\0’ character string2 needs to be the same length as string 1

26 sscanf(string1, “%d”, int1);
Prints the order which the two strings sort, alphabetically. if (strcmp(string1, string2) < 0) { printf(“%s %s\n”, string1, string2); } else if (strcmp(string1, string2) == 0) printf(“The strings are the same.\n”); else printf(“%s %s\n”, string2, string1); strcat(string1, “ juice”); printf(“%s\n”, string1); return 0; Note: To scan within a string use: sscanf(string1, “%d”, int1);

27 Review -File Handling in C
Files need to be opened before use. Associate a "file handler" to each file Modes: read, write, or append File input/output functions use the file handler (not the filename). Need to check the file opened sucessfully. Need to close the file after use. Basic file handling functions: fopen(), fclose(), fscanf(), fprintf(), fgets(). copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

28 fopen() returns NULL if an error occurs
Associate a file handler for every file to be used. #include <stdio.h> #define MAXLEN 100 int main() { FILE *inputfile = NULL; FILE *outputfile = NULL; char name[MAXLEN]; int count; float mark; inputfile = fopen(“Names.txt”, “r”); outputfile = fopen(“marks.dat”, “w”); if (inputfile == NULL) printf(“Unable to open input file.\n”); return 1; } if (outputfile == NULL) printf(“Unable to open output file.\n”); Mode r : read w : write a : append fopen() returns NULL if an error occurs

29 fscanf() returns the number of values read and converted
count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) { count++; printf("Enter mark for %s: \n", name); scanf("%f", &mark); if ( fprintf(outputfile, "%s %f\n", name, mark) <= 0 ) printf("Error writing to output file.\n"); return 1; } printf("\n"); printf("Number of names read: %d\n", count); fclose(inputfile); fclose(outputfile); return 0; fprintf() returns the number of successfully written or negative if an error occurs

30 fgets(string, length, filehandle)
To read in a line, use fgets(). fgets() returns NULL if end of file is reached. #include <stdio.h> #define MAXLEN 100 int main() { FILE *inputfile = NULL; char line[MAXLEN]; int count = 0; inputfile = fopen(“Names.txt”, “r”); if (inputfile == NULL) printf(“Unable to open input file.\n”); return 1; } while(fgets(line, MAXLEN, inputfile) != NULL) count++; printf(“Number of lines: %d”, count); fclose(inputfile); return 0; fgets(string, length, filehandle) What would happen if you tried to count the number of lines again, once the end of the file has been reached?

31 structname.membername
Review - struct structname: Members may have different types. structname.membername structs are also known as “records,” and members as “fields” copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

32 Review - typedef Gives a new name to a type that has already been defined. E.g. typedef struct StudentRec Student; Saves typing struct whatever everywhere. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

33 Example : #include <stdio.h> #define MAXNAME 80
struct StudentRec { char name[MAXNAME]; int mark; }; typedef struct StudentRec Student;

34 Recall: Macro substitution #include <stdio.h> #define MAXNAME 80
struct StudentRec { char name[MAXNAME]; int mark; }; typedef struct StudentRec Student; Macro substitution

35 Recall: Structure declaration #include <stdio.h>
#define MAXNAME 80 struct StudentRec { char name[MAXNAME]; int mark; }; typedef struct StudentRec Student; Structure declaration

36 Recall: Structure name / tag Members Don’t forget this!
#include <stdio.h> #define MAXNAME 80 struct StudentRec { char name[MAXNAME]; int mark; }; typedef struct StudentRec Student; Structure name / tag Members Don’t forget this!

37 Recall: Data type New type name #include <stdio.h>
#define MAXNAME 80 struct StudentRec { char name[MAXNAME]; int mark; }; typedef struct StudentRec Student; Data type New type name

38 Student readStudent(void)
{ Student next; scanf(“%s %d”, next.name, &next.mark); return next; } void printStudent(Student student) { printf(“%s %d\n”, student.name, student.mark);

39 Recall: An instance of the struct A member of a struct variable
Student readStudent(void) { Student next; scanf(“%s %d”, next.name, &next.mark); return next; } void printStudent(Student student) { printf(“%s %d\n”, student.name, student.mark); An instance of the struct A member of a struct variable “Package”

40 #define MAXCLASS 100 main() { Student class[MAXCLASS]; int n, i, best = 0; printf(“Enter number of students: ”); scanf(“%d”, &n); for (i = 0; i < n; i++) { class[i] = readStudent(); if (class[best].mark < class[i].mark) { best = i; } printf(“Best student is: ”); printStudent(class[best]);

41 Recall: Array of instances of structs Assignment
#define MAXCLASS 100 main() { Student class[MAXCLASS]; int n, i, best = 0; printf(“Enter number of students: ”); scanf(“%d”, &n); for (i = 0; i < n; i++) { class[i] = readStudent(); if (class[best].mark < class[i].mark) { best = i; } printf(“Best student is: ”); printStudent(class[best]); Array of instances of structs Recall: Assignment Member of an array element

42 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Basic Data Types and booleans I/O and File I/O Arrays and Structs Strings Typedef Preparation Next lecture: Pointers copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

43 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Revision of Pointers Basic Pointer Arithmetic Pointers and Arrays copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

44 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Pointers A pointer is a datatype. You can create variables of this type as you would of other types. Contains a memory address. Points to a specific data type. int *pointer1 = &x; int x; addr of x 0x2000 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE 0x9060

45 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Pointer Operations Type object; Type* aPtr; aPtr = &object assigns the address of object to aPtr. *aPtr allows access to the object through the pointer. If aPtr points to a structure then (*aPtr).member is equivalent to aPtr-> member copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

46 Pointers and Function Arguments
swap x: 1 y: 2 x: 2 y: 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

47 Solution 1 #include <stdio.h> void fakeSwap(int a, int b) {
int tmp; tmp = a; a = b; b = tmp; } int main() int x = 1, y = 2; fakeSwap(x, y); printf(“%d %d\n”, x, y); Solution 1

48 Solution 1 #include <stdio.h> void fakeSwap(int a, int b) {
int tmp; tmp = a; a = b; b = tmp; } int main() int x = 1, y = 2; fakeSwap(x, y); printf(“%d %d\n”, x, y); Solution 1 x: 1 0x2000 y: 2 0x2010

49 Solution 1 #include <stdio.h> void fakeSwap(int a, int b) {
int tmp; tmp = a; a = b; b = tmp; } int main() int x = 1, y = 2; fakeSwap(x, y); printf(“%d %d\n”, x, y); Solution 1 tmp: 0x2060 a: 1 0x2038 b: 2 0x2040 x: 1 0x2000 y: 2 0x2010

50 Solution 1 #include <stdio.h> void fakeSwap(int a, int b) {
int tmp; tmp = a; a = b; b = tmp; } int main() int x = 1, y = 2; fakeSwap(x, y); printf(“%d %d\n”, x, y); Solution 1 tmp: 1 0x2060 a: 1 0x2038 b: 2 0x2040 x: 1 0x2000 y: 2 0x2010

51 Solution 1 #include <stdio.h> void fakeSwap(int a, int b) {
int tmp; tmp = a; a = b; b = tmp; } int main() int x = 1, y = 2; fakeSwap(x, y); printf(“%d %d\n”, x, y); Solution 1 tmp: 1 0x2060 a: 2 0x2038 b: 2 0x2040 x: 1 0x2000 y: 2 0x2010

52 Solution 1 #include <stdio.h> void fakeSwap(int a, int b) {
int tmp; tmp = a; a = b; b = tmp; } int main() int x = 1, y = 2; fakeSwap(x, y); printf(“%d %d\n”, x, y); Solution 1 tmp: 1 0x2060 a: 2 0x2038 b: 1 0x2040 x: 1 0x2000 y: 2 0x2010

53 Solution 1 #include <stdio.h> void fakeSwap(int a, int b) {
int tmp; tmp = a; a = b; b = tmp; } int main() int x = 1, y = 2; fakeSwap(x, y); printf(“%d %d\n”, x, y); Solution 1 x: 1 0x2000 y: 2 0x2010

54 Solution 2 #include <stdio.h> void trueSwap(int* a, int* b) {
int tmp; tmp = *a; *a = *b; *b = tmp; } int main() int x = 1, y = 2; trueSwap(&x, &y); printf(“%d %d\n”, x, y); Solution 2

55 Solution 2 #include <stdio.h> void trueSwap(int* a, int* b) {
int tmp; tmp = *a; *a = *b; *b = tmp; } int main() int x = 1, y = 2; trueSwap(&x, &y); printf(“%d %d\n”, x, y); Solution 2 x: 1 0x2000 y: 2 0x2010

56 Solution 2 #include <stdio.h> void trueSwap(int* a, int* b) {
int tmp; tmp = *a; *a = *b; *b = tmp; } int main() int x = 1, y = 2; trueSwap(&x, &y); printf(“%d %d\n”, x, y); Solution 2 tmp: 0x2060 a: addr of x 0x2038 b: addr of y 0x2040 x: 1 0x2000 y: 2 0x2010

57 Solution 2 #include <stdio.h> void trueSwap(int* a, int* b) {
int tmp; tmp = *a; *a = *b; *b = tmp; } int main() int x = 1, y = 2; trueSwap(&x, &y); printf(“%d %d\n”, x, y); Solution 2 tmp: 1 0x2060 a: addr of x 0x2038 b: addr of y 0x2040 x: 1 0x2000 y: 2 0x2010

58 Solution 2 #include <stdio.h> void trueSwap(int* a, int* b) {
int tmp; tmp = *a; *a = *b; *b = tmp; } int main() int x = 1, y = 2; trueSwap(&x, &y); printf(“%d %d\n”, x, y); Solution 2 tmp: 1 0x2060 a: addr of x 0x2038 b: addr of y 0x2040 x: 2 0x2000 y: 2 0x2010

59 Solution 2 #include <stdio.h> void trueSwap(int* a, int* b) {
int tmp; tmp = *a; *a = *b; *b = tmp; } int main() int x = 1, y = 2; trueSwap(&x, &y); printf(“%d %d\n”, x, y); Solution 2 tmp: 1 0x2060 a: addr of x 0x2038 b: addr of y 0x2040 x: 2 0x2000 y: 1 0x2010

60 Solution 2 #include <stdio.h> void trueSwap(int* a, int* b) {
int tmp; tmp = *a; *a = *b; *b = tmp; } int main() int x = 1, y = 2; trueSwap(&x, &y); printf(“%d %d\n”, x, y); Solution 2 x: 2 0x2000 y: 1 0x2010

61 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
More on Pointers You can print the address stored in a pointer using the %p conversion specifier Example: printf(“%p”, numPtr); scanf needs to know where to put the value - it needs the address of the variable as it takes pointers as parameters. Example: int i; scanf(“%d”, &i); copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

62 /* Very Large Structure */
struct DataBaseRec { }; typedef struct DataBaseRec DataBase; /* Very Large Structure */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

63 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
DataBase readNewEntry(DataBase theDataBase) { return theDataBase; } void printDataBase(DataBase theDataBase) /* Some code */ /* Some more code */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

64 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void readNewEntry(DataBase* dataBasePtr) { } printDataBase(const DataBase* dataBasePtr) /* Some code */ /* Some more code */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

65 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void readNewEntry(DataBase* dataBasePtr) { } printDataBase(const DataBase* dataBasePtr) (DataBase* /* Some code */ Address of Database Database* /* Some more code */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

66 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void readNewEntry(DataBase* dataBasePtr) { } printDataBase(const DataBase* dataBasePtr) /* Some code */ Database cannot change in this function. const /* Some more code */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

67 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
int readstudent(Student *student) { printf(“Enter a name: \n”); if (scanf(“%s”, student->name) == 1) printf(“Enter a mark: \n); if (scanf(“%d”, &(student->mark)) == 1) return 1; } return 0; Why do you need the brackets? copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

68 Pointers and Functions
To enable a function to access and change an object. For large structures it is more efficient. Use const specifier whenever a constant is intended. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

69 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Pointers and Arrays Type array[size]; Type* pPtr = array + i; Type* qPtr = array + j; The name array is equivalent to &array[0] pPtr++ increments pPtr to point to the next element of array. pPtr += n increments pPtr to point to n elements beyond where it currently points. pPtr-qPtr equals i-j. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

70 Pointers and Arrays (cont)
A normal 1 dimensional array: Type array[size]; array[0] is equivalent to *array array[n] is equivalent to *(array + n) copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

71 Basic Pointer Arithmetic
float array[5]; float* pPtr = array; float* qPtr = NULL; 0x2008 0x2004 array: pPtr: 0x200C 0x2010 0x2014 0x2018 1 2 3 4 NULL 0x2000 qPtr: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

72 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
0x2008 0x200C 0x2010 0x2014 0x2018 array: 0x2008 1 2 3 4 pPtr: qPtr: 0x200C NULL 0x2004 0x2000 float array[5]; float* pPtr = array; float* qPtr = NULL; pPtr++; /* pPtr now holds the address: &array[1] */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

73 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
0x2008 0x200C 0x2010 0x2014 0x2018 array: 0x2008 1 2 3 4 pPtr: qPtr: 0x2018 NULL 0x2004 0x2000 float array[5]; float* pPtr = array; float* qPtr = NULL; pPtr++; /* pPtr = &array[1] */ pPtr += 3; /* pPtr now hold the address: &array[4] */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

74 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
0x2008 0x200C 0x2010 0x2014 0x2018 array: 0x2008 1 2 3 4 pPtr: qPtr: 0x2018 0x2010 0x2004 0x2000 float array[5]; float* pPtr = array; float* qPtr = NULL; pPtr++; /* pPtr = &array[1] */ pPtr += 3; /* pPtr = &array[4] */ qPtr = array + 2; /*qPtr now holds the address &array[2]*/ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

75 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
0x2008 0x200C 0x2010 0x2014 0x2018 array: 0x2008 1 2 3 4 pPtr: qPtr: 0x2018 0x2010 0x2004 0x2000 float array[5]; float* pPtr = array; float* qPtr = NULL; pPtr++; /* pPtr = &array[1] */ pPtr += 3; /* pPtr = &array[4] */ qPtr = array + 2; /* qPtr = &array[2] */ printf(“%d\n”, pPtr-qPtr); copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

76 char* strcpy(char* s, char* t) { int i = 0; while (t[i] != 0) s[i] = t[i]; i++; } return s; char* strcpy(char* s, char* t) { char* p = s; while (*p != 0) *p = *t; p++; t++; } return s;

77 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Pointers Pointer Operations address operator (&), and dereferencing operator (*) Pointers and Structures. structure pointer operator (->) Pointers and Function Arguments. Look at “swap” example Pointer Arithmetic Pointers and Arrays copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

78 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Next Lecture Stacks abstract data type main operations implementation copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

79 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Basic Data Structures Stacks Queues Lists copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

80 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview of Stacks What is a Stack? Operations on a Stack push, pop initialize status: empty, full Implementation of a Stack. Example: Reversing a sequence. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

81 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
A Stack Items on the Stack Top copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

82 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Push Top After Top Before copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

83 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
This comes off the stack Pop Top Before After Top copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

84 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Operations Initialize the Stack. Pop an item off the top of the stack. Push an item onto the top of the stack. Is the Stack empty? Is the Stack full? Clear the Stack Determine Stack Size copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

85 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Stack Properties Sequence of items, where insertions and deletions are done at the top. Main operations are pop and push. Last-In First Out (LIFO). Used when calling functions. Used when implementing recursion. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

86 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Implementation array (upside-down) 1 2 : Top index copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

87 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Implementation : float entry[MAXSTACK]; 2 Top 1 int top; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

88 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#ifndef STACK.H #define STACK.H #include <stdbool.h> #define MAXSTACK 20 struct StackRec { int top; float entry[MAXSTACK]; }; typedef struct StackRec Stack; void intializeStack(Stack* stackPtr); bool stackEmpty(const Stack* stackPtr); bool stackFull(const Stack* stackPtr); void push(Stack* stackPtr, float item); float pop(Stack* stackPtr); #endif copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

89 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Stack: #define MAXSTACK 20 struct StackRec { int top; float entry[MAXSTACK]; }; typedef struct StackRec Stack; top: entry: . copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

90 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#include <stdio.h> #include <stdlib.h> #include “stack.h” void initializeStack(Stack* stackPtr) { stackPtr -> top = -1; } top: . entry: Stack: addr of Stack stackPtr: -1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

91 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
bool stackEmpty(const Stack* stackPtr) { if (stackPtr-> top < 0) return true; } else return false; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

92 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
bool stackFull(const Stack* stackPtr) { if (stackPtr -> top >= MAXSTACK-1) return true; } else return false; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

93 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void push(Stack* stackPtr, float item) { if (stackFull(stackPtr)) fprintf(stderr, “Stack is full\n”); exit(1); } else stackPtr-> top++; stackPtr-> entry[stackPtr-> top] = item; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

94 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
float pop(Stack* stackPtr) { float item; if (stackEmpty(stackPtr)) fprintf(stderr, “Stack is empty\n”); exit(1); } else item = stackPtr-> entry[stackPtr-> top]; stackPtr-> top--; return item; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

95 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#include <stdio.h> #include “stack.h” int main() { Stack theStack; float next; initializeStack(&theStack); printf(“Enter number sequence: ”); while (scanf(“%f”, &next) != EOF) { if (!stackFull(&theStack)) { push(&theStack, next); } while (!stackEmpty(&theStack)) { next = pop(&theStack); printf(“%f”, next); printf(“\n”); copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

96 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Stack Operations on a Stack push, pop initialize status: empty, full others: clear, size Implementation. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

97 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Next Lecture Queue Main Operations Implementation copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

98 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Basic Data Structures Stacks Queues Lists copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

99 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview What is a Queue? Queue Operations. Applications. Linear Implementation. Circular Implementation. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

100 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Before Front Rear After Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

101 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete Before Front Rear After Front Rear This comes off the queue copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

102 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Operations Initialize the queue. Append an item to the rear of the queue. Serve an item from the front of the queue. Is the queue empty? Is the queue full? What size is the queue? copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

103 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Applications In operating systems, e.g. printer queues, process queues, etc. Simulation programs. Algorithms. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

104 Linear Implementation
1 2 3 4 5 6 7 Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

105 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 1 2 3 4 5 6 7 Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

106 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 1 2 3 4 5 6 7 Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

107 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete 1 2 3 4 5 6 7 Front Rear This comes off the queue copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

108 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete 1 2 3 4 5 6 7 Front Rear This comes off the queue copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

109 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 1 2 3 4 5 6 7 Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

110 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 1 2 3 4 5 6 7 Front Rear NO SPACE HERE copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

111 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 1 2 3 4 5 6 7 Front Rear SPACE HERE copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

112 Circular Implementation
7 6 1 5 2 4 3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

113 Circular Implementation
1 2 3 4 5 6 7 Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

114 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 1 2 3 4 5 6 7 Rear Front copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

115 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#ifndef QUEUE.H #define QUEUE.H #include <stdbool.h> #define MAXQUEUE 20 struct QueueRec { int count; int front; int rear; float entry[MAXQUEUE]; }; typedef struct QueueRec Queue; void intializeQueue(Queue* queuePtr); bool queueEmpty(const Queue* queuePtr); bool queueFull(const Queue* queuePtr); void append(Queue* queuePtr, float item); float serve(Queue* queuePtr); #endif copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

116 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Queue: #define MAXQUEUE 20 struct QueueRec { int count; int front; int rear; float entry[MAXQUEUE]; }; typedef struct QueueRec Queue; count: front: rear: entry: . copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

117 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#include <stdio.h> #include <stdlib.h> #include “queue.h” void initializeQueue(Queue* queuePtr) { queuePtr -> count = 0; queuePtr -> front = 0; queuePtr -> rear = MAXQUEUE-1; } Queue: count: front: queuePtr: addr of Queue 19 rear: entry: . copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

118 bool queueEmpty(const Queue* queuePtr) { if (queuePtr->count <= 0) return true; } else return false;

119 bool queueFull(Queue* queuePtr) { if (queuePtr->count >= MAXQUEUE) return true; } else return false;

120 void append(Queue* queuePtr, float item) { if (queueFull(queuePtr)) fprintf(stderr, “Queue is full\n”); exit(1); } else queuePtr->rear++; if (queuePtr->rear == MAXQUEUE) queuePtr->rear = 0; queuePtr->entry[queuePtr->rear] = item; queuePtr->count++;

121 float serve(Queue* queuePtr)
{ float item; if (queueEmpty(queuePtr)) fprintf(stderr, “Queue is empty\n”); exit(1); } else { item = queuePtr->entry[queuePtr->front]; queuePtr->front++; if (queuePtr->front == MAXQUEUE) queuePtr->front = 0; queuePtr->count--; return item;

122 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Queue Main Operations Implementation. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

123 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Basic Data Types Stack Last-In, First-Out (LIFO) initialize, push, pop, status Queue First-In, First-Out (FIFO) initialize, Insert, delete, status List copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

124 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Lists. Operations. Abstract Data Types (ADT). Programming Styles. Implementations of Lists. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

125 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Lists SEAL FOX DEER APE EMU 1 3 4 2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

126 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insertion EMU Inserted at position 2 SEAL FOX DEER APE 1 3 4 EMU 2 Before: After: APE DEER FOX SEAL 1 2 3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

127 Delete item at position 3
Deletion Delete item at position 3 SEAL DEER APE 1 3 EMU 2 Before: After: APE DEER EMU FOX SEAL 1 2 3 4 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

128 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
List Operations Initialize the list. Determine whether the list is empty. Determine whether the list is full. Find the size of the list. Insert an item anywhere in the list. Delete an item anywhere in a list. Go to a particular position in a list. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

129 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
A List ADT A sequence of elements together with these operations: Initialize the list. Determine whether the list is empty. Determine whether the list is full. Find the size of the list. Insert an item anywhere in the list. Delete an item anywhere in a list. Go to a particular position in a list. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

130 Abstract Data Type (ADT)
A Data Structure together with operations defined on it. Useful to consider what operations are required before starting implementation. Led to the development of object oriented programming. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

131 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
A Stack ADT A sequence of elements together with these operations: Initialize the stack. Determine whether the stack is empty. Determine whether the stack is full. Push an item onto the top of the stack. Pop an item off the top of the stack. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

132 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
A Queue ADT A sequence of elements together with these operations: Initialize the queue. Determine whether the queue is empty. Determine whether the queue is full. Find the size of the queue. Append an item to the rear of the queue. Serve an item at the front of the queue. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

133 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Comparison Stacks Insert at the top of the stack (push) Delete at the top of the stack (pop) Queues Insert at the rear of the queue (append) Delete at the front of the queue (serve) Lists Insert at any position in the list. Delete at any position in the list. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

134 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
A Rational Number ADT Two integers together with these operations: Initialize the rational number. Get the numerator. Get the denominator. Simplify a rational number. Add two rational numbers. Determine whether two rational numbers are equal. etc. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

135 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
A String ADT A array of characters together with these operations: Initialize the string. Copy a string. Read in a line of input. Concatenate two strings. Compare two strings. Find a length of a string. etc. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

136 Simple List Implementation
EMU 1 2 3 4 5 APE DEER FOX SEAL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

137 Simple List Implementation
EMU 1 2 3 4 5 APE DEER FOX SEAL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

138 Simple List Implementation
1 2 3 4 5 APE DEER EMU FOX SEAL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

139 Linked List Implementation: Using Array Index
data start 1 2 3 4 5 DEER FOX APE SEAL 1 3 -1 link to next item marks last item copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

140 Linked List Implementation: Using Array Index
insert: EMU start 1 2 3 4 5 DEER FOX APE SEAL EMU 1 3 -1 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

141 Linked List Implementation: Using Array Index
insert: EMU start 1 2 3 4 5 DEER FOX APE SEAL EMU 4 3 -1 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

142 Linked List Implementation: Using Pointers
start 0x2000 0x2008 0x2010 0x2018 0x2020 0x2018 DEER FOX APE SEAL EMU 0x2020 0x2018 0x2000 NULL 0x2008 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

143 Linked List Implementation: Using Pointers
special pointer constant start 0x2000 0x2008 0x2010 0x2018 0x2020 0x2018 DEER FOX APE SEAL EMU 0x2020 0x2018 0x2000 NULL 0x2008 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

144 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision List initialize, insert, delete, position, status implementations Difference between Stacks, Queues, and Lists. ADT. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

145 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Linked Stack. Push Pop Linked Queue. Insert Delete copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

146 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linked Stack Top of the Stack NULL pointer copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

147 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#ifndef LINKEDSTACKH #define LINKEDSTACKH #include <stdbool.h> #include ”node.h” struct LinkedStackRec { Node* topPtr; }; typedef struct LinkedStackRec Stack; void intializeStack(Stack* stackPtr); bool stackEmpty(const Stack* stackPtr); bool stackFull(const Stack* stackPtr); void push(Stack* stackPtr, float item); float pop(Stack* stackPtr); #endif copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

148 Initialize Stack void initializeStack(Stack* stackPtr) {
stackPtr->topPtr = NULL; }

149 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Push Top Top copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

150 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Push create a new node for the item link the new node to the current top node make the new node the new top copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

151 Push void push(Stack* stackPtr, float item) {
Node* newNodePtr = makeNode(item); newNodePtr->nextPtr = stackPtr->topPtr; stackPtr->topPtr = newNodePtr; }

152 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Pop Top Top copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

153 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Pop check if the stack is empty remember the item in the top node remember address of current top node make the next node the new top free the old top node return the item copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

154 Pop float pop(Stack* stackPtr) { float item;
Node* oldNodePtr = stackPtr->topPtr; if (stackEmpty(stackPtr)) { fprintf(stderr, “Stack is empty\n”); exit(1); } else { item = oldNodePtr->value; stackPtr->topPtr = oldNodePtr->nextPtr; free(oldNodePtr); return item;

155 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linked Queue Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

156 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#ifndef LINKEDQUEUEH #define LINKEDQUEUEH #include <stdbool.h> #include “node.h” struct LinkedQueueRec { int count; Node* frontPtr; Node* rearPtr; }; typedef struct LinkedQueueRec Queue; void intializeQueue(Queue* queuePtr); bool queueEmpty(const Queue* queuePtr); bool queueFull(const Queue* queuePtr); void append(Queue* queuePtr, float item); float serve(Queue* queuePtr); #endif copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

157 Initialize Queue void initializeQueue(Queue* queuePtr) {
queuePtr->frontPtr = NULL; queuePtr->rearPtr = NULL; queuePtr->count = 0; }

158 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

159 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Front Rear Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

160 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert create a new node for the item if the queue is empty: the new node becomes both front and rear of the queue otherwise: make a link from the current rear to the new node the new node becomes the new rear increment the count copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

161 void append(Queue* queuePtr, float item)
{ Node* newNodePtr = makeNode(item); if (queueEmpty(queuePtr)) { queuePtr->frontPtr = newNodePtr; queuePtr->rearPtr = newNodePtr; queuePtr->count = 1; } else { queuePtr->rearPtr->nextPtr = newNodePtr; queuePtr->count++;

162 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

163 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete Front Rear Front Rear copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

164 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete check that the queue is not empty remember the item in the front node remember the address of the front node make the next node the new front free the old front node decrement count if queue is now empty, set rear to NULL return the item copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

165 float serve(Queue* queuePtr)
{ float item; Node* oldNodePtr = queuePtr->frontPtr; if (queueEmpty(queuePtr)) { fprintf(stderr, “Queue is empty\n”); exit(1); } else { item = oldNodePtr->value; queuePtr->frontPtr = oldNodePtr->nextPtr; queuePtr->count--; free(oldNodePtr); if (queuePtr->count == 0) { queuePtr->rearPtr = NULL; return item;

166 #include <stdio.h>
#include “linkedqueue.h” main() { Queue theQueue; float item; initializeQueue(&theQueue); while (scanf(“%f”, &item) != EOF) append(&theQueue, item); } while (!queueEmpty(&theQueue)) item = serve(&theQueue); printf(“%f\n”, item);

167 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Linked Stack. Initialize, Pop, Push. Linked Queue. Initialize, Insert,Delete copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

168 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview What is Dynamic Memory ? How to find the size of objects. Allocating memory. Deallocating memory. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

169 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Virtual Memory Text Segment program instructions static and dynamic data Data Segment free memory local variables, parameters Stack segment copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

170 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Virtual Memory Text Segment global variables, etc. Static data dynamic data Heap Stack segment copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

171 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Virtual Memory Text Segment Static data Heap memory is allocated and deallocated as needed Stack segment copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

172 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
What is Dynamic Memory? Memory which is allocated and deallocated during the execution of the program. Types: data in run-time stack dynamic data in the heap copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

173 Example: Run-Time Stack
Memory is allocated when a program calls a function. parameters local variables where to go upon return Memory is deallocated when a program returns from a function. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

174 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

175 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack 3.15 a b copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

176 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack 3.15 x a 3.15 b copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

177 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack line 16 x 3.15 a 3.15 b copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

178 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack result line 16 x 3.15 a 3.15 b copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

179 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack result 9.9225 line 16 x 3.15 a 3.15 b copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

180 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack result 9.9225 line 16 x 3.15 a 3.15 b copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

181 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack 3.15 a b 9.9225 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

182 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack 3.15 a b 9.9225 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

183 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: #include <stdio.h> float square(float x) { float result; result = x * x; return result; } main() float a = 3.15; float b; b = square(a); printf(“%f\n”, b); stack copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

184 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#include <stdlib.h> #include <stdio.h> int factorial (int x) { if (x == 0) return 1; } return x * factorial (x –1); void main() int n; printf(“Enter a number: \n”); scanf(“%d”, &n); printf(“Factorial: %d\n”, factorial(n); copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

185 How much memory to allocate?
The sizeof operator returns the size of an object, or type, in bytes. Usage: sizeof(Type) sizeof Object copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

186 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: int n; char str[25]; float x; double numbers[36]; printf(“%d\n”, sizeof(int)); printf(“%d\n”, sizeof n); n = sizeof str; n = sizeof x; n = sizeof(double); n = sizeof numbers; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

187 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Notes on sizeof Do not assume the size of an object, or type; use sizeof instead. Example: int n; In DOS: 2 bytes (16 bits) In GCC/Linux: 4 bytes (32 bits) In MIPS: 4 bytes (32 bits) copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

188 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 2: #include <stdio.h> #define MAXNAME 80 #define MAXCLASS 100 struct StudentRec { char name[MAXNAME]; float mark; }; typedef struct StudentRec Student; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

189 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 2 (cont.): int main() { int n; Student class[MAXCLASS]; n = sizeof(int); printf(“Size of int = %d\n”, n); n = sizeof(Student); printf(“Size of Student = %d\n”, n); n = sizeof class; printf(“Size of array class = %d\n”, n); return 0; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

190 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Notes on sizeof (cont.) The size of a structure is not necessarily the sum of the sizes of its members. “alignment” and “padding” Example: struct cardRec { char suit; int number; }; typedef struct cardRec Card; Card hand[5]; printf(“%d\n”, sizeof(Card)); printf(“%d\n”, sizeof hand); 5*sizeof(Card) copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

191 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Dynamic Memory: Heap Memory can be allocated for new objects. Steps: determine how many bytes are needed allocate enough bytes in the heap take note of where it is (memory address) copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

192 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: heap #include <stdlib.h> main() { int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5; free(aPtr); } stack aPtr NULL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

193 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: heap #include <stdlib.h> main() { int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5; free(aPtr); } 0x3a04 stack aPtr 0x3a04 NULL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

194 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: “type cast” heap 0x3a04 #include <stdlib.h> main() { int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5; free(aPtr); } stack aPtr NULL 0x3a04 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

195 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: heap #include <stdlib.h> main() { int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5; free(aPtr); } 0x3a04 5 stack aPtr 0x3a04 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

196 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: heap #include <stdlib.h> main() { int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5; free(aPtr); } stack aPtr 0x3a04 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

197 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: heap #include <stdlib.h> main() { int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5; free(aPtr); } deallocates memory stack aPtr 0x3a04 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

198 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#include <stdlib.h> main() { int* aPtr; int* bPtr; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5; bPtr = (int*)malloc(sizeof(int)); *bPtr = 8; free(aPtr); aPtr = bPtr; *bPtr = 6; } Example 2: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

199 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Allocating Memory Need to include stdlib.h malloc(n) returns a pointer to n bytes of memory. Always check if malloc has returned the NULL pointer. Apply a type cast to the pointer returned by malloc. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

200 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Deallocating Memory free(pointer) deallocates the memory pointed to by a pointer. It does nothing if pointer == NULL. pointer must point to memory previously allocated by malloc. Should free memory no longer being used. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

201 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 3: main() { Student* studentPtr = NULL; studentPtr = (Student*)malloc(sizeof(Student)); if (studentPtr == NULL) { fprintf(stderr, “Out of memory\n”); exit(1); } *studentPtr = readStudent(); printStudent(*studentPtr); free(studentPtr); copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

202 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
main() { Student* class = NULL; int n, i, best = 0; printf(“Enter number of Students: ”); scanf(“%d”, &n); class = (Student*)malloc(n * sizeof(Student)); if (class != NULL) { for (i = 0; i < n; i++) { class[i] = readStudent(); if (class[best].mark < class[i].mark) { best = i; } printf(“Best student: ”); printStudent(class[best]); Example 4: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

203 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Common Errors Assuming that the size of a structure is the sum of the sizes of its members. Referring to memory already freed. Not freeing memory which is no longer required. Freeing memory not allocated by malloc. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

204 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#include <stdio.h> #include <stdlib.h> float** makeMatrix(int n, int m){ float* memoryPtr; float** matrixPtr; int i; memoryPtr = (float*)malloc(n*m*sizeof(float)); matrixPtr = (float**)malloc(n*sizeof(float*)); if (memoryPtr == NULL || matrixPtr == NULL) { fprintf(stderr, “Not enough memory\n”); exit(1); } for (i = 0; i < n; i++, memoryPtr += m){ matrixPtr[i] = memoryPtr; return matrixPtr; Example 5: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

205 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision sizeof malloc free Common errors. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

206 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview of Topic Review List Implementations. Nodes. Linked Stacks. Linked Queues Linked Lists. Other List Operations Today’s Lecture copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

207 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Lists 15 10 3 1 6 1 3 4 2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

208 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
A List ADT A sequence of elements together with these operations: Initialize the list. Determine whether the list is empty. Determine whether the list is full. Find the size of the list. Insert an item anywhere in the list. Delete an item anywhere in a list. Go to a particular position in a list. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

209 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insertion 6 Inserted at position 2 15 10 3 1 4 6 2 Before: After: 1 3 10 15 1 2 3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

210 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
A List ADT A sequence of elements together with these operations: Initialize the list. Determine whether the list is empty. Find the size of the list. Insert an item anywhere in the list. Delete an item anywhere in a list. Go to a particular position in a list. List needs to be able to expand copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

211 Simple List Implementation
6 1 3 10 15 21 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

212 Expansion and Insertion
1 3 10 15 21 Copy old array, leave space for the new value 1 3 6 10 15 21 6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

213 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Disadvantages Lots of memory needs to be allocated. Lots of copying needs to be done. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

214 Linked List Implementation: Using Pointers
insert: 6 start 0x2000 0x2008 0x2010 0x2018 0x2020 3 15 1 21 10 0x2020 0x2018 0x2000 NULL 0x2008 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

215 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Method 1 insert: 6 0x30F0 start 3 15 1 21 0x2000 0x2008 0x2010 0x2018 0x2020 NULL 10 0x30F0 0x30F8 0x3100 0x3108 0x3110 newStart 0x3118 Copy old array, leave space for the new value 1 3 6 10 15 21 0x30F8 0x3100 0x3108 0x3110 0x3118 NULL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

216 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Method 2 insert: 6 start 0x2000 0x2008 0x2010 0x2018 0x2020 3 15 1 21 10 0x2020 0x2018 0x2000 NULL 0x2008 6 newItem 0x30F0 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

217 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Method 2 insert: 6 start 0x2000 0x2008 0x2010 0x2018 0x2020 3 15 1 21 10 0x30F0 0x2018 0x2000 NULL 0x2008 6 newItem 0x30F0 0x2020 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

218 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Advantages Only a little amount of memory needs to be allocated. Only a little amount of copying needs to be done. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

219 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Node: struct NodeRec { float value; struct NodeRec* nextPtr; }; typedef struct NodeRec Node; value: nextPtr: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

220 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#ifndef NODE.H #define NODE.H struct NodeRec { float value; struct NodeRec* nextPtr; }; typedef struct NodeRec Node; Node* makeNode(float item); #endif copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

221 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Make Node To make a new node for an item take enough bytes from the heap remember its address in memory put the item in that location set “next” link to NULL return the node’s address copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

222 Node* makeNode(float item) { Node* newNodePtr = (Node*)malloc(sizeof(Node)); if (newNodePtr == NULL) { fprintf(stderr, “Out of memory”); exit(1); } else { newNodePtr->value = item; newNodePtr->nextPtr = NULL; return newNodePtr;

223 #include <stdio.h>
#include <stdlib.h> #include “node.h” int main() { float item; Node* firstNodePtr = NULL; Node* lastNodePtr = NULL; while (scanf(“%f”, &item) != EOF){ if (firstNodePtr == NULL){ firstNodePtr = makeNode(item); lastNodePtr = firstNodePtr; } else { lastNodePtr->nextPtr = makeNode(item); lastNodePtr = lastNodePtr->nextPtr;

224 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
firstNodePtr: lastNodePtr: item: 0x30F0 0x2124 6 0x30F0 value: 1 0x2A40 nextPtr: 0x2124 value: 6 NULL nextPtr: value: 0x2A40 3 0x2124 nextPtr: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

225 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linked Structure firstNodePtr: 0x30F0 1 0x2A40 0x30F0 0x2124 6 NULL 0x2A40 3 0x2124 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

226 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linked Structure firstNodePtr: 0x30F0 1 0x2A40 0x30F0 0x2A40 3 0x2124 0x2124 6 NULL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

227 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linked Structure firstNodePtr: 1 3 6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

228 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linked Structure firstNodePtr: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

229 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Node How to make a new Node Linked Structure copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

230 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Operations for Lists. Implementation of Linked Lists. Double Linked Lists. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

231 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
List Operations Go to a position in the list. Insert an item at a position in the list. Delete an item from a position in the list. Retrieve an item from a position. Replace an item at a position. Traverse a list. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

232 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Comparsion Linked Storage Unknown list size. Flexibility is needed. Contiguous Storage Known list size. Few insertions and deletions are made within the list. Random access copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

233 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linked List Head 1 2 3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

234 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#ifndef LINKEDLISTH #define LINKEDLISTH #include <stdbool.h> #include “node.h” struct LinkedListRec { int count; Node* headPtr; }; typedef struct LinkedListRec List; void intializeList(List* listPtr); bool listEmpty(const List* listPtr); Node* setPosition(const List* listPtr, int position); void insertItem(List* listPtr, float item, int position); float deleteNode(List* listPtr, int position); #endif copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

235 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Initialize List listPtr addr of list count headPtr NULL void initializeList(List* listPtr) { listPtr->headPtr = NULL; listPtr->count = 0; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

236 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Set Position check if position is within range start with address of head node set count to 0 while count is less than position follow link to next node increment count return address of current node copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

237 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Set Position Head 1 2 2 position copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

238 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Node* setPosition(const List* listPtr, int position) { int i; Node* nodePtr = listPtr->headPtr; if (position < 0 || position >= listPtr->count) { fprintf(stderr, “Invalid position\n”); exit(1); } else { for (i = 0; i < position; i++) { nodePtr = nodePtr->nextPtr; return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

239 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Set Position Head 0x4000 0x2030 0x30a8 2 position i 0x4000 NodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

240 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Set Position Head 0x4000 0x2030 0x30a8 2 position i 0x4000 NodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

241 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Set Position Head 0x4000 0x2030 0x30a8 2 position 1 i 0x2030 NodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

242 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Set Position Head 0x4000 0x2030 0x30a8 2 position 2 i 0x30a8 NodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

243 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Head 1 2 If we insert it at position 0. 1 2 Head copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

244 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Head 1 2 If we insert it at position 0. 2 1 3 Head copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

245 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Instead, suppose we insert it at position 1. Head 1 2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

246 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Instead, suppose we insert it at position 1. Head 3 2 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

247 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void insertItem(List* listPtr, float item, int position) { Node* newNodePtr = makeNode(item); Node* nodePtr = NULL; if (position == 0) newNodePtr->nextPtr = listPtr->headPtr; listPtr->headPtr = newNodePtr; } else nodePtr = setPosition(listPtr, position-1); newNodePtr->nextPtr = nodePtr->nextPtr; nodePtr->nextPtr = newNodePtr; listPtr->count++; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

248 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inserting – New List Head NULL 0x30a8 position 0x30a8 newNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

249 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inserting – New List Head 0x30a8 position 0x30a8 newNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

250 Inserting – Start of List
Head Head 0x30a8 0x2008 0x2000 newNodePtr 0x2000 position copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

251 Inserting – Start of List
Head Head 0x30a8 0x2008 0x2000 newNodePtr 0x2000 position copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

252 Inserting – Start of List
Head Head 0x30a8 0x2008 0x2000 newNodePtr 0x2000 position copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

253 Inserting – Inside the List
Head 0x3080 0x3050 NodePtr 0x3080 0x2000 newNodePtr 0x2000 1 position copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

254 Inserting – Inside the List
Head 0x3080 0x3050 NodePtr 0x3080 0x2000 newNodePtr 0x2000 1 position copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

255 Inserting – Inside the List
Head 0x3080 0x3050 NodePtr 0x3080 0x2000 newNodePtr 0x2000 1 position copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

256 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete Head 1 2 3 If we delete the Node at position 0. 2 1 Head copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

257 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
If we delete the Node at position 2. Head 1 2 3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

258 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
If we delete the Node at position 2. Head 2 1 2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

259 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void deleteNode(List* listPtr, int position) { Node* oldNodePtr = NULL; Node* nodePtr = NULL; if (listPtr->count > 0 && position < listPtr->count) if (position == 0) { oldNodePtr = listPtr->headPtr; listPtr->headPtr = oldNodePtr->nextPtr; } else { nodePtr = setPosition(listPtr, position - 1); oldNodePtr = nodePtr->nextPtr; nodePtr->nextPtr = oldNodePtr->nextPtr; listPtr->count--; free(oldNodePtr); fprintf(stderr, “List is empty or invalid position.\n”); exit(1); copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

260 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Deleting – 1st Node Head 0x4000 0x2030 0x30a8 position 0x4000 NodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

261 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Deleting – 1st Node 0x4000 0x2030 0x30a8 position Head 0x4000 NodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

262 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Deleting – 1st Node 0x2030 0x30a8 position Head 0x4000 NodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

263 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Deleting – Middle Node Head 0x4000 0x2030 0x30a8 1 position 0x2030 NodePtr 0x2030 OldNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

264 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Deleting – Middle Node Head 0x4000 0x2030 0x30a8 1 position 0x2030 NodePtr 0x2030 OldNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

265 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Deleting – Middle Node Head 0x4000 0x30a8 1 position 0x2030 NodePtr 0x2030 OldNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

266 Double Linked List Operations
Go to a position in the list. Insert an item in a position in the list. Delete an item from a position in the list. Retrieve an item from a position. Replace an item at a position. Traverse a list, in both directions. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

267 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Double Linked List 1 2 3 4 Current copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

268 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
struct DoubleLinkNodeRec { float value; struct DoubleLinkNodeRec* nextPtr; struct DoubleLinkNodeRec* previousPtr; }; typedef struct DoubleLinkNodeRec Node; struct DoubleLinkListRec int count; Node* currentPtr; int position; typedef struct DoubleLinkListRec DoubleLinkList; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

269 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert at end 0x4000 0x3080 0x2030 0x2000 0x3080 0x2030 NULL NULL NULL 0x4000 0x3080 NULL 0x2030 currentPtr prevPtr newPtr 0x2000 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

270 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert at end 0x4000 0x3080 0x2030 0x2000 0x3080 0x2030 0x2000 NULL NULL 0x4000 0x3080 NULL 0x2030 currentPtr prevPtr newPtr 0x2000 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

271 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert at end 0x4000 0x3080 0x2030 0x2000 0x3080 0x2030 0x2000 NULL NULL 0x4000 0x3080 0x2030 0x2030 currentPtr prevPtr newPtr 0x2000 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

272 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert inside the list 0x4000 0x3080 0x2030 0x3080 0x2030 NULL NULL 0x4000 0x3080 0x2000 0x3080 currentPtr prevPtr 0x2000 NULL newPtr NULL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

273 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert inside the list 0x4000 0x3080 0x2030 0x3080 0x2030 NULL NULL 0x4000 0x3080 0x2000 0x3080 currentPtr prevPtr 0x2000 2030 newPtr NULL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

274 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert inside the list 0x4000 0x3080 0x2030 0x3080 0x2030 NULL NULL 0x4000 0x3080 0x2000 0x3080 currentPtr prevPtr 0x2000 2030 newPtr 3080 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

275 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert inside the list 0x4000 0x3080 0x2030 0x3080 0x2030 NULL NULL 0x4000 0x2000 0x2000 0x3080 currentPtr prevPtr 0x2000 2030 newPtr 3080 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

276 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert inside the list 0x4000 0x3080 0x2030 0x3080 0x2000 NULL NULL 0x4000 0x2000 0x2000 0x3080 currentPtr prevPtr 0x2000 2030 newPtr 3080 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

277 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete from end 0x4000 0x3080 0x2030 0x3080 0x2030 NULL NULL 0x4000 0x3080 oldPtr 0x2030 currentPtr 0x3080 prevPtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

278 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete from end 0x4000 0x3080 0x2030 0x3080 NULL NULL NULL 0x4000 0x3080 oldPtr 0x2030 currentPtr 0x3080 prevPtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

279 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Delete from end 0x4000 0x3080 0x3080 NULL NULL 0x4000 oldPtr 0x2030 currentPtr 0x3080 prevPtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

280 Delete from inside list
0x4000 0x3080 0x2030 0x3080 0x2030 NULL NULL 0x4000 0x3080 oldPtr 0x3080 currentPtr 0x4000 prevPtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

281 Delete from inside list
0x4000 0x3080 0x2030 0x2030 0x2030 NULL NULL 0x4000 0x3080 oldPtr 0x3080 currentPtr 0x4000 prevPtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

282 Delete from inside list
0x4000 0x3080 0x2030 0x2030 0x2030 NULL NULL 0x4000 0x4000 oldPtr 0x3080 currentPtr 0x4000 prevPtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

283 Delete from inside list
0x4000 0x2030 0x2030 NULL NULL 0x4000 oldPtr 0x3080 currentPtr Head 0x4000 prevPtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

284 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Linked List. Benefits of different implementations. Double Linked List. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

285 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Selection Sort Insertion Sort Linear Search. Binary Search. Growth Rates. Implementation. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

286 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Selection Sort First find the largest element in the array and exchange it with the element in the last position, then find the second largest element in array and exchange it with the element in the second last position, and continue in this way until the entire array is sorted. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

287 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Selection Sort 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

288 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insertion Sort The items of the array are considered one at a time, and each new item is inserted into the appropriate position relative to the previously sorted items. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

289 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insertion Sort 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

290 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linear Search current -7 9 -5 2 8 3 -4 1 2 3 4 5 6 Target is -5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

291 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linear Search current -7 9 -5 2 8 3 -4 1 2 3 4 5 6 Target is -5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

292 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linear Search current -7 9 -5 2 8 3 -4 1 2 3 4 5 6 Target is -5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

293 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linear Search current -7 9 -5 2 8 3 -4 1 2 3 4 5 6 Numbers can be in any order. Works for Linked Lists. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

294 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Search target Lower Part mid copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

295 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Search target Upper Part mid copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

296 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Search target Upper Part mid Need List to be sorted. To be able to do random accesses. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

297 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Search target -1 2 3 5 8 10 15 1 2 3 4 5 6 mid low high copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

298 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Search target -1 2 3 5 8 10 15 1 2 3 4 5 6 mid low high copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

299 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Search target -1 2 3 5 8 10 15 1 2 3 4 5 6 mid high low copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

300 Other Uses of Binary Search
To find where a function is zero. Compute functions. Tree data structures. Data processing. Debugging code. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

301 Growth Rates / Complexity
Recall: Growth Rates / Complexity Constant Logarithmic Linear n log(n) Quadratic Cubic Exponential O(1) O(log(n)) O(n) O(n log(n)) O(n2) O(n3) O(2n) copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

302 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Selection Sort First find the largest element in the array and exchange it with the element in the last position, then find the second largest element in array and exchange it with the element in the second last position, and continue in this way until the entire array is sorted. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

303 Find where the Maximum is.
/* * Find the position of the maximum in * list[0],…,list[k] */ maxPosition = 0; for (j = 1; j <= k; j++) { if (array[j] > array[maxPosition]) { maxPosition = j; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

304 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void selectionSort(float array[], int size) { int j, k; int maxPosition; float tmp; for (k = size-1; k > 0; k--) { maxPosition = 0; for (j = 1; j <= k; j++) { if (array[j] > array[maxPosition]) maxPosition = j; } tmp = array[k]; array[k] = array[maxPosition]; array[maxPosition] = tmp; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

305 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insertion Sort The items of the array are considered one at a time, and each new item is inserted into the appropriate position relative to the previously sorted items. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

306 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void insertionSort(float array[], int size) { int j, k; float current; for (k = 1; k < size; k++) current = array[k]; j = k; while (j > 0 && current < array[j-1]) { array[j] = array[j-1]; j--; } array[j] = current; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

307 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linear Search current -7 9 -5 2 8 3 -4 1 2 3 4 5 6 Numbers can be in any order. Works for Linked Lists. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

308 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Linear Search int linearSearch(float array[], int size, int target) { int i; for (i = 0; i < size; i++) if (array[i] == target) return i; } return -1; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

309 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Search mid Need List to be sorted. To be able to do random accesses. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

310 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Case 1: target < list[mid] target list: New upper lower mid upper copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

311 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Case 2: list[mid] < target target list: New lower lower mid upper copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

312 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
int binarySearch(float array[], int size, int target) { int lower = 0, upper = size - 1, mid; while (lower <= upper) { mid = (upper + lower)/2; if (array[mid] > target) upper = mid - 1; } else if (array[mid] < target) lower = mid + 1; else return mid; return -1; The section where the target could be found halves in size each time copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

313 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Comparison Array Linked List Selection Sort Insertion Sort Linear Search Binary Search copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

314 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Selection Sort Insertion Sort Linear Search Binary Search copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

315 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Unary Recursion Binary Recursion Examples Features Stacks Disadvantages Advantages copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

316 What is Recursion - Recall
A procedure defined in terms of itself Components: Base case Recursive definition Convergence to base case copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

317 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { int i double tmp = 1; if (n > 0) for (i = 0; i < n; i++) tmp *= x; } return tmp; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

318 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; if (n > 0) tmp = power(x, n/2); if (n % 2 == 0) tmp = tmp*tmp; } else tmp = tmp*tmp*x; return tmp; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

319 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Unary Recursion Functions calls itself once (at most) Usual format: function RecursiveFunction ( <parameter(s)> ) { if ( base case ) then return base value else return RecursiveFunction ( <expression> ) } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

320 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Unary Recursion function Factorial ( n ) { if ( n is less than or equal to 1) then return 1 else return n  Factorial ( n - 1 ) } /* Computes the factorial */ int factorial ( int n ) { if ( n <= 1 ) return 1; } else return n*factorial(n-1); copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

321 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Recursion Defined in terms of two or more calls to itself. For example – Fibonacci A series of numbers which begins with 0 and 1 every subsequent number is the sum of the previous two numbers 0, 1, 1, 2, 3, 5, 8, 13, 21,... copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

322 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Recursion function Fibonacci ( n ) { if ( n is less than or equal to 1 ) then return n else return Fibonacci ( n - 2 ) + Fibonacci ( n - 1 ) } /* Compute the n-th Fibonacci number */ long fib ( long n ) { if ( n <= 1 ) return n ; else return fib( n - 2 ) + fib( n - 1 ); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

323 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Copy List HeadPtr struct LinkedListRec { int count; Node* headPtr; }; typedef struct LinkedListRec List; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

324 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#include “linkList.h” Node* copyNodes(Node* oldNodePtr); void copyList(List* newListPtr, List* oldListPtr) { if (listEmpty(oldListPtr)) initializeList(newListPtr); } else newListPtr->headPtr = copyNodes(oldListPtr->headPtr); newListPtr->count = oldListPtr->count; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

325 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Node* copyNodes(Node* oldNodePtr) { Node* newNodePtr = NULL: if (oldNodePtr != NULL) newNodePtr = makeNode(oldNodePtr->value); newNodePtr->nextPtr = copyNodes(oldNodePtr->nextPtr); } return newNodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

326 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Copy Nodes OldNodePtr NewNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

327 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Copy Nodes OldNodePtr NewNodePtr NewNodePtr->next is set to the Result of calling copy nodes on The remainder of the list copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

328 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Copy Nodes OldNodePtr NewNodePtr NewNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

329 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Copy Nodes OldNodePtr NULL NewNodePtr NewNodePtr NewNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

330 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Copy Nodes OldNodePtr NewNodePtr NewNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

331 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Copy Nodes OldNodePtr NewNodePtr copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

332 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Recursion Process Every recursive process consists of: 1. A base case. 2. A general method that reduces to the base case. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

333 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Types of Recursion Direct. Indirect. Linear. n-ary (Unary, Binary, Ternary, …) copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

334 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Stacks Every recursive function can be implemented using a stack and iteration. Every iterative function which uses a stack can be implemented using recursion. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

335 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; if (n > 0) tmp = power(x, n/2); if (n % 2 == 0) tmp = tmp*tmp; } else tmp = tmp*tmp*x; return tmp; x = 2, n = 5 tmp = 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

336 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; if (n > 0) tmp = power(x, n/2); if (n % 2 == 0) tmp = tmp*tmp; } else tmp = tmp*tmp*x; return tmp; x = 2, n = 5 tmp = 1 x = 2, n = 2 tmp = 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

337 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; if (n > 0) tmp = power(x, n/2); if (n % 2 == 0) tmp = tmp*tmp; } else tmp = tmp*tmp*x; return tmp; x = 2, n = 5 tmp = 1 x = 2, n = 2 tmp = 1 x = 2, n = 1 tmp = 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

338 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; if (n > 0) tmp = power(x, n/2); if (n % 2 == 0) tmp = tmp*tmp; } else tmp = tmp*tmp*x; return tmp; x = 2, n = 5 tmp = 1 x = 2, n = 2 tmp = 1 x = 2, n = 1 tmp = 1 x = 2, n = 0 tmp = 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

339 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; if (n > 0) tmp = power(x, n/2); if (n % 2 == 0) tmp = tmp*tmp; } else tmp = tmp*tmp*x; return tmp; x = 2, n = 5 tmp = 1 x = 2, n = 2 tmp = 1 x = 2, n = 1 tmp = 1*1*2 = 2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

340 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; if (n > 0) tmp = power(x, n/2); if (n % 2 == 0) tmp = tmp*tmp; } else tmp = tmp*tmp*x; return tmp; x = 2, n = 5 tmp = 1 x = 2, n = 2 tmp = 2*2 = 4 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

341 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; if (n > 0) tmp = power(x, n/2); if (n % 2 == 0) tmp = tmp*tmp; } else tmp = tmp*tmp*x; return tmp; x = 2, n = 5 tmp = 4*4*2 = 32 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

342 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
module power(x, n) { create a Stack initialize a Stack loop{ if (n == 0) then {exit loop} push n onto Stack n = n/2 } tmp = 1 loop { if (Stack is empty) then {return tmp} pop n off Stack if (n is even) {tmp = tmp*tmp} else {tmp = tmp*tmp*x} n = 5, x = 2 Stack copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

343 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
module power(x, n) { create a Stack initialize a Stack loop{ if (n == 0) then {exit loop} push n onto Stack n = n/2 } tmp = 1 loop { if (Stack is empty) then {return tmp} pop n off Stack if (n is even) {tmp = tmp*tmp} else {tmp = tmp*tmp*x} n = 5, x = 2 Stack 5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

344 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
module power(x, n) { create a Stack initialize a Stack loop{ if (n == 0) then {exit loop} push n onto Stack n = n/2 } tmp = 1 loop { if (Stack is empty) then {return tmp} pop n off Stack if (n is even) {tmp = tmp*tmp} else {tmp = tmp*tmp*x} n = 2, x = 2 Stack 5 2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

345 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
module power(x, n) { create a Stack initialize a Stack loop{ if (n == 0) then {exit loop} push n onto Stack n = n/2 } tmp = 1 loop { if (Stack is empty) then {return tmp} pop n off Stack if (n is even) {tmp = tmp*tmp} else {tmp = tmp*tmp*x} n = 1, x = 2 Stack 5 2 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

346 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
module power(x, n) { create a Stack initialize a Stack loop{ if (n == 0) then {exit loop} push n onto Stack n = n/2 } tmp = 1 loop { if (Stack is empty) then {return tmp} pop n off Stack if (n is even) {tmp = tmp*tmp} else {tmp = tmp*tmp*x} n = 0, x = 2 Stack tmp = 1 5 2 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

347 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
module power(x, n) { create a Stack initialize a Stack loop{ if (n == 0) then {exit loop} push n onto Stack n = n/2 } tmp = 1 loop { if (Stack is empty) then {return tmp} pop n off Stack if (n is even) {tmp = tmp*tmp} else {tmp = tmp*tmp*x} n = 0, x = 2 Stack tmp = 2 5 2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

348 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
module power(x, n) { create a Stack initialize a Stack loop{ if (n == 0) then {exit loop} push n onto Stack n = n/2 } tmp = 1 loop { if (Stack is empty) then {return tmp} pop n off Stack if (n is even) {tmp = tmp*tmp} else {tmp = tmp*tmp*x} n = 0, x = 2 Stack tmp = 4 5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

349 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
module power(x, n) { create a Stack initialize a Stack loop{ if (n == 0) then {exit loop} push n onto Stack n = n/2 } tmp = 1 loop { if (Stack is empty) then {return tmp} pop n off Stack if (n is even) {tmp = tmp*tmp} else {tmp = tmp*tmp*x} n = 0, x = 2 Stack tmp = 32 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

350 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
double power(double x, int n) { double tmp = 1; Stack theStack; initializeStack(&theStack); while (n != 0) { push(&theStack, n); n /= 2; } while (!stackEmpty(&theStack)) { n = pop(&theStack); if (n % 2 == 0) { tmp = tmp*tmp;} else { tmp = tmp*tmp*x;} return tmp; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

351 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Disadvantages May run slower. Compilers Inefficient Code May use more space. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

352 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Advantages More natural. Easier to prove correct. Easier to analysis. More flexible. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

353 Free List – Non Recursive
Head 0x2000 0x258a 0x4c68 /* Delete the entire list */ void FreeList(Node* head){ Node* next; while (head != NULL) { next=head->next; free(head); head=next; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

354 Free List – Non Recursive
head next 0x2000 0x258a 0x4c68 /* Delete the entire list */ void FreeList(Node* head){ Node* next; while (head != NULL) { next=head->next; free(head); head=next; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

355 Free List – Non Recursive
head next 0x258a 0x4c68 /* Delete the entire list */ void FreeList(Node* head){ Node* next; while (head != NULL) { next=head->next; free(head); head=next; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

356 Free List – Non Recursive
head next NULL 0x4c68 /* Delete the entire list */ void FreeList(Node* head){ Node* next; while (head != NULL) { next=head->next; free(head); head=next; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

357 Free List – Non Recursive
head next NULL /* Delete the entire list */ void FreeList(Node* head){ Node* next; while (head != NULL) { next=head->next; free(head); head=next; } Has local variables on the stack. This is performing two assignments and one comparison per iteration. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

358 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List Head /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

359 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List list 0x2000 0x258a 0x4c68 /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } 0x2000 Stack in memory copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

360 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List list 0x2000 0x258a 0x4c68 /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } 0x2000 0x258a Stack in memory copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

361 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List list 0x2000 0x258a 0x4c68 /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } 0x2000 0x258a 0x4c68 Stack in memory copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

362 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List list 0x2000 0x258a 0x4c68 /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } NULL 0x2000 0x258a 0x4c68 Stack in memory copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

363 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List list 0x2000 0x258a 0x4c68 /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } 0x2000 0x258a 0x4c68 Stack in memory copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

364 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List list 0x2000 0x258a /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } 0x2000 0x258a Stack in memory copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

365 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List list 0x2000 /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } 0x2000 Stack in memory copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

366 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Free List Head 0x2000 /* Delete the entire list */ void FreeList(Node* list) { if (list==NULL) return; FreeList(list->next); free(list); } Has no local variables on the stack. This is performing one assignment and one comparison per function call. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

367 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Recursion copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

368 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Trees. Terminology. Traversal of Binary Trees. Expression Trees. Binary Search Trees. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

369 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Trees Family Trees. Organisation Structure Charts. Program Design. Structure of a chapter in a book. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

370 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

371 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree nodes copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

372 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree parent node copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

373 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree child nodes parent node copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

374 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree child nodes parent node copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

375 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree root node copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

376 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree leaf nodes copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

377 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree sub-tree copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

378 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree sub-tree copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

379 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree sub-tree copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

380 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Parts of a Tree sub-tree copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

381 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Tree Each node can have at most 2 children copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

382 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Traversal Systematic way of visiting all the nodes. Methods: Preorder, Inorder, and Postorder They all traverse the left subtree before the right subtree. The name of the traversal method depends on when the node is visited. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

383 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Preorder Traversal Visit the node. Traverse the left subtree. Traverse the right subtree. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

384 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example: Preorder 43 43 31 64 31 64 20 20 40 56 89 40 56 89 28 33 47 59 28 33 47 59 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

385 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder Traversal Traverse the left subtree. Visit the node. Traverse the right subtree. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

386 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example: Inorder 43 43 31 64 31 64 20 20 40 56 89 40 56 89 28 33 47 59 28 33 47 59 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

387 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Postorder Traversal Traverse the left subtree. Traverse the right subtree. Visit the node. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

388 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example: Postorder 43 43 31 64 31 64 20 20 40 56 89 40 56 89 28 33 47 59 28 33 47 59 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

389 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Expression Tree A Binary Tree built with operands and operators. Also known as a parse tree. Used in compilers. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

390 Example: Expression Tree
+ / / 1 3 * 4 6 7 1/ *7 / 4 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

391 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Notation Preorder Prefix Notation Inorder Infix Notation Postorder Postfix Notation copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

392 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example: Infix + + / / / / 1 1 3 * 4 3 * 4 6 7 6 7 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

393 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example: Postfix + + / / / / 1 1 3 * 4 3 * 4 6 7 6 7 Recall: Reverse Polish Notation copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

394 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example: Prefix + / / 1 3 * 4 6 7 + / 1 3 / * 6 7 4 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

395 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Search Tree A Binary Tree such that: Every node entry has a unique key. All the keys in the left subtree of a node are less than the key of the node. All the keys in the right subtree of a node are greater than the key of the node. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

396 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: key is an integer 43 31 64 20 40 56 89 28 33 47 59 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

397 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: key is an integer 43 31 64 20 40 56 89 28 33 47 59 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

398 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Create new node for the item. Find a parent node. Attach new node as a leaf. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

399 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 57 Example: 43 31 64 20 40 56 89 28 33 47 59 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

400 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 57 Example: 43 31 64 20 40 56 89 28 33 47 59 57 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

401 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search: Checklist if target key is less than current node’s key, search the left sub-tree. else, if target key is greater than current node’s key, search the right sub-tree. returns: if found, pointer to node containing target key. otherwise, NULL pointer. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

402 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Example: 59 43 31 64 20 40 56 89 28 33 47 59 57 found copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

403 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Example: 61 43 31 64 20 40 56 89 28 33 47 59 57 failed copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

404 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Binary Tree Preorder, Inorder, Postorder Traveral Expression Trees Prefix, Infix, and Postfix notation Insert and Search copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

405 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Binary Search Trees. Hash Tables. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

406 Recall - Binary Search Tree
A Binary Tree such that: Every node entry has a unique key. All the keys in the left subtree of a node are less than the key of the node. All the keys in the right subtree of a node are greater than the key of the node. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

407 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 1: key is an integer 43 31 64 20 40 56 89 28 33 47 59 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

408 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 2: key is a string Fred Dan Mary Alan Eve Kate Sue Greg Len Bill Eric copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

409 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Binary Tree Node entry link to right child node link to left child node copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

410 Binary Search Tree Node
Example 1: struct TreeNodeRec { int key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

411 Binary Search Tree Node
Example 2: #define MAXLEN 15 struct TreeNodeRec { char key[MAXLEN]; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

412 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Recall: maximum string length is fixed #define MAXLEN 15 struct TreeNodeRec { char key[MAXLEN]; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

413 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 3: struct TreeNodeRec { char* key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

414 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Recall: Allows strings of arbitrary length. Memory needs to be allocated dynamically before use. Use strcmp to compare strings. struct TreeNodeRec { char* key; struct TreeNodeRec* left; struct TreeNodeRec* right; }; typedef struct TreeNodeRec TreeNode; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

415 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

416 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Book Record struct BookRec { char* author; char* title; char* publisher; /* etc.: other book information. */ }; typedef struct BookRec Book; key copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

417 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example 4: Binary Search Tree Node struct TreeNodeRec { Book info; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

418 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Tree Node struct TreeNodeRec { float key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

419 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
#ifndef TREE_H #define TREE_H struct TreeNodeRec { float key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; TreeNode* makeTreeNode(float value); TreeNode* insert(TreeNode* nodePtr, float item); TreeNode* search(TreeNode* nodePtr, float item); void printInorder(const TreeNode* nodePtr); void printPreorder(const TreeNode* nodePtr); void printPostorder(const TreeNode* nodePtr); #endif copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

420 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
MakeNode parameter: item to be inserted steps: allocate memory for the new node check if memory allocation is successful if so, put item into the new node set left and right branches to NULL returns: pointer to (i.e. address of) new node copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

421 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
TreeNode* makeTreeNode(float value) { TreeNode* newNodePtr = NULL; newNodePtr = (TreeNode*)malloc(sizeof(TreeNode)); if (newNodePtr == NULL) fprintf(stderr, “Out of memory\n”); exit(1); } else newNodePtr->key = value; newNodePtr->leftPtr = NULL; newNodePtr->rightPtr = NULL; return newNodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

422 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
value 3.3 newNodePtr NULL newNodePtr 0x2000 0x2000 newNodePtr 0x2000 3.3 0x2000 NULL NULL copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

423 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder Inorder traversal of a Binary Search Tree always gives the sorted order of the keys. void printInorder(TreeNode* nodePtr) { } initially, pointer to root node copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

424 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder Inorder traversal of a Binary Search Tree always gives the sorted order of the keys. void printInorder(TreeNode* nodePtr) { traverse left sub-tree visit the node traverse right sub-tree } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

425 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder Inorder traversal of a Binary Search Tree always gives the sorted order of the keys. void printInorder(TreeNode* nodePtr) { printInorder(nodePtr->leftPtr); printf(“ %f, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

426 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder Inorder traversal of a Binary Search Tree always gives the sorted order of the keys. void printInorder(TreeNode* nodePtr) { if (nodePtr != NULL) printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

427 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

428 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

429 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

430 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

431 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

432 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

433 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

434 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

435 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

436 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

437 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

438 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

439 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

440 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

441 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

442 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

443 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

444 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

445 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

446 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

447 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

448 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

449 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

450 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Inorder nodePtr void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

451 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Example: 59 43 31 64 20 40 56 89 28 33 47 59 57 found copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

452 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Example: 61 43 31 64 20 40 56 89 28 33 47 59 57 failed copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

453 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search: Checklist if target key is less than current node’s key, search the left sub-tree. else, if target key is greater than current node’s key, search the right sub-tree. returns: if found, or if target key is equal to current node’s key, a pointer to node containing target key. otherwise, NULL pointer. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

454 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
TreeNode* search(TreeNode* nodePtr, float target) { if (nodePtr != NULL) if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); } else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

455 Function Call to Search
/* …other bits of code omitted… */ printf(“Enter target ”); scanf(“%f”, &item); if (search(rootPtr, item) == NULL) { printf(“Item was not found\n”); } else printf(“Item found\n”); /* …and so on… */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

456 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.7 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

457 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.7 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

458 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.7 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

459 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.7 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

460 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.5 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

461 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.5 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

462 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.5 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

463 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.5 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

464 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Search Find 0.5 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* search(TreeNode* nodePtr, float target){ if (nodePtr != NULL){ if (target < nodePtr->key) nodePtr = search(nodePtr->leftPtr, target); else if (target > nodePtr->key) nodePtr = search(nodePtr->rightPtr, target); } return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

465 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 57 Example: 43 31 64 20 40 56 89 28 33 47 59 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

466 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert 57 Example: 43 31 64 20 40 56 89 28 33 47 59 57 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

467 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Create new node for the item. Find a parent node. Attach new node as a leaf. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

468 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert: Recursive parameters: pointer to current node (initially: root node). item to be inserted. If current node is NULL Create a new node and return it. Else if item’s key is less (greater) than current node’s key: otherwise, let the left (right) child node be the current node, setting the parent left (right) link equal that node, and repeat recursively. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

469 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); } else if (item < nodePtr->key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

470 Function Call to Insert
/* …other bits of code omitted… */ printf(“Enter number of items ”); scanf(“%d”, &n); for (i = 0; i < n; i++) { scanf(“%f”, &item); rootPtr = insert(rootPtr, item); } /* …and so on… */ copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

471 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Insert 0.9 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item < nodePtr->key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

472 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Insert 0.9 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item < nodePtr->key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

473 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Insert 0.9 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item < nodePtr->key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

474 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Insert 0.9 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 1.1 1.8 TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item < nodePtr->key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

475 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Insert Insert 0.9 nodePtr 1.0 0.6 1.9 0.3 0.8 1.4 2.7 0.4 0.7 0.9 1.1 1.8 TreeNode* insert(TreeNode* nodePtr, float item) { if (nodePtr == NULL) nodePtr = makeTreeNode(item); else if (item < nodePtr->key) nodePtr->leftPtr = insert(nodePtr->leftPtr, item); else if (item > nodePtr->key) nodePtr->rightPtr = insert(nodePtr->rightPtr, item); return nodePtr; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

476 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sorting To sort a sequence of items: Insert items into a Binary Search Tree. Then Inorder Traverse the tree. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

477 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sorting: Analysis Average Case: O(n log(n)) ~ log2 n Insert (i+1)th item: ~ log2(i) comparisons copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

478 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sort Sort the following list into a binary search tree 1.0 2.5 0.5 0.7 3.6 2.1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

479 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sort 1.0 Sort the following list into a binary search tree 2.1 1.0 2.5 0.5 0.7 3.6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

480 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sort 1.0 2.5 Sort the following list into a binary search tree 2.1 1.0 2.5 0.5 0.7 3.6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

481 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sort 1.0 0.5 2.5 Sort the following list into a binary search tree 2.1 1.0 2.5 0.5 0.7 3.6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

482 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sort 1.0 0.5 2.5 0.7 Sort the following list into a binary search tree 1.0 2.5 0.5 0.7 3.6 2.1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

483 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sort 1.0 0.5 2.5 0.7 3.6 Sort the following list into a binary search tree 1.0 2.5 0.5 0.7 3.6 2.1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

484 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sort 1.0 0.5 2.5 0.7 2.1 3.6 Sort the following list into a binary search tree 1.0 2.5 0.5 0.7 3.6 2.1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

485 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Sorting: Analysis Worst Case: O(n2) Example: Insert: 1, 3, 7, 9, 11, 15 Insert (i+1)th item: ~ i comparisons copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

486 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Binary Search Tree Make Tree Node, Insert item, Search for an item, and Print Inorder. Tree sort. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

487 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Overview Divide and Conquer Merge Sort Quick Sort copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

488 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Divide and Conquer Recall: Binary Search Search Search Search copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

489 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Divide and Conquer Sort Sort Sort Sort Sort Sort Sort copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

490 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Divide and Conquer Combine Combine Combine copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

491 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Divide and Conquer module sort(array) { if (size of array > 1) split(array, firstPart, secondPart) sort(firstPart) sort(secondPart) combine(firstPart, secondPart) } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

492 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Divide and Conquer module sort(array) { if (size of array > 1) split(array, firstPart, secondPart) sort(firstPart) sort(secondPart) combine(firstPart, secondPart) } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

493 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Divide and Conquer module sort(array) { if (size of array > 1) split(array, firstPart, secondPart) sort(firstPart) sort(secondPart) combine(firstPart, secondPart) } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

494 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Divide and Conquer module sort(array) { if (size of array > 1) split(array, firstPart, secondPart) sort(firstPart) sort(secondPart) combine(firstPart, secondPart) } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

495 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Divide and Conquer module sort(array) { if (size of array > 1) split(array, firstPart, secondPart) sort(firstPart) sort(secondPart) combine(firstPart, secondPart) } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

496 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Merge Sort Sort Sort Merge copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

497 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Merge Sort array: size tmpArrayPtr: tmp: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

498 secondPart : array + mid
Merge Sort array[0] array[mid] mid (size - mid) firstPart : array secondPart : array + mid copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

499 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Merge Sort array: mergeList tmp: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

500 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Merge Sort array: tmp: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

501 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Merge Sort array: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

502 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void mergeSort(float array[], int size) { int* tmpArrayPtr = (int*)malloc(size*sizeof(int)); if (tmpArrayPtr != NULL) mergeSortRec(array, size, tmpArrayPtr); } else fprintf(stderr, “Not enough memory to sort list.\n”); exit(1); free(tmpArrayPtr); copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

503 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void mergeSortRec(float array[], int size, float tmp[]) { int i; int mid = size/2; if (size > 1) mergeSortRec(array, mid, tmp); mergeSortRec(array+mid, size-mid, tmp); mergeArrays(array, mid, array+mid, size-mid, tmp); for (i = 0; i < size; i++) array[i] = tmp[i]; } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

504 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 aSize: 5 bSize: 6 tmp: copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

505 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=0 j=0 tmp: k=0 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

506 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=0 j=0 tmp: 3 k=0 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

507 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=1 j=0 tmp: 3 5 k=1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

508 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=2 j=0 tmp: 3 5 6 k=2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

509 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=2 j=1 tmp: 3 5 6 10 k=3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

510 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=2 j=2 tmp: 3 5 6 10 14 k=4 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

511 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=2 j=3 tmp: 3 5 6 10 14 15 k=5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

512 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=3 j=3 tmp: 3 5 6 10 14 15 22 k=6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

513 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=3 j=4 tmp: 3 5 6 10 14 15 22 28 k=7 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

514 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=4 j=4 tmp: 3 5 6 10 14 15 22 28 30 k=8 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

515 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
mergeArrays Example: a: b: 3 5 15 28 30 6 10 14 22 43 50 i=5 j=4 Done. tmp: 3 5 6 10 14 15 22 28 30 43 50 k=9 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

516 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
void mergeArrays(float a[],int aSize,float b[],int bSize,float tmp[]) { int k, i = 0, j = 0; for (k = 0; k < aSize + bSize; k++) if (i == aSize) { tmp[k] = b[j]; j++; } else if (j == bSize) { tmp[k] = a[i]; i++; else if (a[i] <= b[j]) { else { copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

517 Merge Sort and Linked Lists
copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

518 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Merge Sort Analysis Most of the work is in the merging. Takes O(n log(n)) Uses more space than other sorts. Useful for linked lists. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

519 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Quick Sort Partition x < p p p <= x Sort Sort copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

520 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Quick Sort Example: array: 5 89 35 10 24 15 37 13 20 17 70 size: 11 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

521 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Quick Sort Example: array: 5 89 35 14 24 15 15 37 13 20 7 70 “pivot element” copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

522 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Quick Sort Example: array: 5 89 35 14 24 15 37 13 20 7 70 partition: 5 89 35 14 24 37 13 20 7 70 15 7 14 5 13 15 35 37 89 20 24 70 index: 4 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

523 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Quick Sort Example: index: 4 array: 7 14 5 13 15 35 37 89 20 24 70 index (size - index - 1) copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

524 secondPart : array + index + 1
Quick Sort Example: array[0] array[index + 1] 7 14 5 13 15 35 37 89 20 24 70 index (size - index - 1) firstPart : array secondPart : array + index + 1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

525 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Quick Sort void quickSort(float array[], int size) { int index; if (size > 1) index = partition(array, size); quickSort(array, index); quickSort(array+index+1, size - index - 1); } copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

526 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition: Checklist p p p x < p p <= x p x < p p <= x p x < p p <= x copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

527 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: mid: 4 array: 5 5 89 35 14 24 15 15 37 13 20 7 70 15 89 35 14 24 5 37 13 20 7 70 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

528 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: array: 15 89 35 14 24 5 37 13 20 7 70 k=1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

529 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:0 array: 15 89 89 35 14 24 5 37 13 20 7 70 k:1 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

530 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:0 array: 15 89 35 35 14 24 5 37 13 20 7 70 k:2 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

531 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:0 array: 15 89 35 14 14 24 5 37 13 20 7 70 k:3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

532 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:1 array: 15 89 14 89 35 14 24 5 37 13 20 7 70 k:3 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

533 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:1 array: 15 14 35 89 24 24 5 37 13 20 7 70 k:4 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

534 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:1 array: 15 14 35 89 24 5 5 37 13 20 7 70 k:5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

535 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:2 array: 15 14 35 5 35 89 24 5 37 13 20 7 70 k:5 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

536 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:2 array: 15 14 5 89 24 35 37 37 13 20 7 70 k:6 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

537 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:2 array: 15 14 5 89 24 35 37 13 20 7 70 k:7 etc... copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

538 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:4 array: 15 14 5 13 7 35 37 89 20 24 70 k:11 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

539 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:4 array: 15 14 5 13 7 35 37 89 20 24 70 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

540 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Partition Example: index:4 array: 15 7 15 14 5 13 7 35 37 89 20 24 70 x < 15 15 <= x copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

541 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example: pivot now in correct position array: 15 7 15 14 5 13 7 35 37 89 20 24 70 x < 15 15 <= x copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

542 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Example: 7 14 5 13 15 35 37 89 20 24 70 Sort Sort 7 14 5 13 35 37 89 20 24 70 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

543 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
int partition(float array[], int size) { int k; int mid = size/2; int index = 0; swap(array, array+mid); for (k = 1; k < size; k++) if (list[k] < list[0]) index++; swap(array+k, array+index); } swap(array, array+index); return index; copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

544 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Quick Sort Analysis Most of the work done in partitioning. Need to be careful of choice of pivot. Example: 2, 4, 6, 7, 3, 1, 5 Average case takes O(n log(n)) time. Worst case takes O(n2) time. copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE

545 copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE
Revision Merge Sort Quick Sort copy right (version1.0) SUNITHA C.N,CS&E dept,SJCE


Download ppt "Lectures on data structures and C 3ed CS(CSI33) By, CHANDRASHEKAR A.M."

Similar presentations


Ads by Google