Presentation is loading. Please wait.

Presentation is loading. Please wait.

E.G.M. Petrakislists1 Lists  List: finite sequence of data elements  all elements have the same data type  The operations depend on the type of the.

Similar presentations


Presentation on theme: "E.G.M. Petrakislists1 Lists  List: finite sequence of data elements  all elements have the same data type  The operations depend on the type of the."— Presentation transcript:

1 E.G.M. Petrakislists1 Lists  List: finite sequence of data elements  all elements have the same data type  The operations depend on the type of the list and not on the data type  List: the most general type  Ordered: element is ascending order  Stacks, Queues: not all operations are allowed

2 E.G.M. Petrakislists2 list or head info next list new element Insertion after current position current rear or tail

3 E.G.M. Petrakislists3 list or head list new element Insertion at current position current rear or tail

4 E.G.M. Petrakislists4 list or head list or head deleted element Deletion after current position current rear or tail

5 E.G.M. Petrakislists5 list or head list or head deleted element Deletion at current position current rear or tail

6 E.G.M. Petrakislists6 Terminology  empty: contains no elements  length: number of elements in list  head, or list: pointer to the beginning of the list  tail: pointer to the last element  current: pointer to current element  ordered: elements in ascending or descending order

7 E.G.M. Petrakislists7 Operations  setFirst: set “current” to “head”  setPos(i): sets current to the i-th element  currValue: returns value of “current” element  next/prev: “current” points to next/previous element  clear: delete all elements  insert: inserts an element at/after current position  append: inserts an element at “tail”  remove: delete the element at/after “current” position  isInList: true/false if current position is in list  isEmpty: true/false if list is empty

