Download presentation
Presentation is loading. Please wait.
Published byHadian Halim Modified over 6 years ago
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.