1 lectures on data structures and c 3ed cs(csi33) by, chandrashekar a.m

Post on 18-Dec-2015

220 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

1

Lectures on Lectures on data structures anddata structures and C C

3ed CS(CSI33)3ed CS(CSI33)By,By,

CHANDRASHEKAR A.M.CHANDRASHEKAR A.M.

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

2

Data Structures and AlgorithmsData Structures and Algorithms

• Programs.

• Different problems.

• Operations.

• Size of data.

• Resources available.

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

3

Overview of LectureOverview 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

This Lecture - ReviewThis 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

Basic Data types in CBasic Data types in C

• int

• char

• float

• double

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

6

BooleanBoolean

• 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

#include <stdbool.h>

bool leapYear(int year){ if ((year % 4 == 0 && year % 100 != 0)

|| (year % 400 == 0) ) { return true; } else { return false; }}

#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; }}

For Borland use #define or const int

#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

Recall:

#include <stdbool.h>

bool leapYear(int year){ if ((year % 4 == 0 && year % 100 != 0)

|| (year % 400 == 0) ) { return true; } else { return false; }}

Function definitionRecall:

Function name#include <stdbool.h>

bool leapYear(int year){ if ((year % 4 == 0 && year % 100 != 0)

|| (year % 400 == 0) ) { return true; } else { return false; }}

Recall:

Must be compatible with the function’s return type

Function return type

#include <stbool.h>

bool leapYear(int year){ if ((year % 4 == 0 && year % 100 != 0)

|| (year % 400 == 0) ) { return true; } else { return true; }}

Recall:

#include <stdbool.h>

bool leapYear(int year){ if ((year % 4 == 0 && year % 100 != 0)

|| (year % 400 == 0) ) { return true; } else { return false; }}

Parameter type

Function parameter

Recall:

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);}

Recall:

Function call

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

15

Review - Arrays (1D)Review - Arrays (1D)

• All the elements are of the same type.

• An element: array1D[index]

• In C, the first element has index 0 (zero).

array1D:

0 1 N - 1

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

16

Review - Multidimensional ArraysReview - Multidimensional Arrays

• Arrays of arrays.

• All the elements are of the same type.

• An element: array2D[row][column]

array2D:

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;}

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;}

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;}

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;}

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

21

• 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

Review – Input/OutputReview – Input/Output

Conversion specifiers Pointers to variables where input will be stored

Variables containing data to be printed

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

22

• 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

Review – Input/OutputReview – Input/Output

#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

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

24

• 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

Review - StringsReview - Strings

#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”);

string2 needs to be the same length as string

1

string1 needs to fit the number of characters of the second string, +1 for

the ‘\0’ character

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;

}

Prints the order which

the two strings sort,

alphabetically.

Note: To scan within a string use:sscanf(string1, “%d”, int1);

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

27

Review -File Handling in CReview -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().

#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”); return 1; }

Moder : read

w : writea : append

Associate a file handler for every file to be used.

fopen() returns NULL if an error

occurs

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

#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;

}

To read in a line, use fgets().fgets() returns NULL if end of file is reached.

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?

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

31

Review -Review - struct struct

• Members may have different types.

structname.membername• structs are also known as “records,” and

members as “fields”

structname:

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

32

Review -Review - typedef typedef

• Gives a new name to a type that has already been defined.

• E.g.

typedef struct StudentRec Student;

• Saves typing struct whatever everywhere.

#include <stdio.h>

#define MAXNAME 80

struct StudentRec{ char name[MAXNAME]; int mark;};

typedef struct StudentRec Student;

Example :

Recall:

Macro substitution

#include <stdio.h>

#define MAXNAME 80

struct StudentRec{ char name[MAXNAME]; int mark;};

typedef struct StudentRec Student;

#include <stdio.h>

#define MAXNAME 80

struct StudentRec{ char name[MAXNAME]; int mark;};

typedef struct StudentRec Student;

Recall:

Structure declaration

Structure name / tag

Members

Don’t forget this!

Recall:

#include <stdio.h>

#define MAXNAME 80

struct StudentRec{ char name[MAXNAME]; int mark;};

typedef struct StudentRec Student;

Recall:

Data type

New type name

#include <stdio.h>

#define MAXNAME 80

struct StudentRec{ char name[MAXNAME]; int mark;};

typedef struct StudentRec Student;

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); }

Recall:

An instance of the struct

A member of a struct variable“Package”

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); }

#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]);}

Recall:

Array of instances of structs

Assignment

Member of an array element

#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]);}

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

42

RevisionRevision• Basic Data Types and booleans• I/O and File I/O• Arrays and Structs• Strings• Typedef

PreparationPreparationNext lecture: Pointers

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

43

OverviewOverview

• Revision of Pointers

• Basic Pointer Arithmetic

• Pointers and Arrays

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

44

PointersPointers

• 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

10x2000

0x9060

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

45

Pointer OperationsPointer Operations

• 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

Type object;Type* aPtr;

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

46

Pointers and Function ArgumentsPointers and Function Arguments

x: 1

y: 2swap

x: 2

y: 1

#include <stdio.h>

voidfakeSwap(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

#include <stdio.h>

voidfakeSwap(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);}

1

2

x:

y:

Solution 1

0x2000

0x2010

#include <stdio.h>

voidfakeSwap(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);}

1

2

x:

y:

1

2

a:

b:

tmp:

Solution 1

0x2000

0x2010

0x2060

0x2038

0x2040

#include <stdio.h>

voidfakeSwap(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);}

1

2

x:

y:

1

2

a:

b:

1tmp:

Solution 1

0x2000

0x2010

0x2060

0x2038

0x2040

#include <stdio.h>

voidfakeSwap(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);}

1

2

x:

y:

2

2

a:

b:

1tmp:

Solution 1

0x2000

0x2010

0x2060

0x2038

0x2040

#include <stdio.h>

voidfakeSwap(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);}

1

2

x:

y:

2

1

a:

b:

1tmp:

Solution 1

0x2000

0x2010

0x2060

0x2038

0x2040

#include <stdio.h>

voidfakeSwap(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);}

1

2

x:

y:

Solution 1

0x2000

0x2010

#include <stdio.h>

voidtrueSwap(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

#include <stdio.h>

voidtrueSwap(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);}

1

2

x:

y:

Solution 2

0x2000

0x2010

#include <stdio.h>

voidtrueSwap(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);}

1

2

x:

y:

addr of x

addr of y

a:

b:

tmp:

Solution 2

0x2000

0x2010

0x2060

0x2038

0x2040

#include <stdio.h>

voidtrueSwap(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);}

1

2

x:

y:

addr of x

addr of y

a:

b:

1tmp:

Solution 2

0x2000

0x2010

0x2060

0x2038

0x2040

#include <stdio.h>

voidtrueSwap(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);}

2

2

x:

y:

addr of x

addr of y

a:

b:

1tmp:

Solution 2

0x2000

0x2010

0x2060

0x2038

0x2040

#include <stdio.h>

voidtrueSwap(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);}

2

1

x:

y:

addr of x

addr of y

a:

b:

1tmp:

Solution 2

0x2000

0x2010

