133.l3-more list (class)

Upload: nazmul-haque

Post on 05-Apr-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 133.L3-More List (Class)

    1/24

    CSE 133

    Data Structures

    Mohammad Nazmul Haque

    Lecturer, Dept. of CSE

    More on lists. Circular lists. Doubly linked lists.

  • 7/31/2019 133.L3-More List (Class)

    2/24

    Applications of Linked Lists

    Stacks and Queues Implemented with LinkedLists

    Polynomials Implemented with Linked Lists

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

    in terms of running time

  • 7/31/2019 133.L3-More List (Class)

    3/24

    Operations on Linked Lists

    Running time?

    insert, remove

    traverse, swap

    How to reverse the elements of a list?

  • 7/31/2019 133.L3-More List (Class)

    4/24

    typedef struct poly_node *poly_pointer;typedef struct poly_node {int coef;int expon;poly_pointer next;

    };

    poly_pointer a, b, c;

    A x a x a x a xm

    e

    m

    e em m( ) ...= + + +

    1 2 0

    1 2 0

    coef expon link

    Representation

    Polynomials

  • 7/31/2019 133.L3-More List (Class)

    5/24

    3 14 2 8 1 0a

    8 14 -3 10 10 6b

    a x x= + +3 2 114 8

    b x x x= +8 3 1014 10 6

    null

    null

    Example

  • 7/31/2019 133.L3-More List (Class)

    6/24

    3 14 2 8

    1 0a

    8 14 -3 10 10 6

    b

    11 14

    d

    a->expon == b->expon

    3 14 2 8

    1 0a

    8 14 -3 10 10 6

    b11 14

    d

    a->expon < b->expon-3 10

    Adding Polynomials

  • 7/31/2019 133.L3-More List (Class)

    7/24

    3 14 2 8 1 0

    a

    8 14 -3 10 10 6b

    11 14

    a->expon > b->expon

    -3 10

    d

    2 8

    Adding Polynomials (contd)

  • 7/31/2019 133.L3-More List (Class)

    8/24

    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)) {

    Adding Polynomials (contd)

  • 7/31/2019 133.L3-More List (Class)

    9/24

    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;}

  • 7/31/2019 133.L3-More List (Class)

    10/24

    (1) coefficient additions

    0 additions min(m, n)

    where m (n) denotes the number of terms in A (B).

    (2) exponent comparisonsextreme case

    em-1 > fm-1 > em-2 > fm-2 > > e0 > f0m+n-1 comparisons

    (3) creation of new nodesextreme case

    m + n new nodes

    summary O(m+n)

    Analysis

  • 7/31/2019 133.L3-More List (Class)

    11/24

    void 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;

    }

    Attach a Term

  • 7/31/2019 133.L3-More List (Class)

    12/24

    Other types of lists:

    Circular lists

    Doubly linked lists

  • 7/31/2019 133.L3-More List (Class)

    13/24

    3 14 2 8 1 0ptr

    ptr

    avail...

    avail

    temp

    circular list vs. chain

    Circularly linked lists

  • 7/31/2019 133.L3-More List (Class)

    14/24

    X1 X2 X3 a

    What happens when we insert a node to the front of a circular

    linked list?

    Problem: move down the whole list.

    Operations in a circular list

    X1 X2 X3 a

    Keep a pointer points to the last node.

    A possible solution:

  • 7/31/2019 133.L3-More List (Class)

    15/24

    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)}

    }

    X1 X2 X3

    (1)

    (2) ptr

    Insertion

  • 7/31/2019 133.L3-More List (Class)

    16/24

    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

  • 7/31/2019 133.L3-More List (Class)

    17/24

    Doubly Linked List

    Keep a pointer to the next and the previouselement in the list

    typedef struct node *pnode;typedef struct node {

    char data [4];pnode next;

    pnode prev;}

  • 7/31/2019 133.L3-More List (Class)

    18/24

    Doubly Linked List

    Keep a header and trailer pointers (sentinels)with no content

    header.prev = null; header.next = first element

    trailer.next = null; trailer.prev = last element

    Update pointers for every operation performed

    on the listHow to remove an element from the tail of thelist ?

  • 7/31/2019 133.L3-More List (Class)

    19/24

    Doubly Linked List

    removeLast()

    Runningtime?

    How doesthis compareto simplylinked lists?

  • 7/31/2019 133.L3-More List (Class)

    20/24

    Doubly Linked List

    insertFirst

    swapElements

  • 7/31/2019 133.L3-More List (Class)

    21/24

    15000

    0040

    00012

    01100

    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 node

    Revisit Sparse Matrices

  • 7/31/2019 133.L3-More List (Class)

    22/24

    down right

    value

    row col

    aij

    i j

    entry node

    aij

    Nodes in the Sparse Matrix

  • 7/31/2019 133.L3-More List (Class)

    23/24

    4 4

    1 012

    2 1-4

    0 211

    3 3-15

    1 15

    Circular linked list

    Linked Representation

  • 7/31/2019 133.L3-More List (Class)

    24/24

    #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 matrices

    Sparse Matrix Implementation