+ All Categories
Home > Documents > More Lists

More Lists

Date post: 04-Oct-2015
Category:
Upload: taharazvi
View: 215 times
Download: 0 times
Share this document with a friend
Description:
Algorithms
24
CSCE 3110 Data Structures & Algorithm Analysis Rada Mihalcea http://www.cs.unt.edu/~rada/CSCE3110 More on lists. Circular lists. Doubly linked lists.
Transcript
  • CSCE 3110Data Structures & Algorithm AnalysisRada Mihalceahttp://www.cs.unt.edu/~rada/CSCE3110

    More on lists. Circular lists. Doubly linked lists.

  • Applications of Linked ListsStacks and Queues Implemented with Linked ListsPolynomials Implemented with Linked Lists

    Remember the array based implementation?Hint: two strategies, one efficient in terms of space, one in terms of running time

  • Operations on Linked ListsRunning time?

    insert, removetraverse, swapHow to reverse the elements of a list?

  • Polynomials

    typedef struct poly_node *poly_pointer; typedef struct poly_node { int coef; int expon; poly_pointer next; }; poly_pointer a, b, c;Representation

  • Example3 142 81 0a8 14-3 1010 6bnullnull

  • Adding Polynomials

    3 142 81 0a8 14-3 1010 6b11 14da->expon == b->expon3 142 81 0a8 14-3 1010 6b11 14da->expon < b->expon-3 10

  • Adding Polynomials (contd)3 142 81 0a8 14-3 1010 6b11 14a->expon > b->expon-3 10d2 8

  • Adding Polynomials (contd)poly_pointer padd(poly_pointer a, poly_pointer b){ poly_pointer front, rear, temp; int sum; rear =(poly_pointer)malloc(sizeof(poly_node)); if (IS_FULL(rear)) { fprintf(stderr, The memory is full\n); exit(1); } front = rear; while (a && b) { switch (COMPARE(a->expon, b->expon)) {

  • case -1: /* a->expon < b->expon */ attach(b->coef, b->expon, &rear); b= b->next; break; case 0: /* a->expon == b->expon */ sum = a->coef + b->coef; if (sum) attach(sum,a->expon,&rear); a = a->next; b = b->next; break; case 1: /* a->expon > b->expon */ attach(a->coef, a->expon, &rear); a = a->next; } } for (; a; a = a->next) attach(a->coef, a->expon, &rear); for (; b; b=b->next) attach(b->coef, b->expon, &rear); rear->next = NULL; temp = front; front = front->next; free(temp); return front;}

  • Analysis(1)coefficient additions0 additions min(m, n)where m (n) denotes the number of terms in A (B).(2)exponent comparisonsextreme caseem-1 > fm-1 > em-2 > fm-2 > > e0 > f0m+n-1 comparisons(3)creation of new nodesextreme casem + n new nodessummaryO(m+n)

  • Attach a Termvoid attach(float coefficient, int exponent, poly_pointer *ptr){/* create a new node attaching to the node pointed to by ptr. ptr is updated to point to this new node. */ poly_pointer temp; temp = (poly_pointer) malloc(sizeof(poly_node)); if (IS_FULL(temp)) { fprintf(stderr, The memory is full\n); exit(1); } temp->coef = coefficient; temp->expon = exponent; (*ptr)->next = temp; *ptr = temp;}

  • Other types of lists:Circular listsDoubly linked lists

  • Circularly linked lists3 142 81 0ptrptravail...availtempcircular list vs. chain

  • aWhat happens when we insert a node to the front of a circularlinked list?Problem: move down the whole list.Operations in a circular listX3 aKeep a pointer points to the last node.A possible solution:

  • void insertFront (pnode* ptr, pnode node){ /* insert a node in the list with head (*ptr)->next */ if (IS_EMPTY(*ptr)) { *ptr= node; node->next = node; /* circular link */ } else { node->next = (*ptr)->next; (1) (*ptr)->next = node; (2) }}X3 (1)(2)ptrInsertion

  • int length(pnode ptr){ pnode temp; int count = 0; if (ptr) { temp = ptr; do { count++; temp = temp->next; } while (temp!=ptr); } return count;}List length

  • Doubly Linked ListKeep a pointer to the next and the previous element in the list

    typedef struct node *pnode;typedef struct node { char data [4]; pnode next; pnode prev; }

  • Doubly Linked ListKeep a header and trailer pointers (sentinels) with no content

    header.prev = null; header.next = first elementtrailer.next = null; trailer.prev = last element Update pointers for every operation performed on the listHow to remove an element from the tail of the list ?

  • Doubly Linked List removeLast()Running time?How does this compare to simply linked lists?

  • Doubly Linked ListinsertFirstswapElements

  • Previous scheme: represent each non-NULL element as a tuple(row, column, value)

    New scheme:each column (row): a circular linked list with a head nodeRevisit Sparse Matrices

  • downrightvaluerowcolaijijentry nodeaij

    Nodes in the Sparse Matrix

  • 44101221-4021133-15115Circular linked listLinked Representation

  • #define MAX_SIZE 50 /* size of largest matrix */typedef struct mnode *pmnode;typedef struct mnode { int row; int col; int value; pmnode next, down; };Operations on sparse matricesSparse Matrix Implementation


Recommended