0x2060

0x2038

0x2040

#include <stdio.h>

voidtrueSwap(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);}

2

1

x:

y:

Solution 2

0x2000

0x2010

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

61

More on PointersMore 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

struct DataBaseRec{

};

typedef struct DataBaseRec DataBase;

/* Very Large Structure */

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

63

DataBasereadNewEntry(DataBase theDataBase){

return theDataBase;}

voidprintDataBase(DataBase theDataBase){

}

/* Some code */

/* Some more code */

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

64

voidreadNewEntry(DataBase* dataBasePtr){

}

voidprintDataBase(const DataBase* dataBasePtr){

}

/* Some code */

/* Some more code */

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

65

voidreadNewEntry(DataBase* dataBasePtr){

}

voidprintDataBase(const DataBase* dataBasePtr){

}

/* Some code */

/* Some more code */

(DataBase*

Address of Database

Database*

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

66

voidreadNewEntry(DataBase* dataBasePtr){

}

voidprintDataBase(const DataBase* dataBasePtr){

}

/* Some code */

/* Some more code */

Database cannot change in this function.

const

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

67

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 FunctionsPointers 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

Pointers and ArraysPointers and Arrays

• 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.

Type array[size];

Type* pPtr = array + i;

Type* qPtr = array + j;

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

70

Pointers and Arrays (cont)Pointers and Arrays (cont)

• array[0] is equivalent to *array• array[n] is equivalent to *(array + n)

Type array[size];

A normal 1 dimensional array:

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

71

float array[5];

float* pPtr = array;

float* qPtr = NULL;

0x2008

0x2008

0x2004

array:

pPtr:

0x2008 0x200C 0x2010 0x2014 0x2018

0 1 2 3 4

NULL0x2000

qPtr:

Basic Pointer ArithmeticBasic Pointer Arithmetic

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

72

float array[5];

float* pPtr = array;

float* qPtr = NULL;

pPtr++; /* pPtr now holds the address: &array[1] */

0x200C

0x2008

0x2004

array:

pPtr:

0x2008 0x200C 0x2010 0x2014 0x2018

0 1 2 3 4

NULL0x2000

qPtr:

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

73

float array[5];

float* pPtr = array;

float* qPtr = NULL;

pPtr++; /* pPtr = &array[1] */

pPtr += 3; /* pPtr now hold the address: &array[4] */

0x2018

0x2008

0x2004

array:

pPtr:

0x2008 0x200C 0x2010 0x2014 0x2018

0 1 2 3 4

NULL0x2000

qPtr:

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

74

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]*/

0x2018

0x2008

0x2004

array:

pPtr:

0x2008 0x200C 0x2010 0x2014 0x2018

0 1 2 3 4

0x20100x2000

qPtr:

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

75

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);

0x2018

0x2008

0x2004

array:

pPtr:

0x2008 0x200C 0x2010 0x2014 0x2018

0 1 2 3 4

0x20100x2000

qPtr:

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;}

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

77

RevisionRevision

• 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

Next LectureNext Lecture• Stacks

– abstract data type– main operations– implementation

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

79

Basic Data StructuresBasic Data Structures

• Stacks

• Queues

• Lists

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

80

Overview of StacksOverview 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

A StackA Stack

Top

Items on the Stack

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

82

PushPush

Top

After

Top

Before

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

83

PopPop

Top

Before After

Top

This comes off the stack

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

84

OperationsOperations

• 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

Stack PropertiesStack 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

ImplementationImplementation

Top

index0

1

2

:

array(upside-down)

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

87

ImplementationImplementation

Top

float entry[MAXSTACK];

int top;0

1

2

:

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

88

#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

#define MAXSTACK 20

struct StackRec{ int top; float entry[MAXSTACK];};

typedef struct StackRec Stack;

Stack:

.

.

.

entry:

top:

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

90

#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

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

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

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

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

#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

RevisionRevision• 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

Next LectureNext Lecture

• Queue

• Main Operations

• Implementation

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

98

Basic Data StructuresBasic Data Structures

• Stacks

• Queues

• Lists

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

99

OverviewOverview

• What is a Queue?

• Queue Operations.

• Applications.

• Linear Implementation.

• Circular Implementation.

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

100

InsertInsertBefore

Front RearAfter

Front Rear

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

101

DeleteDeleteBefore

Front Rear

After

Front RearThis comes off the queue

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

102

OperationsOperations

• 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

ApplicationsApplications

• 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 ImplementationLinear Implementation

Front Rear

0 1 2 3 4 5 6 7

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

105

InsertInsert

Front Rear

0 1 2 3 4 5 6 7

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

106

InsertInsert

Front Rear

0 1 2 3 4 5 6 7

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

107

DeleteDelete

Front Rear

0 1 2 3 4 5 6 7

This comes off the queue

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

108

DeleteDelete

Front Rear

0 1 2 3 4 5 6 7

This comes off the queue

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

109

InsertInsert

Front Rear

0 1 2 3 4 5 6 7

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

110

InsertInsert

Front Rear

0 1 2 3 4 5 6 7

NO SPACE

HERE

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

111

InsertInsert

Front Rear

0 1 2 3 4 5 6 7

SPACE HERE

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

112

Circular ImplementationCircular Implementation07

1

2

34

5

6

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

113

Circular ImplementationCircular Implementation

Front Rear

0 1 2 3 4 5 6 7

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

114

InsertInsert

FrontRear

0 1 2 3 4 5 6 7

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

115

#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

#define MAXQUEUE 20

struct QueueRec{ int count; int front; int rear; float entry[MAXQUEUE];};

typedef struct QueueRec Queue;

Queue:

.

.

.

entry:

count:

front:

rear:

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

117

#include <stdio.h>#include <stdlib.h>#include “queue.h”

void initializeQueue(Queue* queuePtr){ queuePtr -> count = 0; queuePtr -> front = 0; queuePtr -> rear = MAXQUEUE-1;}

rear:

.

.

.

entry:

Queue:

addr of Queue

queuePtr:

19

count: 0

front: 0

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

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

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++; }}

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;}

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

122

RevisionRevision

• Queue

• Main Operations

• Implementation.

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

123

Basic Data TypesBasic Data Types

StackLast-In, First-Out (LIFO)initialize, push, pop, status

QueueFirst-In, First-Out (FIFO)initialize, Insert, delete, status

• List

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

124

OverviewOverview

• Lists.

• Operations.

• Abstract Data Types (ADT).

• Programming Styles.

• Implementations of Lists.

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

125

ListsLists

SEALFOXDEERAPE EMU0 1 3 42

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

126

InsertionInsertion

SEALFOXDEERAPE0 1 32

EMU Inserted at position 2

SEALFOXDEERAPE0 1 3 4

EMU2

Before:

After:

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

127

DeletionDeletion

SEALFOXDEERAPE0 1 3 4

EMU2

Delete item at position 3

SEALDEERAPE0 1 3

EMU2

Before:

After:

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

128

List OperationsList 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

A List ADTA List ADT

• 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.

A sequence of elements together with these operations:

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

130

Abstract Data Type (ADT)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

A Stack ADTA Stack ADT

