Download presentation

Presentation is loading. Please wait.

1
**CSCE 3110 Data Structures & Algorithm Analysis**

Rada Mihalcea More on lists. Circular lists. Doubly linked lists.

2
**Applications of Linked Lists**

Stacks and Queues Implemented with Linked Lists 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

3
**Operations on Linked Lists**

Running time? insert, remove traverse, swap How to reverse the elements of a list?

4
**Polynomials Representation typedef struct poly_node *poly_pointer;**

int coef; int expon; poly_pointer next; }; poly_pointer a, b, c; coef expon link

5
Example a null b -3 10 null

6
**Adding Polynomials 3 14 2 8 1 0 a 8 14 -3 10 10 6 b 11 14**

2 8 1 0 a -3 10 b 11 14 a->expon == b->expon d 2 8 1 0 a -3 10 b 11 14 -3 10 a->expon < b->expon d

7
**Adding Polynomials (cont’d)**

2 8 1 0 a -3 10 b 11 14 -3 10 2 8 d a->expon > b->expon

8
**Adding Polynomials (cont’d)**

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

9
**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; case 1: /* a->expon > b->expon */ attach(a->coef, a->expon, &rear); a = a->next; } for (; a; a = a->next) for (; b; b=b->next) rear->next = NULL; temp = front; front = front->next; free(temp); return front;

10
**Analysis (1) coefficient additions 0 additions min(m, n)**

where m (n) denotes the number of terms in A (B). (2) exponent comparisons extreme case em-1 > fm-1 > em-2 > fm-2 > … > e0 > f0 m+n-1 comparisons (3) creation of new nodes m + n new nodes summary O(m+n)

11
**Attach a Term 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;

12
Other types of lists: Circular lists Doubly linked lists

13
**Circularly linked lists**

circular list vs. chain ptr 2 8 1 0 avail ptr temp avail ...

14
**Operations in a circular list**

What happens when we insert a node to the front of a circular linked list? X X X a Problem: move down the whole list. A possible solution: X X X a Keep a pointer points to the last node.

15
**Insertion ptr (2) (1) 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) X X X ptr (2) (1)

16
**List length int length(pnode ptr) { pnode temp; int count = 0;**

if (ptr) { temp = ptr; do { count++; temp = temp->next; } while (temp!=ptr); } return count;

17
Doubly Linked List Keep 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; }

18
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 list How to remove an element from the tail of the list ?

19
**Doubly Linked List – removeLast()**

Running time? How does this compare to simply linked lists?

20
Doubly Linked List insertFirst swapElements

21
**Revisit Sparse Matrices**

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

22
**Nodes in the Sparse Matrix**

down col row right entry node value i j aij aij

23
**Linked Representation**

4 4 2 11 1 1 1 12 5 2 1 -4 3 3 -15 Circular linked list

24
**Sparse Matrix Implementation**

#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

Similar presentations

© 2017 SlidePlayer.com Inc.

All rights reserved.

Ads by Google