8 E.G.M. Petrakislists8 ADT List interface List { // List ADT in Java public void clear(); // Remove all Objects public void insert(Object item); // Insert at curr pos public void append(Object item); // Insert at tail public Object remove(); // Remove/return curr public void setFirst(); // Set to first pos public void next(); // Move to next pos public void prev(); // Move to prev pos public int length(); // Return curr length public void setPos(int pos); // Set curr position public void setValue(Object val); // Set current value public Object currValue(); // Return curr value public boolean isEmpty(); // True if empty list public boolean isInList(); // True if in list } // interface List

9 E.G.M. Petrakislists9 Iteration  Iterate through the whole list : MyList for (MyList.first( ); MyList.isInList( ); MyList.next( )) DoSomething(MyList.currValue( ));  If MyList: (12 32 15) and current points to 32 thenMyList.insert(90) changes the list to be (12 32 90 15)

10 E.G.M. Petrakislists10 List Implementations  Array-based: very fast  the elements are stored in array  static: actual number of elements less than size allocated  Dynamic Memory: slower, more efficient  allocates memory for new elements  dynamic: no restriction on number of elements (except memory size)

11 E.G.M. Petrakislists11 Array Implementation (1)  Elements in continuous array positions  Head of list at pos 0  Insertion and Deletion cause shifting of elements

12 E.G.M. Petrakislists12 class AList implements List { // Array-based list class private static final int defaultSize = 10; private int msize; // Maximum size of list private int numInList; // Actual list size private int curr; // Position of curr private Object[] listArray; // Array holding list AList() { setup(defaultSize); } // Constructor AList(int sz) { setup(sz); } // Constructor private void setup(int sz) { // Do initializations msize = sz; numInList = curr = 0; ListArray = new Object[sz]; // Create listArray } public void clear() // Remove all Objects from list { numInList = curr = 0; } // Simply reinitialize values

13 E.G.M. Petrakislists13 public void insert(Object it) { // Insert at curr pos Assert.notFalse(numInList < msize, "List is full"); Assert.notFalse((curr >=0) && (curr <= numInList), "Bad value for curr"); for (int i=numInList; i>curr; i--) // Shift up listArray[i] = listArray[i-1]; listArray[curr] = it; numInList++; // Increment list size } public void append(Object it) { // Insert at tail Assert.notFalse(numInList < msize, "List is full"); listArray[numInList++] = it; // Increment list size } public Object remove() { // Remove and return Object Assert.notFalse(!isEmpty(), "No delete: list empty"); Assert.notFalse(isInList(), "No current element"); Object it = listArray[curr]; // Hold removed Object for (int i=curr; i<numInList-1; i++) // Shift down listArray[i] = listArray[i+1]; numInList--; // Decrement list size return it; }

14 E.G.M. Petrakislists14 public void setFirst() { curr = 0; } // Set to first public void prev() { curr--; } // Move curr to prev public void next() { curr++; } // Move curr to next public int length() { return numInList; } public void setPos(int pos) { curr = pos; } public boolean isEmpty() { return numInList == 0; } public void setValue(Object it) { // Set current value Assert.notFalse(isInList(), "No current element"); listArray[curr] = it; } public boolean isInList() // True if curr within list { return (curr >= 0) && (curr < numInList); } } // Array-based list implementation

15 E.G.M. Petrakislists15 Array Implementation (2) 1 11526 list 026 105 1211 1 8 9 10 11 12 13 nodes NULL

16 E.G.M. Petrakislists16 31313 14 376 5 12 List 1 1726 List 2 311932 List 3 1181311415 List 4

17 E.G.M. Petrakislists17 1260 21110 3516 4125 5171 6132 7 819 91413 10422 11 12318 1363 14 15 163724 17312 18 19320 20 2179 22150 23 24120 25186 List 4 List 2 List 3 List 1

18 E.G.M. Petrakislists18 class AList implements List { // Array-based list class private static final int defaultSize = 10; private int msize; // Maximum size of list private int numInList; // Actual list size private int curr; // Position of curr private int avail;// next available position private Object[] listArray; // Array holding list private int[] listarray_next;// array holding pointers to next Object private void setup(int sz) {// Do initializations msize = sz; numinlist = curr = 0; listarray = new Object[sz]; listarray_next = new int[sz]; avail = 0;// the first available element for (i=0; i < msize; i++) listarray_next[i] = i+1;// each elem points to its successor listarray_next[msize-1] = nothing;// the last elem has no next }

19 E.G.M. Petrakislists19 private int get_node( ) { // Get next available node if (avail == nothing) // from stack error(‘list overflow’) else { int pos = avail; avail = listarray_next[avail]; return pos; } private void free_node (int p) { // make node available listarray_next[p] = avail; // push node back to stack avail =p; } private void insert(int p, Object x) {// insert after node pointed to by “p” if (p = msize) error (‘void insertion’) else { int q = get_node( ); listarray[q] = x; listarray_next[q] = listarray_next[p]; listarray_next[p] = q; }

20 E.G.M. Petrakislists20 private void delete(int p, Object x) { if ( p > 0 || p >= msize) // deletes elem after elem error (‘void deletion’); // pointed to by “p” else { int q = listarray_next[p]; x = listarray[q]; listarray_next[p] = listarray_next[q]; free_node(q); } public AList() { setup(defaultSize); } // Constructor public AList(int sz) { setup(sz); } // Constructor public void clear( ) {…}// remove all ELEMs from list public void insert(Object it) {…}// insert ELEM at current position public void append(Object it) {…}// insert ELEM at tail of list public Object remove( ) {…}// remove and return current ELEM public void setFirst( ) {…}// set curr to first position; public void prev( ) {…}// move curr to previous position; public void next( ) {…}// move curr to next position; public int length( ) {…}// return current length of list } // Array-based list implementation

21 E.G.M. Petrakislists21 Dynamic Memory  Allocates memory for new elements as needed  Each node is a distinct object  The node class class Link { // A linked-list node private Object element; // Object for this node private Link next; // Pointer to next node Link(Object it, Link nextval) // Constructor { element = it; next = nextval; } Link(Link nextval) { next = nextval; } // Constructor Link next() { return next; } Link setNext(Link nextval) { return next = nextval; } Object element() { return element; } Object setElement(Object it) { return element = it; } }

22 E.G.M. Petrakislists22 class LList implements List { // Linked list class private Link head; // Pointer to list header private Link tail; // Pointer to last Object in list protected Link curr; // Position of current Object LList(int sz) { setup(); } // Constructor LList() { setup(); } // Constructor private void setup() { tail = head = curr = new Link(null); } public void setFirst() { curr = head; } public void next() { if (curr != null) curr = curr.next(); } public void prev() { // Move to previous position Link temp = head; if ((curr == null) || (curr == head)) // No prev { curr = null; return; } // so return while ((temp != null) && (temp.next() != curr)) temp = temp.next(); curr = temp; }

23 E.G.M. Petrakislists23 public Object currValue() { // Return current Object if (!isInList()) return null; return curr.next().element(); } public boolean isEmpty() // True if list is empty { return head.next() == null; } public void insert(Object it) {// Insert Object at current position Assert.notNull(curr, "No current element"); curr.setNext(new Link(it, curr.next())); if (tail == curr) // Appended new Object tail = curr.next(); } public Object remove() { // Remove/return curr Object if (!isInList()) return null; Object it = curr.next().element(); // Remember value if (tail == curr.next()) tail = curr; // Set tail curr.setNext(curr.next().next()); // Cut from list return it; // Return value }

24 E.G.M. Petrakislists24 public void append(Object it) // insert Elem at tail of list { tail.setNext(new Link(it, NULL)); } public int length( ) {// return current length of list int cnt = 0; for (Link temp = head.next(); temp != NULL; temp = temp.next()) cnt++; // count Elems return cnt; } public void setPos(int pos) {// set curr to position curr = head; for (int i = 0; (curr != NULL) && (i < pos) i++) curr = curr.next(); } public void setValue(Object val) {// set current Elem's value Assert.notFalse(isInList(), "No current element"); curr.next().setElement(val); } public bool isInList( )// TRUE if curr is within list { return (curr != NULL) && (curr.next() != NULL); } } // Linked list class implementation

25 E.G.M. Petrakislists25 Comparison  Array-Based Lists:  insertion and deletion are  (n)  prev and direct access are  (1)  fixed space allocated in advance  space reorganization if the array is full  faster in most cases  Linked Lists:  insertion and deletion are  (1)  prev and direct access are  (n)  space grows with number of elements  every element requires overhead  slower

26 E.G.M. Petrakislists26 Doubly Linked List  Allows for direct access to both next and previous elements of the current pointer  insert (delete) operations update both “next” and “prev” pointers  easy implementation curr.setNext(new DLink(it, curr.next(), curr)); if (curr.next().next() != null) curr.next().next().setPrev(curr.next()); if (tail == curr) // Appended new Object tail = curr.next();

27 E.G.M. Petrakislists27 Insertion in Doubly Linked List current

28 E.G.M. Petrakislists28 current Deletion in Doubly Linked List

29 E.G.M. Petrakislists29 Circular Linked Lists  The next pointer of the last element points to the first element


Download ppt "E.G.M. Petrakislists1 Lists  List: finite sequence of data elements  all elements have the same data type  The operations depend on the type of the."

Similar presentations


Ads by Google