• 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.

A sequence of elements together with these operations:

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

132

A Queue ADTA Queue ADT

• 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.

A sequence of elements together with these operations:

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

133

ComparisonComparison

• 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

A Rational Number ADTA Rational Number ADT

• 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.

Two integers together with these operations:

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

135

A String ADTA String ADT

• 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.

A array of characters together with these operations:

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

136

Simple List ImplementationSimple List Implementation

0 1 2 3 4 5

APE DEER FOX SEAL

EMU

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

137

Simple List ImplementationSimple List Implementation

0 1 2 3 4 5

APE DEER FOX SEAL

EMU

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

138

Simple List ImplementationSimple List Implementation

0 1 2 3 4 5

APE DEER FOX SEALEMU

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

139

Linked List Implementation:Linked List Implementation:Using Array IndexUsing Array Index

DEER FOX APE SEAL

0 1 2 3 4 5

1 3 0 -1

data

marks last item

start

link to next item

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

140

Linked List Implementation:Linked List Implementation:Using Array IndexUsing Array Index

DEER FOX APE SEAL

0 1 2 3 4 5

3 0 -1

startinsert: EMU

EMU

11

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

141

Linked List Implementation:Linked List Implementation:Using Array IndexUsing Array Index

DEER FOX APE SEAL

0 1 2 3 4 5

4 3 0 -1

startinsert: EMU

EMU

1

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

142

Linked List Implementation:Linked List Implementation:Using PointersUsing Pointers

DEER FOX APE SEAL

0x2000 0x2008 0x2010 0x2018 0x2020 0x2018

0x2020 0x2018 0x2000 NULL

start

EMU

0x2008

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

143

Linked List Implementation:Linked List Implementation:Using PointersUsing Pointers

DEER FOX APE SEAL

0x2000 0x2008 0x2010 0x2018 0x2020 0x2018

0x2020 0x2018 0x2000 NULL

start

EMU

0x2008

special pointerconstant

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

144

RevisionRevision

• 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

OverviewOverview

• Linked Stack.– Push– Pop

• Linked Queue.– Insert– Delete

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

146

Linked StackLinked Stack

Top of the Stack

NULL pointer

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

147

#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

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

Initialize StackInitialize Stack

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

149

PushPush

Top

Top

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

150

PushPush

• create a new node for the item

• link the new node to the current top node

• make the new node the new top

void push(Stack* stackPtr, float item){ Node* newNodePtr = makeNode(item);

newNodePtr->nextPtr = stackPtr->topPtr; stackPtr->topPtr = newNodePtr;}

PushPush

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

152

PopPopTop

Top

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

153

PopPop

• 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

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;}

PopPop

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

155

Linked QueueLinked Queue

Front Rear

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

156

#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

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

Initialize QueueInitialize Queue

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

158

InsertInsert

Front Rear

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

159

InsertInsert

Front Rear

Front Rear

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

160

InsertInsert• 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

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->rearPtr = newNodePtr; queuePtr->count++; } }

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

162

DeleteDelete

Front Rear

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

163

DeleteDelete

Front Rear

RearFront

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

164

DeleteDelete

• 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

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;}

#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); }}

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

167

RevisionRevision

• Linked Stack.– Initialize, Pop, Push.

• Linked Queue.– Initialize, Insert,Delete

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

168

OverviewOverview

• 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

Virtual MemoryVirtual Memory

Text Segment

Data Segment

Stack segment

program instructions

static and dynamic data

local variables, parameters

free memory

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

170

Virtual MemoryVirtual Memory

Text Segment

Static data

Heap

Stack segment

global variables, etc.

dynamic data

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

171

Virtual MemoryVirtual Memory

Text Segment

Static data

Heap

Stack segment

memory is allocated and deallocated as needed

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

172

What is Dynamic Memory?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 StackExample: 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

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

stackstack

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

175

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

stack

3.15a

b

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

176

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

stack

3.15a

b

3.15x

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

177

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

stack

3.15a

b

3.15x

line 16

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

178

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

stack

3.15a

b

3.15x

line 16

result

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

179

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

stack

3.15a

b

3.15x

line 16

9.9225result

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

180

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

stack

3.15a

b

3.15x

line 16

9.9225result

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

181

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

9.9225

stack

3.15a

b

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

182

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

9.9225

stack

3.15a

b

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

183

#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);}

01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:

stackstack

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

184

#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?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

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

Notes on Notes on sizeofsizeof

•Do not assume the size of an object, or type; use sizeof instead.

•In DOS: 2 bytes (16 bits)•In GCC/Linux: 4 bytes (32 bits)•In MIPS: 4 bytes (32 bits)

Example: int n;

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

188

#include <stdio.h>

#define MAXNAME 80#define MAXCLASS 100

struct StudentRec{ char name[MAXNAME]; float mark;};

typedef struct StudentRec Student;

Example 2:

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

189

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;}

Example 2 (cont.):

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

190

Notes on Notes on sizeof sizeof (cont.)(cont.)•The size of a structure is not necessarily the sum of the sizes of its members.

Example: struct cardRec { char suit; int number;};

typedef struct cardRec Card;

Card hand[5];

printf(“%d\n”, sizeof(Card));printf(“%d\n”, sizeof hand);

“alignment” and “padding”

5*sizeof(Card)

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

191

Dynamic Memory: HeapDynamic 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

#include <stdlib.h>

main(){ int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5;

free(aPtr);}

Example 1:

NULL

stack

aPtr

heap

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

193

#include <stdlib.h>

main(){ int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5;

free(aPtr);}

heap

0x3a04

NULL

stack

aPtr 0x3a04

Example 1:

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

194

#include <stdlib.h>

main(){ int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5;

free(aPtr);}

heap

0x3a04

NULL

stack

aPtr 0x3a04

“type cast”

Example 1:

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

195

#include <stdlib.h>

main(){ int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5;

free(aPtr);}

5

heap

0x3a04

stack

aPtr 0x3a04

Example 1:

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

196

#include <stdlib.h>

main(){ int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5;

free(aPtr);}

0x3a04

stack

aPtr

Example 1:

heap

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

197

#include <stdlib.h>

main(){ int* aPtr = NULL; aPtr = (int*)malloc(sizeof(int)); *aPtr = 5;

free(aPtr);}

0x3a04

stack

aPtr

Example 1:

deallocates memory

heap

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

198

#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 = (int*)malloc(sizeof(int)); *bPtr = 6;}

Example 2:

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

199

Allocating MemoryAllocating Memory

• NeedNeed to include stdlib.h• malloc(n) returns a pointer to n bytes of

memory.

• AlwaysAlways check if malloc has returned the NULL pointer.

• ApplyApply a type cast to the pointer returned by malloc.

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

200

Deallocating MemoryDeallocating 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.• ShouldShould free memory no longer being used.

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

201

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);}

Example 3:

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

202

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

Common ErrorsCommon 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

#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

RevisionRevision

• sizeof

• malloc

• free

• Common errors.

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

206

Overview of TopicOverview 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

ListsLists

151031 60 1 3 42

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

208

A List ADTA List ADT

• 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.

A sequence of elements together with these operations:

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

