csce 3110 data structures & algorithm analysis more on lists. circular lists. doubly linked...
DESCRIPTION
Operations on Linked Lists Running time? insert, remove traverse, swap How to reverse the elements of a list?TRANSCRIPT
CSCE 3110Data Structures & Algorithm Analysis
More on lists. Circular lists. Doubly linked lists.
Applications of Linked Lists
Stacks 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 Lists
Running time?insert, removetraverse, swap
How to reverse the elements of a list?
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 xme
me em m( ) ...
1 2 01 2 0
coef expon link
Representation
Polynomials
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
3 14 2 8 1 0a
8 14 -3 10 10 6b
11 14d
a->expon == b->expon
3 14 2 8 1 0a
8 14 -3 10 10 6b
11 14d
a->expon < b->expon-3 10
Adding Polynomials
3 14 2 8 1 0a
8 14 -3 10 10 6b
11 14
a->expon > b->expon
-3 10d
2 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)) {
Adding Polynomials (cont’d)
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->link; 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;}
(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 > f0
m+n-1 comparisons(3) creation of new nodes
extreme casem + n new nodessummary O(m+n)
Analysis
Other types of lists:
Circular listsDoubly linked lists
3 14 2 8 1 0ptr
circular
Circularly linked lists
X1 X2 X3 a
What happens when we insert a node to the front of a circularlinked 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:
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
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 List
Keep a pointer to the next and the previous element in the listtypedef struct node *pnode;
typedef struct node { char data [4]; pnode next;
pnode prev; }
Doubly Linked List
Keep 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 List
insertFirstswapElements
1500000400001201100
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
down right
value
row col
aij
i j
entry node
aij
Nodes in the Sparse Matrix
4 4
1 012
2 1-4
0 211
3 3-15
1 15
Circular linked list
Linked 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; };
Sparse Matrix Implementation
Operations on Sparse Matrices
TransposeAdditionMultiplication