Presentation is loading. Please wait.

Presentation is loading. Please wait.

Dynamic Allocation Review Structure and list processing

Similar presentations


Presentation on theme: "Dynamic Allocation Review Structure and list processing"— Presentation transcript:

1 Dynamic Allocation Review Structure and list processing
Lectures 18 & 19 and Sudeshna Sarkar, CSE, IIT Kharagpur

2 Dynamic allocation: review
Variables in C are allocated in one of 3 spots: the run-time stack : variables declared local to functions are allocated during execution the global data section : Global variables are allocated here and are accessible by all parts of a program. the heap : Dynamically allocated data items malloc, calloc, realloc manage the heap region of the mmory. If the allocation is not successful a NULL value is returned. Sudeshna Sarkar, CSE, IIT Kharagpur

3 Sudeshna Sarkar, CSE, IIT Kharagpur
Bad Pointers When a pointer is first allocated, it does not have a pointee. The pointer is uninitialized or bad. A dereference operation on a bad pointer is a serious runtime error. Each pointer must be assigned a pointee before it can support dereference operations. int * numPtr; Every pointer starts out with a bad value. Correct code overwrites the bad value. Sudeshna Sarkar, CSE, IIT Kharagpur

4 Sudeshna Sarkar, CSE, IIT Kharagpur
Example pointer code. int * numPtr; int num = 42; numPtr = # num = malloc (sizeof (int)); *num = 73; Sudeshna Sarkar, CSE, IIT Kharagpur

5 Sudeshna Sarkar, CSE, IIT Kharagpur
int a=1, b=2, c=3; int *p, *q; a 1 xxx p b 2 xxx q c 3 Sudeshna Sarkar, CSE, IIT Kharagpur

6 Sudeshna Sarkar, CSE, IIT Kharagpur
p = &a ; q = &b ; a 1 p b 2 q c 3 Sudeshna Sarkar, CSE, IIT Kharagpur

7 Sudeshna Sarkar, CSE, IIT Kharagpur
c = *p ; p = q ; *p = 13 ; a 1 p b 13 q c 1 Sudeshna Sarkar, CSE, IIT Kharagpur