209

InsertionInsertion

1510310 1 32

6 Inserted at position 2

1510310 1 3 4

62

Before:

After:

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

210

A List ADTA List ADT

• 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.

A sequence of elements together with these operations:

List needs to be able to expand

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

211

Simple List ImplementationSimple List Implementation

1 3 10 15 21

6

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

212

Expansion and InsertionExpansion and Insertion

1 3 10 15 21

1 3 10 15 21

6

6

Copy old array, leave space for the new value

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

213

DisadvantagesDisadvantages

• 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:Linked List Implementation:Using PointersUsing Pointers

3 15 1 21

0x2000 0x2008 0x2010 0x2018 0x2020

0x2020 0x2018 0x2000 NULL

start

10

0x2008

insert: 6

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

215

Method 1Method 1 start

3 15 1 21

0x2000 0x2008 0x2010 0x2018 0x2020

0x2020 0x2018 0x2000 NULL

10

0x2008

0x30F0 0x30F8 0x3100 0x3108 0x3110

newStart

0x3118

insert: 6

1 3

0x30F8 0x3100 0x3108 0x3110 0x3118 NULL

6 10 15 21

0x30F0

Copy old array, leave space for the new value

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

216

Method 2Method 2

3 15 1 21

0x2000 0x2008 0x2010 0x2018 0x2020

0x2020 0x2018 0x2000 NULL

start

10

0x2008

insert: 6

6newItem

0x30F0

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

217

Method 2Method 2

3 15 1 21

0x2000 0x2008 0x2010 0x2018 0x2020

0x30F0 0x2018 0x2000 NULL

start

10

0x2008

insert: 6

6newItem

0x30F0

0x2020

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

218

AdvantagesAdvantages

• 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

struct NodeRec{ float value; struct NodeRec* nextPtr;};

typedef struct NodeRec Node;

Node:

nextPtr:

value:

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

220

#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

Make NodeMake 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

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;}

#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; } }}

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

224

0x30F0 0x2124 6firstNodePtr: lastNodePtr: item:

0x30F0

0x2124

0x2A40

1

0x2A40nextPtr:

value:

6

NULLnextPtr:

value:

3

0x2124nextPtr:

value:

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

225

Linked StructureLinked Structure

10x30F0

6

3 0x2124

0x2124

0x2A40

NULL

0x2A40 0x30F0firstNodePtr:

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

226

Linked StructureLinked Structure

10x30F0

3 0x21240x2A40

0x2A40 0x30F0firstNodePtr:

60x2124 NULL

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

227

Linked StructureLinked Structure

1

3

firstNodePtr:

6

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

228

Linked StructureLinked Structure

firstNodePtr:

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

229

RevisionRevision

• Node

• How to make a new Node

• Linked Structure

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

230

OverviewOverview

• Operations for Lists.

• Implementation of Linked Lists.

• Double Linked Lists.

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

231

List OperationsList 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

ComparsionComparsion

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

Linked ListLinked List

Head

0 1 2 3

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

234

#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

void initializeList(List* listPtr){ listPtr->headPtr = NULL; listPtr->count = 0;}

Initialize ListInitialize List

count

headPtr

0

NULL

listPtr addr of list

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

236

Set PositionSet 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

Set PositionSet Position

Head

0 21

2 position

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

238

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

Set PositionSet Position

Head

2 position

0x4000

0 i

NodePtr

0x30a80x20300x4000

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

240

Set PositionSet Position

Head

2 position

0x4000

0 i

NodePtr

0x30a80x20300x4000

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

241

Set PositionSet Position

Head

2 position

0x2030

1 i

NodePtr

0x30a80x20300x4000

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

242

Set PositionSet Position

Head

2 position

0x30a8

2 i

NodePtr

0x30a80x20300x4000

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

243

InsertInsert

Head

0 21

If we insert it at position 0.

Head

10 2

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

244

InsertInsert

Head

0 21

If we insert it at position 0.

0 21 3

Head

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

245

Instead, suppose we insert it at position 1.

Head

0 21

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

246

Head

Instead, suppose we insert it at position 1.

0 32

1

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

247

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

Inserting – New ListInserting – New List

Head

0 position

0x30a8

NULL

newNodePtr

0x30a8

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

249

Inserting – New ListInserting – New List

Head

0 position

0x30a8 newNodePtr

0x30a8

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

250

Inserting – Start of ListInserting – Start of List

HeadHead0x30a80x2008

0x2000

0position

0x2000newNodePtr

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

251

Inserting – Start of ListInserting – Start of List

HeadHead0x30a80x2008

0x2000

0position

0x2000newNodePtr

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

252

Inserting – Start of ListInserting – Start of List

HeadHead0x30a80x2008

0x2000

0position

0x2000newNodePtr

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

253

Inserting – Inside the ListInserting – Inside the List

0x2000

1position

0x2000newNodePtr

Head

0x30500x3080

NodePtr 0x3080

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

254

Inserting – Inside the ListInserting – Inside the List

0x2000

1position

0x2000newNodePtr

Head

0x30500x3080

NodePtr 0x3080

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

255

Inserting – Inside the ListInserting – Inside the List

0x2000

1position

0x2000newNodePtr

Head

0x30500x3080

NodePtr 0x3080

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

256

DeleteDelete

2

Head

310

If we delete the Node at position 0.

Head

210

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

257

Head

If we delete the Node at position 2.

2 310

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

258

Head

If we delete the Node at position 2.

2 210

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

259

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); } else { fprintf(stderr, “List is empty or invalid position.\n”); exit(1); }}

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

260

Deleting – 1Deleting – 1stst Node Node

Head

0 position

0x4000 NodePtr

0x30a80x20300x4000

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

261

Head0 position

0x4000 NodePtr

0x30a80x20300x4000

Deleting – 1Deleting – 1stst Node Node

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

262

Head0 position

0x4000 NodePtr

0x30a80x2030

Deleting – 1Deleting – 1stst Node Node

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

263

Deleting – Middle NodeDeleting – Middle Node

Head

1 position

0x2030 OldNodePtr

0x30a80x20300x4000

0x2030 NodePtr

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

264

Head

0x30a80x20300x4000

Deleting – Middle NodeDeleting – Middle Node

1 position

0x2030 OldNodePtr

0x2030 NodePtr

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

265

Head

0x30a80x4000

Deleting – Middle NodeDeleting – Middle Node

1 position

0x2030 OldNodePtr

0x2030 NodePtr

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

266

Double Linked List OperationsDouble 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 directionsin both directions.

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

267

Double Linked ListDouble Linked List

Current

0 1 2 3 4

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

268

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

Insert at endInsert at end

currentPtrnewPtr

0x4000 0x3080 0x2030 0x2000

0x4000 0x3080

0x3080 0x2030 NULL

NULLNULL

NULL

0x2000prevPtr

0x2030

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

270

Insert at endInsert at end

newPtr

0x4000 0x3080 0x2030 0x2000

0x4000 0x3080

0x3080 0x2030 0x2000

NULLNULL

NULL

0x2000prevPtr

0x2030

currentPtr

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

271

Insert at endInsert at end

newPtr

