Download presentation
Presentation is loading. Please wait.
Published byMalcolm O’Neal’ Modified over 9 years ago
1
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur1 Structures, ADT Lecture 25 14/3/2002
2
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur2 Announcements Lab Test 2 on the week of 18 th – 22 nd March Syllabus for lab test : arrays, structures, data types, …..
3
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur3 The List ADT A list : of size N. Special list of size 0 : an empty list Operations: makenull () : returns an empty list makelist (elem) : makes a list containing a single element printlist (list) search(elem, list) : searches whether a key is in the list insert (elem, list) delete (elem, list) findKth (list)
4
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur4 Array Implementation of List typedef int ETYPE; typedef struct { ETYPE elements[MAXS]; int size; } LIST; LIST makenull () ; LIST makeList (ETYPE) ; void printList (LIST) ; int IsEmpty (LIST) ; int search (ETYPE, LIST) ; void delete (ETYPE, LIST * ); void insert (ETYPE, LIST * )
5
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur5 Complex Number ADT typedef struct { float real; float imag; } COMPLEX; COMPLEX makecomplex (float, float) ; COMPLEX addc (COMPLEX, COMPLEX); COMPLEX subc (COMPLEX, COMPLEX); COMPLEX multc (COMPLEX, COMPLEX); COMPLEX divc (COMPLEX, COMPLEX);
6
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur6 SET ADT Interface functions (1): SET makenullset () ; int member (ETYPE, SET) ; SET adjoin (ETYPE, SET); SET union (SET, SET) ; SET intersection (SET, SET); Void printset (SET) ; Interface functions (2): SET makenullset () ; int member (ETYPE, SET) ; void adjoin(ETYPE, SET *); void union (SET, SET, SET*); void intersection (SET, SET, SET*); Void printset (SET) ;
7
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur7 Concrete implementation of SET ADT typedef struct { ETYPE elem[MAX]; int size; } SET; Implementation 1 : sorted array adjoin : Sorted insert member : Binary search delete : ? union : merge 2 sorted arrays intersection : ?
8
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur8 Concrete implementation of SET ADT typedef struct { ETYPE elem[MAX]; int size; } SET; Implementation 2 : unsorted array keep the elements in the array unsorted. adjoin : Insert at the end member : Search till found or till the end delete : Go through the array sequentially until element is found, or reach the end. Then left shift the array. union, intersection ?
9
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur9 Arrays of Structures A struct represents a single record. Typically structs are used to deal with collections of such records Examples : student records, employee records, book records,... In each case we will hav multiple instances of the struct type. Arrays of structs are the natural way to do this.
10
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur10 Arrays of structs : declaration & use Each declaration below declares an array, where each array element is a structure: point corner_points[10] ; StudentRecord btech01[MAXS] ; We access a field of a struct in an array by specifying the array element and then the field : btech01[i].name corner_points[4].x
11
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur11 Naming in struct Arrays point pentagon[5]; x y x y x y x y x y pentagon : an array of points pentagon[1] : a point structure pentagon[4].x : a double
12
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur12 Using Arrays of structs StudentRecord class[MAXS];... for (i=0; i<nstudents; i++){ scanf (“%d%d”, &class[i].midterm, &class[i].final); class[i].grade = (double)(class[i].midterm+class[i].final)/50.0; }
13
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur13 struct Array elements as parameters void draw_line (point p1, point p2) {... }... point pentagon[5];... for (i=0;i<4;i++) draw_line (pentagon[i], pentagon[i+1]); draw_line (pentagon[4], pentagon[0]);
14
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur14 structs as Parameters A single struct is passed by value. all of its components are copied from the argument (actual parameter) to initialize the (formal) parameter. point set_midpt (point a, point b) {... } int main (void) { point p1, p2, m;... m = set_midpt(p1, p2); }
15
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur15 Passing Arrays of structs An array of structs is an array. When any array is an argument (actual parameter), it is passed by reference, not copied [As for any array] The parameter is an alias of the actual array argument. int avg (StudentRec class[MAX]) {... } int main (void) { StudentRec bt01[MAX]; int average;... average = avg_midpt(bt01) ; }
16
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur16 Dynamic Memory Allocation, Structure pointers Lecture 26 14.3.2002.
17
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur17 Basic Idea Many a time we face situations where data is dynamic in nature. Amount of data cannot be predicted beforehand. Number of data item keeps changing during program execution. Such situations can be handled more easily and effectively using dynamic memory management techniques.
18
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur18 C language requires the number of elements in an array to be specified at compile time. Often leads to wastage or memory space or program failure. Dynamic Memory Allocation Memory space required can be specified at the time of execution. C supports allocating and freeing memory dynamically using library routines.
19
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur19 Memory Allocation Process in C Local variables Free memory Global variables Instructions Permanent storage area Stack Heap
20
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur20 The program instructions and the global variables are stored in a region known as permanent storage area. The local variables are stored in another area called stack. The memory space between these two areas is available for dynamic allocation during execution of the program. This free region is called the heap. The size of the heap keeps changing
21
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur21 Memory Allocation Functions malloc: Allocates requested number of bytes and returns a pointer to the first byte of the allocated space. calloc: Allocates space for an array of elements, initializes them to zero and then returns a pointer to the memory. free : Frees previously allocated space. realloc: Modifies the size of previously allocated space.
22
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur22 Dynamic Memory Allocation used to dynamically create space for arrays, structures, etc. int main () { int *a ; int n;.... a = (int *) calloc (n, sizeof(int));.... } a = malloc (n*sizeof(int));
23
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur23 Space that has been dynamically allocated with either calloc() or malloc() does not get returned to the function upon function exit. The programmer must use free() explicitly to return the space. ptr = malloc (...) ; free (ptr) ;
24
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur24 void read_array (int *a, int n) ; int sum_array (int *a, int n) ; void wrt_array (int *a, int n) ; int main () { int *a, n; printf (“Input n: “) ; scanf (“%d”, &n) ; a = calloc (n, sizeof (int)) ; read_array (a, n) ; wrt_array (a, n) ; printf (“Sum = %d\n”, sum_array(a, n); }
25
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur25 void read_array (int *a, int n) { int i; for (i=0; i<n; i++) scanf (“%d”, &a[i]) ; } void sum_array (int *a, int n) { int i, sum=0; for (i=0; i<n; i++) sum += a[i] ; return sum; } void wrt_array (int *a, int n) { int i;........ }
26
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur26 Arrays of Pointers Array elements can be of any type array of structures array of pointers
27
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur27 int main (void) { char word[MAXWORD]; char * w[N]; /* an array of pointers */ int i, n; /* n: no of words to sort */ for (i=0; scanf(“%s”, word) == 1); ++i) { w[i] = calloc (strlen(word)+1, sizeof(char)); if (w[i] == NULL) exit(0); strcpy (w[i], word) ; } n = i; sortwords (w, n) ; wrt_words (w, n); return 0; }
28
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur28 w 0 1 2 3 17 Input : A is for apple or alphabet pie which all get a slice of come taste it and try A\0 is for apple try
29
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur29 void sort_words (char *w[], int n) { int i, j; for (i=0; i<n; ++i) for (j=i+1; j<n; ++j) if (strcmp(w[i], w[j]) > 0) swap (&w[i], &w[j]) ; } void swap (char **p, char **q) { char *tmp ; tmp = *p; *p = *q; *q = tmp; }
30
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur30 w w[i] for\0 apple Before swapping w[j]
31
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur31 w w[i] for\0 apple After swapping w[j]
32
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur32 Pointers to Structure
33
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur33 Pointers and Structures You may recall that the name of an array stands for the address of its zero-th element. Also true for the names of arrays of structure variables. Consider the declaration: struct stud { int roll; char dept_code[25]; float cgpa; } class[100], *ptr ;
34
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur34 The name class represents the address of the zero-th element of the structure array. ptr is a pointer to data objects of the type struct stud. The assignment ptr = class ; will assign the address of class[0] to ptr. When the pointer ptr is incremented by one (ptr++) : The value of ptr is actually increased by sizeof(stud). It is made to point to the next record.
35
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur35 Once ptr points to a structure variable, the members can be accessed as: ptr –> roll ; ptr –> dept_code ; ptr –> cgpa ; The symbol “–>” is called the arrow operator.
36
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur36 Warning When using structure pointers, we should take care of operator precedence. Member operator “.” has higher precedence than “*”. ptr –> roll and (*ptr).roll mean the same thing. *ptr.roll will lead to error. The operator “–>” enjoys the highest priority among operators. ++ptr –> roll will increment roll, not ptr. (++ptr) –> roll will do the intended thing.
37
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur37 Program to add two complex numbers using pointers typedef struct { float re; float im; } complex; main() { complex a, b, c; scanf (“%f %f”, &a.re, &a.im); scanf (“%f %f”, &b.re, &b.im); add (&a, &b, &c) ; printf (“\n %f %f”, c,re, c.im); }
38
14/3/02 Sudeshna Sarkar, CSE, IIT Kharagpur38 void add (complex * x, complex * y, complex * t) { t->re = x->re + y->re ; t->im = x->im + y->im ; }
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.