8 Sudeshna Sarkar, CSE, IIT Kharagpur
Bad pointer Example void BadPointer () { int *p; *p = 42; } int * Bad2 () { int num, *p; num = 42; p = # return p; p x x x X Sudeshna Sarkar, CSE, IIT Kharagpur

9 Sudeshna Sarkar, CSE, IIT Kharagpur
A function call malloc(size) allocates a block of mrmory in the heap and returns a pointer to the new block. size is the integer size of the block in bytes. Heap memory is not deallocated when the creating function exits. malloc generates a generic pointer to a generic data item (void *) or NULL if it cannot fulfill the request. Type cast the pointer returned by malloc to the type of variable we are assigning it to. free : takes as its parameter a pointer to an allocated region and de-allocates memory space. Sudeshna Sarkar, CSE, IIT Kharagpur

10 Dynamic memory allocation: review
typedef struct { int hiTemp; int loTemp; double precip; } WeatherData; main () { int numdays; WeatherData * days; scanf (“%d”, &numdays) ; days=(WeatherData *)malloc (sizeof(WeatherData)*numdays); if (days == NULL) printf (“Insufficient memory”); ... free (days) ; } Sudeshna Sarkar, CSE, IIT Kharagpur

11 Self-referential structures
Dynamic data structures : Structures with pointer members that refer to the same structure. Arrays and other simple variables are allocated at block entry. But dynamic data structures require storage management routine to explicitly obtain and release memory. Sudeshna Sarkar, CSE, IIT Kharagpur

12 Sudeshna Sarkar, CSE, IIT Kharagpur
Why linked lists ? A linked list is a dynamic data structure. It can grow or shrink in size during the execution of a program. It can be made just as long as required. It does not waste memory space. Linked lists provide flexibility in allowing the items to be rearranged efficiently. Insert an element. Delete an element. Sudeshna Sarkar, CSE, IIT Kharagpur

13 Self-referential structures
struct list { int data ; struct list * next ; } ; The pointer variable next is called a link. Each structure is linked to a succeeding structure by next. Sudeshna Sarkar, CSE, IIT Kharagpur

14 Pictorial representation
A structure of type struct list data next The pointer variable next contains either an address of the location in memory of the successor list element or the special value NULL defined as 0. NULL is used to denote the end of the list. Sudeshna Sarkar, CSE, IIT Kharagpur

15 Sudeshna Sarkar, CSE, IIT Kharagpur
struct list a, b, c; a.data = 1; b.data = 2; c.data = 3; a.next = b.next = c.next = NULL; a b c 1 NULL 2 NULL 3 NULL data next data next data next Sudeshna Sarkar, CSE, IIT Kharagpur

16 Chaining these together
a.next = &b; b.next = &c; a b c 1 2 3 NULL data next data next data next What are the values of : a.next->data a.next->next->data 2 3 Sudeshna Sarkar, CSE, IIT Kharagpur

17 Sudeshna Sarkar, CSE, IIT Kharagpur
Linear Linked Lists A head pointer addresses the first element of the list. Each element points at a successor element. The last element has a link value NULL. Sudeshna Sarkar, CSE, IIT Kharagpur

18 Sudeshna Sarkar, CSE, IIT Kharagpur
Header file : list.h #include <stdio.h> #include <stdlib.h> typedef char DATA; struct list { DATA d; struct list * next; }; typedef struct list ELEMENT; typedef ELEMENT * LINK; Sudeshna Sarkar, CSE, IIT Kharagpur

19 Sudeshna Sarkar, CSE, IIT Kharagpur
Storage allocation LINK head ; head = malloc (sizeof(ELEMENT)); head->d = ‘n’; head->next = NULL; creates a single element list. head n NULL Sudeshna Sarkar, CSE, IIT Kharagpur

20 Sudeshna Sarkar, CSE, IIT Kharagpur
Storage allocation head->next = malloc (sizeof(ELEMENT)); head->next->d = ‘e’; head->next->next = NULL; A second element is added. head n e NULL Sudeshna Sarkar, CSE, IIT Kharagpur

21 Sudeshna Sarkar, CSE, IIT Kharagpur
Storage allocation head->next=>next = malloc (sizeof(ELEMENT)); head->next->next->d = ‘e’; head->next->next-> = NULL; We have a 3 element list pointed to by head. The list ends when next has the sentinel value NULL. head n e w NULL Sudeshna Sarkar, CSE, IIT Kharagpur

22 Sudeshna Sarkar, CSE, IIT Kharagpur
List operations Create a list Count the elements Look up an element Concatenate two lists Insert an element Delete an element Sudeshna Sarkar, CSE, IIT Kharagpur

23 Produce a list from a string (recursive version)
#include “list.h” LINK StrToList (char s[]) { LINK head ; if (s[0] == ‘\0’) return NULL ; else { head = malloc (sizeof(ELEMENT)); head->d = s[0]; head->next = StrToList (s+1); return head; } Sudeshna Sarkar, CSE, IIT Kharagpur

24 list from a string (iterative version)
#include “list.h” LINK SToL (char s[]) { LINK head = NULL, tail; int i; if (s[0] != ‘\0’) { head = malloc (sizeof(ELEMENT)); head->d = s[0]; tail = head; for (i=1; s[i] != ‘\0’; i++) { tail->next = malloc(sizeof(ELEMENT)); tail = tail->next; tail->d = s[i]; } tail->next = NULL; return head; Sudeshna Sarkar, CSE, IIT Kharagpur

25 Sudeshna Sarkar, CSE, IIT Kharagpur
1. A one-element list head 4. after assigning NULL A ? tail head A B NULL 2. A second element is attached head tail A ? ? tail 3. Updating the tail head A B ? tail Sudeshna Sarkar, CSE, IIT Kharagpur

26 /* Count a list recursively */
int count (LINK head) { if (head == NULL) return 0; return 1+count(head->next); } Sudeshna Sarkar, CSE, IIT Kharagpur

27 Sudeshna Sarkar, CSE, IIT Kharagpur
/* Count a list iteratively */ int count (LINK head) { int cnt = 0; for ( ; head != NULL; head=head->next) ++cnt; return cnt; } void LengthTest (char a[]) { int len; LINK list; list = StrToList (a); int len = count (list); } Sudeshna Sarkar, CSE, IIT Kharagpur

28 Sudeshna Sarkar, CSE, IIT Kharagpur
Stack Heap LengthTest() a list n e w NULL len 98790 count () cnt head Sudeshna Sarkar, CSE, IIT Kharagpur

29 Sudeshna Sarkar, CSE, IIT Kharagpur
Stack Heap LengthTest() a list n e w NULL len 98790 count () cnt 1 head Sudeshna Sarkar, CSE, IIT Kharagpur

30 Sudeshna Sarkar, CSE, IIT Kharagpur
Stack Heap LengthTest() a list n e w NULL len 98790 count () cnt 2 head Sudeshna Sarkar, CSE, IIT Kharagpur

31 Sudeshna Sarkar, CSE, IIT Kharagpur
Stack Heap LengthTest() a list n e w NULL len 98790 count () cnt 3 head Sudeshna Sarkar, CSE, IIT Kharagpur

32 Sudeshna Sarkar, CSE, IIT Kharagpur
/* Print a List */ void PrintList (LINK head) { if (head == NULL) printf (“NULL”) ; else { printf (“%c --> “, head->d) ; PrintList (head->next); } Sudeshna Sarkar, CSE, IIT Kharagpur

33 /* Concatenate two Lists */
void concatenate (LINK ahead, LINK bhead) { if (ahead->next == NULL) ahead->next = bhead ; else concatenate (ahead->next, bhead); } Sudeshna Sarkar, CSE, IIT Kharagpur

34 Sudeshna Sarkar, CSE, IIT Kharagpur
Insertion Insertion in a list takes a fixed amount of time once the position in the list is found. Before Insertion p2 p1 A C q B Sudeshna Sarkar, CSE, IIT Kharagpur

35 Sudeshna Sarkar, CSE, IIT Kharagpur
Insertion /* Inserting an element in a linked list. */ void insert (LINK p1, LINK p2, LINK q) { p1->next = q; q->next = p2; } After Insertion p2 p1 A C q B Sudeshna Sarkar, CSE, IIT Kharagpur

36 Sudeshna Sarkar, CSE, IIT Kharagpur
Deletion Before deletion p 1 2 3 p->next = p->next->next; garbage p After deletion 1 2 3 Sudeshna Sarkar, CSE, IIT Kharagpur

37 Deletion (free memory)
Before deletion p 1 2 3 q = p->next; p->next = p->next->next; p After deletion 1 2 3 q free (q) ; Sudeshna Sarkar, CSE, IIT Kharagpur

38 Delete a list and free memory
/* Recursive deletion of a list */ void delete_list (LINK head) { if (head != NULL) { delete_list (head->next) ; free (head) ; /* Release storage */ } Sudeshna Sarkar, CSE, IIT Kharagpur

39 Insert an element into a sorted list
LIST insert ( LIST head, LIST newnode) { LIST cur ; if ((head == NULL) || (newnode->d < head->d)) { newnode->next = head; return newnode; } cur = head; while ((cur->next != NULL) && (cur->next->d < newnode->d)) cur = cur->next; newnode->next = cur->next; cur->next = newnode; return head ; Sudeshna Sarkar, CSE, IIT Kharagpur

40 Sudeshna Sarkar, CSE, IIT Kharagpur
InsertSort() LINK InsertSort (LINK head) { LINK result = NULL; LINK cur = head; LINK next; while (cur != NULL) { next = cur->next; result = insert (result, cur) ; cur = next; } return result; Sudeshna Sarkar, CSE, IIT Kharagpur

41 Delete an element from a sorted list
LIST delete ( LIST head, DATA d) { LIST prev, temp, curr = head; while ((curr != NULL) && (curr->d < d)) { prev = curr ; curr = curr->next; } if (curr->d == d) { temp = curr ; prev->next = curr->next; free (temp); return head ; Sudeshna Sarkar, CSE, IIT Kharagpur

42 Assignment:Reverse a list
head 1 2 3 4 head 1 2 3 4 Sudeshna Sarkar, CSE, IIT Kharagpur

43 Sudeshna Sarkar, CSE, IIT Kharagpur
Doubly linked list A B C Assignment : Insertion, deletion in a doubly linked list Sudeshna Sarkar, CSE, IIT Kharagpur


Download ppt "Dynamic Allocation Review Structure and list processing"

Similar presentations


Ads by Google