0x4000 0x3080 0x2030 0x2000

0x4000 0x3080

0x3080 0x2030 0x2000

NULLNULL

0x2030

0x2000prevPtr

0x2030

currentPtr

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

272

Insert inside the listInsert inside the list

newPtr

0x4000 0x3080 0x2030

0x2000

0x4000 0x3080

0x3080 0x2030NULL

NULL

NULL

NULL

0x2000prevPtr

0x3080

currentPtr

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

273

Insert inside the listInsert inside the list

newPtr

0x4000 0x3080 0x2030

0x2000

0x4000 0x3080

0x3080 0x2030NULL

NULL

2030

NULL

0x2000prevPtr

0x3080

currentPtr

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

274

Insert inside the listInsert inside the list

newPtr

0x4000 0x3080 0x2030

0x2000

0x4000 0x3080

0x3080 0x2030NULL

NULL

2030

3080

0x2000prevPtr

0x3080

currentPtr

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

275

Insert inside the listInsert inside the list

newPtr

0x4000 0x3080 0x2030

0x2000

0x4000 0x2000

0x3080 0x2030NULL

NULL

2030

3080

0x2000prevPtr

0x3080

currentPtr

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

276

Insert inside the listInsert inside the list

newPtr

0x4000 0x3080 0x2030

0x2000

0x4000 0x2000

0x3080 0x2000NULL

NULL

2030

3080

0x2000prevPtr

0x3080

currentPtr

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

277

Delete from endDelete from end

oldPtr

0x4000 0x3080 0x2030

0x4000 0x3080

0x3080 0x2030 NULL

NULL

0x2030currentPtr

prevPtr 0x3080

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

278

Delete from endDelete from end

0x4000 0x3080 0x2030

0x4000 0x3080

0x3080 NULL NULL

NULL

oldPtr 0x2030currentPtr

prevPtr 0x3080

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

279

Delete from endDelete from end

0x4000 0x3080

0x4000

0x3080 NULL

NULL

oldPtr 0x2030currentPtr

prevPtr 0x3080

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

280

Delete from inside listDelete from inside list

0x4000 0x3080 0x2030

0x4000 0x3080

0x3080 0x2030 NULL

NULL

oldPtr 0x3080currentPtr

prevPtr 0x4000

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

281

Delete from inside listDelete from inside list

0x4000 0x3080 0x2030

0x4000 0x3080

0x2030 0x2030 NULL

NULL

oldPtr 0x3080currentPtr

prevPtr 0x4000

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

282

Delete from inside listDelete from inside list

0x4000 0x3080 0x2030

0x4000 0x4000

0x2030 0x2030 NULL

NULL

oldPtr 0x3080currentPtr

prevPtr 0x4000

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

283

Delete from inside listDelete from inside list

Head

0x4000 0x2030

0x4000

0x2030 NULL

NULL

oldPtr 0x3080currentPtr

prevPtr 0x4000

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

284

RevisionRevision

• Linked List.

• Benefits of different implementations.

• Double Linked List.

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

285

OverviewOverview

• Selection Sort

• Insertion Sort

• Linear Search.

• Binary Search.

• Growth Rates.

• Implementation.

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

286

Selection SortSelection 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

Selection SortSelection Sort

01 2 3 45 6

01 2 345 6

01 23 4 5 6

01 2 3 4 5 6

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

288

Insertion SortInsertion 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

Insertion SortInsertion Sort01 2 3 45 6

01 2 3 45 6

0 1 2 3 45 6

0 1 2 3 45 6

0 1 2 3 45 6

0 1 2 3 45 6

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

290

Linear SearchLinear Search

-7 9 -5 2 8 3 -4

0 1 2 3 4 5 6

current

• Target is -5

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

291

Linear SearchLinear Search

-7 9 -5 2 8 3 -4

0 1 2 3 4 5 6

current

• Target is -5

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

292

Linear SearchLinear Search

-7 9 -5 2 8 3 -4

0 1 2 3 4 5 6

• Target is -5

current

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

293

Linear SearchLinear Search

-7 9 -5 2 8 3 -4

0 1 2 3 4 5 6

current

• Numbers can be in any order.

• Works for Linked Lists.

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

294

Binary SearchBinary Search

mid

target

Lower Part

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

295

Binary SearchBinary Search

mid

target

Upper Part

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

296

Binary SearchBinary Search

mid

• Need– List to be sorted.– To be able to do random accesses.

target

Upper Part

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

297

Binary SearchBinary Search

-1 2 3 5 8 10 15

0 1 2 3 4 5 6

mid highlow

target

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

298

Binary SearchBinary Search

-1 2 3 5 8 10 15

0 1 2 3 4 5 6

mid highlow

target

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

299

Binary SearchBinary Search

-1 2 3 5 8 10 15

0 1 2 3 4 5 6

high

mid

low

target

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

300

Other Uses of Binary SearchOther 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 / ComplexityGrowth 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)

Recall:

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

302

Selection SortSelection 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 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; }}

Find where the Maximum is.Find where the Maximum is.

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

304

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

Insertion SortInsertion 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

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

Linear SearchLinear Search

-7 9 -5 2 8 3 -4

0 1 2 3 4 5 6

current

• Numbers can be in any order.

• Works for Linked Lists.

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

308

int linearSearch(float array[], int size, int target){ int i;

for (i = 0; i < size; i++) { if (array[i] == target) { return i; } } return -1;}

Linear SearchLinear Search

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

309

Binary SearchBinary 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

Case 1: target < list[mid]

lower mid upper

target

New upper

list:

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

311

Case 2: list[mid] < target

lower mid upper

target

New lower

list:

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

312

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 wherethe target could be foundhalves in size each time

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

313

ComparisonComparisonArray Linked List

Selection Sort

Insertion Sort

Linear Search

Binary Search

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

314

RevisionRevision• Selection Sort• Insertion Sort• Linear Search• Binary Search

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

315

OverviewOverview

• Unary Recursion

• Binary Recursion

• Examples

• Features

• Stacks

• Disadvantages

• Advantages

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

316

What is Recursion - RecallWhat 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

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

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

Unary RecursionUnary Recursion

• Functions calls itself once (at most)• Usual format:

function RecursiveFunction ( <parameter(s)> ){

if ( base case ) thenreturn base value

elsereturn RecursiveFunction ( <expression> )

}

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

320

Unary RecursionUnary Recursion

/* Computes the factorial */

int factorial ( int n ){ if ( n <= 1 ) { return 1; } else { return n*factorial(n-1); }}

function Factorial ( n ){

if ( n is less than or equal to 1)

then

return 1

else

return n Factorial ( n - 1 )}

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

321

Binary RecursionBinary 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

Binary RecursionBinary Recursion

/* Compute the n-th Fibonacci number */long fib ( long n ){ if ( n <= 1 ) return n ; else return fib( n - 2 ) + fib( n - 1 );}

function Fibonacci ( n ){ if ( n is less than or equal to 1 ) then return n else return Fibonacci ( n - 2 ) + Fibonacci ( n - 1 )}

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

323

Copy ListCopy ListHeadPtr

struct LinkedListRec{ int count; Node* headPtr;};

