CSCE 3110 Data Structures & Algorithm Analysis Rada Mihalcea rada/CSCE3110 Growable Arrays. Lists....
-
Upload
avery-bennetts -
Category
Documents
-
view
230 -
download
2
Transcript of CSCE 3110 Data Structures & Algorithm Analysis Rada Mihalcea rada/CSCE3110 Growable Arrays. Lists....
CSCE 3110Data Structures & Algorithm Analysis
Rada Mihalceahttp://www.cs.unt.edu/~rada/CSCE3110
Growable Arrays. Lists.Reading: Chap. 3 Weiss
Linked Lists
Avoid the drawbacks of fixed size arrays with
Growable arraysLinked lists
Growable arrays
Avoid the problem of fixed-size arraysIncrease the size of the array when needed (I.e. when capacity is exceeded)Two strategies:
tight strategy (add a constant): f(N) = N + cgrowth strategy (double up): f(N) = 2N
Tight Strategy
Add a number k (k = constant) of elements every time the capacity is exceeded
123456789101112131415
C0 + (C0+k) + … (C0+Sk) =
S = (N – C0) / k
Running time?
C0 * S + S*(S+1) / 2 O(N2)
Tight Strategy
void insertLast(int rear, element o) {if ( size == rear) {
capacity += k;element* B = new element[capacity];for(int i=0; i<size; i++) { B[i] = A[i];}
A = B; } A[rear] = o;
rear++; size++; }
Growth Strategy
Double the size of the array every time is needed (I.e. capacity exceeded)1
23456789101112131415
C0 + (C0 * 2) + (C0*4) + … + (C0*2i) =
i = log (N / C0)
Running time?
C0 [1 + 2 + … + 2 log(N/C0) ] O(N)
How does the previous code change?
Linked Lists
Avoid the drawbacks of fixed size arrays with
Growable arraysLinked lists
int i, *pi;float f, *pf;pi = (int *) malloc(sizeof(int));pf = (float *) malloc (sizeof(float));*pi =1024;*pf =3.14;printf(”an integer = %d, a float = %f\n”, *pi, *pf);free(pi);free(pf);
request memory
return memory
Using Dynamically Allocated Memory (review)
bat cat sat vat NULL
Linked Lists
bat cat sat vat NULL
mat
Insertion
Compare this with the insertion in arrays!
bat cat sat vat NULL mat
danglingreference
Deletion
List ADT
ADT with position-based methodsgeneric methods size(), isEmpty()query methods isFirst(p), isLast(p)accessor methods first(), last()
before(p), after(p)update methods swapElements(p,q),
replaceElement(p,e)insertFirst(e), insertLast(e)insertBefore(p,e),
insertAfter(p,e)removeAfter(p)
typedef struct node, *pnode;typedef struct node { char data [4]; pnode next; };Creationpnode ptr =NULL; Testing#define IS_EMPTY(ptr) (!(ptr))Allocationptr=(pnode) malloc (sizeof(node));
Declaration
Implementation
b a t \0 NULL
address offirst node
ptr data ptr link
ptr
e name (*e).namestrcpy(ptr data, “bat”);ptr link = NULL;
Create one Node
pnode create2( ){/* create a linked list with two nodes */ pnode first, second; first = (pnode) malloc(sizeof(node)); second = ( pnode) malloc(sizeof(node)); second -> next= NULL; second -> data = 20; first -> data = 10; first ->next= second; return first;} 10 20 NULL
ptr
Example: Create a two-nodes list
void insertAfter(pnode node, char* data){/* insert a new node with data into the list ptr after node */ pnode temp; temp = (pnode) malloc(sizeof(node)); if (IS_FULL(temp)){ fprintf(stderr, “The memory is full\n”); exit (1); }
Insert (after a specific position)
strcpy(temp->data, data); if (node) { noempty list temp->next=node->next; node->next= temp; } else { empty list temp->next= NULL; node =temp; }}
50
10 20 NULL
temp
node
10 20 NULL 50 20 NULL 50
node trail = NULL node
(a) before deletion (b)after deletion
Deletion
Delete node other than the first node
10 20 NULL 50 20 NULL 10
head node head
void removeAfter(pnode node){/* delete what follows after node in the list */ pnode tmp; if (node) { tmp = node -> next; node->next = node->next->next; free(tmp); }}
10 20 NULL 50
20 NULL 10
node
void traverseList(pnode ptr){ printf(“The list contains: “); for ( ; ptr; ptr = ptr->next) printf(“%4d”, ptr->data); printf(“\n”); }
Traverse a list
Where does ptr point after this function call?
Other List Operations
swapElementsinsertFirstinsertLastdeleteBeforedeleteLast
Running Time Analysis
insertAfter O(?)deleteAfter O(?)deleteBefore O(?)deleteLast O(?)insertFirst O(?)insertLast O(?)