typedef struct LinkedListRec List;

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

324

#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

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 NodesCopy NodesOldNodePtr

NewNodePtr

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

327

Copy NodesCopy NodesOldNodePtr

NewNodePtr

NewNodePtr->next is set to the Result of calling copy nodes onThe remainder of the list

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

328

Copy NodesCopy NodesOldNodePtr

NewNodePtrNewNodePtr

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

329

Copy NodesCopy NodesOldNodePtr

NewNodePtrNewNodePtr NewNodePtr

NULL

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

330

Copy NodesCopy Nodes

NewNodePtr NewNodePtr

OldNodePtr

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

331

Copy NodesCopy Nodes

NewNodePtr

OldNodePtr

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

332

Recursion ProcessRecursion 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

Types of RecursionTypes of Recursion

• Direct.

• Indirect.

• Linear.

• n-ary (Unary, Binary, Ternary, …)

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

334

StacksStacks

• 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

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

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

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

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

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

x = 2, n = 1

tmp = 1

tmp = 1*1*2 = 2

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

340

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

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

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} }}

Stackn = 5, x = 2

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

343

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} }}

5

Stackn = 5, x = 2

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

344

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} }}

5

2

Stackn = 2, x = 2

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

345

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} }}

5

2

1

Stackn = 1, x = 2

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

346

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} }}

5

2

1

Stackn = 0, x = 2

tmp = 1

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

347

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} }}

5

2

Stackn = 0, x = 2

tmp = 2

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

348

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} }}

5

Stackn = 0, x = 2

tmp = 4

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

349

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} }}

Stackn = 0, x = 2

tmp = 32

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

350

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

DisadvantagesDisadvantages

• May run slower.– Compilers– Inefficient Code

• May use more space.

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

352

AdvantagesAdvantages

• 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 RecursiveFree List – Non RecursiveHead

/* Delete the entire list */void FreeList(Node* head){ Node* next;

while (head != NULL) { next=head->next; free(head); head=next; }}

0x2000 0x4c680x258a

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

354

Free List – Non RecursiveFree List – Non Recursivehead

/* Delete the entire list */void FreeList(Node* head){ Node* next;

while (head != NULL) { next=head->next; free(head); head=next; }}

next

0x2000 0x258a 0x4c68

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

355

Free List – Non RecursiveFree List – Non Recursivehead

/* Delete the entire list */void FreeList(Node* head){ Node* next;

while (head != NULL) { next=head->next; free(head); head=next; }}

next

0x258a 0x4c68

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

356

Free List – Non RecursiveFree List – Non Recursivehead

/* Delete the entire list */void FreeList(Node* head){ Node* next;

while (head != NULL) { next=head->next; free(head); head=next; }}

next

NULL

0x4c68

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

357

Free List – Non RecursiveFree List – Non Recursivehead

/* Delete the entire list */void FreeList(Node* head){ Node* next;

while (head != NULL) { next=head->next; free(head); head=next; }}

next

NULL

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

Free ListFree ListHead

/* 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

Free ListFree Listlist

/* Delete the entire list */void FreeList(Node* list){ if (list==NULL) return; FreeList(list->next); free(list);}

0x258a 0x4c680x2000

Stack in memory

0x2000

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

360

Free ListFree Listlist

/* Delete the entire list */void FreeList(Node* list){ if (list==NULL) return; FreeList(list->next); free(list);}

0x258a 0x4c680x2000

0x2000

0x258a

Stack in memory

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

361

Free ListFree Listlist

/* Delete the entire list */void FreeList(Node* list){ if (list==NULL) return; FreeList(list->next); free(list);}

0x258a 0x4c680x2000

0x2000

0x258a

0x4c68

Stack in memory

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

362

Free ListFree Listlist

/* Delete the entire list */void FreeList(Node* list){ if (list==NULL) return; FreeList(list->next); free(list);}

0x258a 0x4c680x2000

NULL

0x2000

0x258a

0x4c68

Stack in memory

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

363

Free ListFree Listlist

/* Delete the entire list */void FreeList(Node* list){ if (list==NULL) return; FreeList(list->next); free(list);}

0x258a 0x4c680x2000

0x2000

0x258a

0x4c68

Stack in memory

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

364

Free ListFree Listlist

/* Delete the entire list */void FreeList(Node* list){ if (list==NULL) return; FreeList(list->next); free(list);}

0x258a0x2000

0x2000

0x258a

Stack in memory

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

365

Free ListFree Listlist

/* Delete the entire list */void FreeList(Node* list){ if (list==NULL) return; FreeList(list->next); free(list);}

0x2000

0x2000

Stack in memory

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

366

Free ListFree ListHead

/* Delete the entire list */void FreeList(Node* list){ if (list==NULL) return; FreeList(list->next); free(list);}

0x2000

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

RevisionRevision

• Recursion

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

368

OverviewOverview

• Trees.

• Terminology.

• Traversal of Binary Trees.

• Expression Trees.

• Binary Search Trees.

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

369

TreesTrees

• 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

Parts of a TreeParts of a Tree

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

371

Parts of a TreeParts of a Tree

nodes

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

372

Parts of a TreeParts of a Treeparent node

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

373

Parts of a TreeParts of a Treechild

nodesparent node

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

374

Parts of a TreeParts of a Treechild

nodesparent node

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

375

Parts of a TreeParts of a Tree

root node

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

376

Parts of a TreeParts of a Treeleaf

nodes

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

377

Parts of a TreeParts of a Tree

sub-tree

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

378

Parts of a TreeParts of a Tree

sub-tree

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

379

Parts of a TreeParts of a Tree

sub-tree

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

380

Parts of a TreeParts of a Tree

sub-tree

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

381

Binary TreeBinary Tree• Each node can have at most 2 children

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

382

TraversalTraversal

• 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

Preorder TraversalPreorder Traversal

• Visit the node.

• Traverse the left subtree.

• Traverse the right subtree.

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

384

Example: PreorderExample: Preorder

31

43

64

20 40 56

28 33 47 59

89

43 31 20 28 40 33 64 56 47 59 89

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

385

Inorder TraversalInorder Traversal

• Traverse the left subtree.

• Visit the node.

• Traverse the right subtree.

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

386

Example: InorderExample: Inorder

31

43

64

20 40 56

28 33 47 59

89

20 3128 4033 43 5647 59 64 89

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

387

Postorder TraversalPostorder Traversal

• Traverse the left subtree.

• Traverse the right subtree.

• Visit the node.

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

388

Example: PostorderExample: Postorder

31

43

64

20 40 56

28 33 47 59

89

2028 40 3133 5647 59 6489 43

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

389

Expression TreeExpression 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 TreeExample: Expression Tree

/

+

/

1 3 *

6 7

4

1/3 + 6*7 / 4

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

391

NotationNotation

• Preorder– Prefix Notation

• Inorder– Infix Notation

• Postorder– Postfix Notation

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

392

Example: InfixExample: Infix

/

+

/

1 3 *

6 7

4

1 / 3 + *6 7 / 4

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

393

7

//

/

1

+

/

3 *

6

4

Example: PostfixExample: Postfix

Recall: Reverse Polish Notation

1

1 3

3

6

6

7

7

*

*

4

4

/

/

+

+

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

394

/

+

/

1 3 *

6 7

4

Example: PrefixExample: Prefix

+ / 1 3 / * 6 7 4

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

395

Binary Search Tree 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

Example 1:

31

43

64

20 40 56

28 33 47 59

89

key is an integer

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

397

Example 1:

31

43

64

20 40 56

28 33 47 59

89

key is an integer

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

398

InsertInsert

• 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

InsertInsert

31

43

64

20 40 56

28 33 47 59

89

Example:57

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

400

InsertInsert

31

43

64

20 40 56

28 33 47 59

89

Example:57

57

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

401

Search: ChecklistSearch: 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

SearchSearch

31

43

64

20 40 56

28 33 47 59

89

Example: 59

57 found

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

403

SearchSearch

31

43

64

20 40 56

28 33 47 59

89

Example: 61

57 failed

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

404

RevisionRevision

• 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

OverviewOverview

• Binary Search Trees.

• Hash Tables.

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

406

Recall - Binary Search Tree 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

Example 1:

31

43

64

20 40 56

28 33 47 59

89

key is an integer

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

408

Fred

Dan Mary

Alan Eve

Bill Eric

Kate

Greg Len

Sue

Example 2: key is a string

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

409

Binary Tree NodeBinary Tree Node

entry

link to right child nodelink to left

child node

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

410

struct TreeNodeRec{ int key;

struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr;};

typedef struct TreeNodeRec TreeNode;

Binary Search Tree Node Binary Search Tree Node

Example 1:

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

411

Example 2:

Binary Search Tree Node Binary Search Tree Node

#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

Recall:

maximumstring 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

struct TreeNodeRec{ char* key;

struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr;};

typedef struct TreeNodeRec TreeNode;

Example 3:

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

414

Recall:

struct TreeNodeRec{ char* key;

struct TreeNodeRec* left; struct TreeNodeRec* right;};

typedef struct TreeNodeRec TreeNode;

•Allows strings of arbitrary length.

•Memory needs to be allocated dynamically before use.

•Use strcmp to compare strings.

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

415

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

416

struct BookRec{ char* author; char* title; char* publisher; /* etc.: other book information. */};

typedef struct BookRec Book;

Book Record

key

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

417

struct TreeNodeRec{ Book info; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr;};

typedef struct TreeNodeRec TreeNode;

Example 4: Binary Search Tree Node

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

418

struct TreeNodeRec{ float key;

struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr;};

typedef struct TreeNodeRec TreeNode;

Tree NodeTree Node

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

419

#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

MakeNodeMakeNode

• 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

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

0x2000

newNodePtr NULL

0x2000newNodePtr

0x20000x2000newNodePtr 3.3

NULL NULL

value 3.3

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

423

InorderInorder

• Inorder traversal of a Binary Search Tree always gives the sorted order of the keys.

void printInorder(TreeNode* nodePtr){

}

initially, pointerto root node

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

424

InorderInorder

• 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

InorderInorder

• 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

InorderInorder

• 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

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

428

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

429

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

430

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

431

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

432

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

433

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

434

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

435

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

436

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

437

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

438

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

439

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

440

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

441

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

442

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

443

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

444

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

445

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

446

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

447

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

448

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

449

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

450

InorderInorder

void printInorder(TreeNode* nodePtr){ if (nodePtr != NULL){ printInorder(nodePtr->leftPtr); printf(“ %f”, nodePtr->key); printInorder(nodePtr->rightPtr); }}

nodePtr

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

451

SearchSearch

31

43

64

20 40 56

28 33 47 59

89

Example: 59

57 found

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

452

SearchSearch

31

43

64

20 40 56

28 33 47 59

89

Example: 61

57 failed

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

453

Search: ChecklistSearch: 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

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

/* …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… */

Function Call to SearchFunction Call to Search

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

456

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.7nodePtr

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

457

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.7nodePtr

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

458

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.7nodePtr

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

459

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.7nodePtr

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

460

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.5nodePtr

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

461

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.5nodePtr

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

462

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.5nodePtr

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

463

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.5nodePtr

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

464

SearchSearch

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Find 0.5nodePtr

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

465

InsertInsert

31

43

64

20 40 56

28 33 47 59

89

Example:57

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

466

InsertInsert

31

43

64

20 40 56

28 33 47 59

89

Example:57

57

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

467

InsertInsert

• 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

Insert: RecursiveInsert: 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

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

/* …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… */

Function Call to InsertFunction Call to Insert

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

471

InsertInsert

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Insert 0.9nodePtr

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

472

InsertInsert

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Insert 0.9nodePtr

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

473

InsertInsert

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Insert 0.9nodePtr

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

474

InsertInsert

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Insert 0.9nodePtr

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

475

InsertInsert

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;}

1.0

1.81.1

2.71.4

1.9

0.4 0.7

0.80.3

0.6

Insert 0.9nodePtr

0.9

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

476

SortingSorting

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

Sorting: AnalysisSorting: Analysis

• Insert (i+1)th item: ~ log2(i) comparisons

~ log2 n

• Average Case: O(n log(n))

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

478

SortSort

Sort the following list into a binary search tree

0.51.0 0.7 2.12.5 3.6

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

479

SortSort

0.51.0 0.7 2.12.5 3.6

1.0

Sort the following list into a binary search tree

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

480

SortSort

0.51.0 0.7 2.12.5 3.6

1.0

2.5

Sort the following list into a binary search tree

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

481

SortSort

0.51.0 0.7 2.12.5 3.6

1.0

2.50.5

Sort the following list into a binary search tree

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

482

SortSort

0.51.0 0.7 2.12.5 3.6

1.0

2.50.5

0.7

Sort the following list into a binary search tree

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

483

SortSort

1.0

2.50.5

0.7 3.6

Sort the following list into a binary search tree

0.51.0 0.7 2.12.5 3.6

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

484

SortSort

0.51.0 0.7 2.12.5 3.6

1.0

2.50.5

0.7 3.62.1

Sort the following list into a binary search tree

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

485

Sorting: AnalysisSorting: Analysis

• Insert (i+1)th item: ~ i comparisons

Example:

Insert: 1, 3, 7, 9, 11, 15

• Worst Case: O(n2)

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

486

RevisionRevision

• 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

OverviewOverview

• Divide and Conquer

• Merge Sort

• Quick Sort

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

488

SearchSearch

Divide and ConquerDivide and Conquer

SearchSearch

SearchSearch

Recall: Binary Search

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

489

SortSort

Divide and ConquerDivide and Conquer

SortSort SortSort

SortSort SortSort SortSort SortSort

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

490

Divide and ConquerDivide and Conquer

CombineCombine

CombineCombine CombineCombine

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

491

Divide and ConquerDivide 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

Divide and ConquerDivide 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

Divide and ConquerDivide 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

Divide and ConquerDivide 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

Divide and ConquerDivide 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

Merge SortMerge Sort

Sort Sort

Merge

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

497

array:array:

sizesize

Merge SortMerge Sort

tmp:tmp:

tmpArrayPtr:tmpArrayPtr:

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

498

array[mid]array[mid]array[0]array[0]

midmid (size - mid)(size - mid)

firstPart : array

secondPart : array + mid

Merge SortMerge Sort

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

499

Merge SortMerge Sort

mergeListmergeList

tmp:tmp:

array:array:

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

500

Merge SortMerge Sort

tmp:tmp:

array:array:

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

501

Merge SortMerge Sort

array:array:

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

502

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

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

mergeArraysmergeArrays

3 5 15 28 30 6 10 14 22 43 50a:a: b:b:

aSize: 5aSize: 5 bSize: 6bSize: 6

Example:

tmp:tmp:

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

505

mergeArraysmergeArrays

5 15 28 30 10 14 22 43 50a:a: b:b:

Example:

tmp:tmp:

i=0i=0

k=0k=0

j=0j=0

3 6

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

506

mergeArraysmergeArrays

5 15 28 30 10 14 22 43 50a:a: b:b:

Example:

tmp:tmp:

i=0i=0

k=0k=0

3

j=0j=0

3 6

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

507

mergeArraysmergeArrays

3 15 28 30 10 14 22 43 50a:a: b:b:

Example:

tmp:tmp:

i=1i=1 j=0j=0

k=1k=1

3 5

5 6

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

508

mergeArraysmergeArrays

3 5 28 30 10 14 22 43 50a:a: b:b:

Example:

3 5tmp:tmp:

i=2i=2 j=0j=0

k=2k=2

6

15 6

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

509

mergeArraysmergeArrays

3 5 28 30 6 14 22 43 50a:a: b:b:

Example:

3 5 6tmp:tmp:

i=2i=2 j=1j=1

k=3k=3

15 10

10

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

510

10

mergeArraysmergeArrays

3 5 28 30 6 22 43 50a:a: b:b:

Example:

3 5 6tmp:tmp:

i=2i=2 j=2j=2

k=4k=4

15 10 14

14

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

511

1410

mergeArraysmergeArrays

3 5 28 30 6 14 43 50a:a: b:b:

Example:

3 5 6tmp:tmp:

i=2i=2 j=3j=3

k=5k=5

15 10 22

15

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

512

1410

mergeArraysmergeArrays

3 5 30 6 14 43 50a:a: b:b:

Example:

3 5 6tmp:tmp:

i=3i=3 j=3j=3

k=6k=6

15 10 22

2215

28

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

513

1410

mergeArraysmergeArrays

3 5 30 6 14 50a:a: b:b:

Example:

3 5 6tmp:tmp:

i=3i=3 j=4j=4

k=7k=7

15 10 22

2815

28 43

22

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

514

1410

mergeArraysmergeArrays

3 5 6 14 50a:a: b:b:

Example:

3 5 6tmp:tmp:

i=4i=4 j=4j=4

k=8k=8

15 10 22

3015

28 43

22

30

28

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

515

1410

mergeArraysmergeArrays

3 5 6 14 50a:a: b:b:

Example:

3 5 6 30tmp:tmp:

i=5i=5 j=4j=4

k=9k=9

15 10 22

15

28 43

22

30

28 43 50

Done.

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

516

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]) { tmp[k] = a[i]; i++; } else { tmp[k] = b[j]; j++; } }}

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

517

Merge Sort and Linked ListsMerge Sort and Linked Lists

Sort Sort

Merge

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

518

Merge Sort AnalysisMerge 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

Quick SortQuick Sort

x < p p p <= x

Partition

Sort Sort

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

520

Quick SortQuick SortExample:

5 89 35 10 24 15 37 13 20 17 70array:array:

size: 11size: 11

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

521

Quick SortQuick SortExample:

5 89 35 14 24 15 37 13 20 7 70array:array:

“pivot element”

15

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

522

partition:partition:

Quick SortQuick SortExample:

5 89 35 14 24 37 13 20 7 70array:array: 15

5 89 35 14 24 37 13 20 7 7015

7 14 5 13 15 35 37 89 20 24 70

index: 4index: 4

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

523

Quick SortQuick SortExample:

array:array: 7 14 5 13 15 35 37 89 20 24 70

index: 4index: 4

indexindex (size - index - 1)(size - index - 1)

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

524

Quick SortQuick SortExample:

indexindex (size - index - 1)(size - index - 1)

array[0]array[0] array[index + 1]array[index + 1]

firstPart : array

secondPart : array + index + 1

14 5 13 15 37 89 20 24 707 35

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

525

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); }}

Quick SortQuick Sort

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

526

Partition: ChecklistPartition: Checklist

p

p

00

p x < p p <= x

p x < p p <= x

px < p p <= x

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

527

PartitionPartitionExample:

5 89 35 14 24 15 37 13 20 7 70array:array: 15

mid: 4mid: 4

15 89 35 14 24 5 37 13 20 7 70

5

00

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

528

PartitionPartitionExample:

array:array:

k=1k=1

15 89 35 14 24 5 37 13 20 7 70

00

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

529

PartitionPartitionExample:

array:array:

k:1k:1

15 89 35 14 24 5 37 13 20 7 70

index:0index:0

89

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

530

PartitionPartitionExample:

array:array:

k:2k:2

15 89 35 14 24 5 37 13 20 7 70

index:0index:0

35

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

531

PartitionPartitionExample:

array:array:

k:3k:3

15 89 35 14 24 5 37 13 20 7 70

index:0index:0

14

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

532

PartitionPartitionExample:

array:array:

k:3k:3

15 89 35 14 24 5 37 13 20 7 70

index:1index:1

8914

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

533

PartitionPartitionExample:

array:array:

k:4k:4

15 14 35 89 24 5 37 13 20 7 70

index:1index:1

24

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

534

PartitionPartitionExample:

array:array:

k:5k:5

15 14 35 89 24 5 37 13 20 7 70

index:1index:1

5

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

535

PartitionPartitionExample:

array:array:

k:5k:5

15 14 35 89 24 5 37 13 20 7 70

index:2index:2

5 35

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

536

PartitionPartitionExample:

array:array:

k:6k:6

15 14 89 24 37 13 20 7 70

index:2index:2

5 35 37

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

537

PartitionPartitionExample:

array:array:

k:7k:7

15 14 89 24 37 13 20 7 70

index:2index:2

5 35

etc...

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

538

PartitionPartitionExample:

array:array:

k:11k:11

15 14 13 7 37 89 20 24 70

index:4index:4

5 35

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

539

PartitionPartitionExample:

array:array: 15 14 13 7 37 89 20 24 70

index:4index:4

5 35

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

540

PartitionPartitionExample:

array:array: 15 14 13 7 37 89 20 24 70

index:4index:4

5 35157

x < 15x < 15 15 <= x15 <= x

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

541

Example:

array:array: 15 14 13 7 37 89 20 24 705 35157

x < 15x < 15 15 <= x15 <= x

pivot now incorrect position

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

542

Example:

14 13 37 89 20 24 705 357

14 1357 37 89 20 24 7035

15

Sort Sort

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

543

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

Quick Sort AnalysisQuick 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

RevisionRevision

• Merge Sort

• Quick Sort

top related