Copyright 2000-2009 Networking Laboratory Chapter 4. LISTS Horowitz, Sahni, and Anderson-Freed...
-
Upload
hilary-neal -
Category
Documents
-
view
213 -
download
1
Transcript of Copyright 2000-2009 Networking Laboratory Chapter 4. LISTS Horowitz, Sahni, and Anderson-Freed...
Copyright 2000-2009 Networking Laboratory
Chapter 4. Chapter 4. LISTS LISTS
Horowitz, Sahni, and Anderson-FreedFundamentals of Data Structures in C, 2nd Edition
Computer Science Press, 2008
Fall 2009 Course, Sungkyunkwan University
Hyunseung [email protected]
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
compose of data part and link part link part contains address of the next element in a list non-sequential representations size of the list is not predefined dynamic storage allocation and deallocation
Networking Laboratory 2/57
bat satcat vat NULL
ptr
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
To insert the word mat between cat and sat
1) get a currently unused node (paddr)
2) set paddr’s data to mat
3) set paddr’s link to point to the address found in the link of the node cat
4) set the link of the node cat to point to paddr
Networking Laboratory 3/57
bat satcat vat NULL
ptr
mat
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
To delete mat from the list
1) find the element that immediately precedes mat, which is cat
2) set its link to point to mat’s link
no data movement in insert and delete operation
Networking Laboratory 4/57
bat satcat vat NULL
ptr
mat
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
Ex 4.1 [list of words ending in at] define a node structure for the list
data field: character array link field: pointer to the next node self-referential structure
typedef struct list_node *list_ptr;
typedef struct list_node {
char data[4];
list_ptr link;
};
list_ptr ptr = NULL;
Networking Laboratory 5/57
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
Create a new node for our list then place the word bat into our list
ptr=(list_ptr)malloc(sizeof(list_node));
strcpy(ptr->data,”bat”);
ptr->link=NULL;
Networking Laboratory 6/57
b a t \0 NULL
ptr
address of
first nodeptr->data ptr->link
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
Ex 4.2 [two-node linked list] create a linked list of integers
typedef struct list_node *list_ptr;
typedef struct list_node {
int data;
list_ptr link;
};
list_ptr ptr = NULL;
10 20 NULL
ptr
Networking Laboratory 7/57
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
list_ptr create2() {
list_ptr first, second;
first = (list_ptr)malloc(sizeof(list_node));
second = (list_ptr)malloc(sizeof(list_node));
second->link=NULL;
second->data=20;
first->data=10;
first->link=second;
return first;
}
Networking Laboratory 8/57
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
Ex 4.3 [list insertion]
determine if we have used all available memory: IS_FULL
#define IS_FULL(ptr) (!(ptr))
Function call: insert(&ptr, node);
Networking Laboratory 9/57
10 20 NULL
ptr
node 50
temp
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Listsvoid insert (list_ptr *pptr,list_ptr node) {
list_ptr temp;
temp=(list_ptr)malloc(sizeof(list_node));
if(IS_FULL(temp)) {
fprintf(stderr,”The momory is full\n”);
exit(1);
}
temp->data=50;
if (*pptr) {
temp->link = node->link;
node->link = temp;
}
else {
temp->link = NULL; *pptr = temp;
}
}
Networking Laboratory 10/57
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
Ex 4.4 [list deletion] ptr: point to the start of list node: point to the node to be deleted trail: point to the node that precedes node to be deleted
delete(&ptr,NULL,ptr);
delete(&ptr,ptr,ptr->link);
Networking Laboratory 11/57
10 50
ptr
20 NULL
node
50
ptr
20 NULL
trail = NULL
(b) after deletion(a) before deletion
10 50
ptr
20 NULL
trail
10
ptr
20 NULL
node
(b) after deletion(a) before deletion
Fall 2009 Data Structures
Singly Linked ListsSingly Linked Lists
void delete(list_ptr *pptr, list_ptr trail,
list_ptr node) {
if (trail) trail->link = node->link;
else *pptr = (*pptr)->link;
free(node);
} delete(&ptr,NULL,ptr); delete(&ptr,ptr,ptr->link);
Ex 4.5 [printing out a list]void print_list(list_ptr ptr) {
printf(“The list contains: “);
for(; ptr; ptr = ptr->link)
printf(“%4d”, ptr->data);
printf(“\n”);
}
Networking Laboratory 12/57
Fall 2009 Data Structures
Dynamically Linked Stacks And QueuesDynamically Linked Stacks And Queues
#define MAX_STACKS 10 /* n=MAX_STACKS=10 */
typedef struct {
int key; /* other fields here */
} element;
typedef struct stack *stack_ptr;
typedef struct stack {
element item; stack_ptr link;
};
stack_ptr top[MAX_STACKS];
NULL
top
element link
······
NULL
front
element link
······
rear(a) linked stack
(b) linked queue
Networking Laboratory 13/57
Fall 2009 Data Structures
Dynamically Linked Stacks And QueuesDynamically Linked Stacks And Queues
·
·
·
NULL
top[0]
element link
······key
NULL
top[MAX_STACKS-1]
······
initial condition for n stackstop[i] = NULL, 0 ≤ i < MAX_STACKS
boundary conditionstop[i]==NULL iff the ith stack is emptyIS_FULL(temp) iff the memory is full
Networking Laboratory 14/57
Fall 2009 Data Structures
Dynamically Linked Stacks And QueuesDynamically Linked Stacks And Queues
Add to a linked stackvoid push(stack_ptr *ptop, element item) {
stack_ptr temp =
(stack_ptr)malloc(sizeof (stack));
if(IS_FULL(temp)) {
fprintf(stderr,”The memory is full\n”);
exit(1);
}
temp->item=item;
temp->link=*ptop;
*ptop = temp;
}
#define IS_FULL(ptr) (!(ptr)) push(&top[stack_no], item);
Networking Laboratory 15/57
Fall 2009 Data Structures
Dynamically Linked Stacks And QueuesDynamically Linked Stacks And Queues
Delete from a linked stackelement pop(stack_ptr *ptop) {
stack_ptr temp = *ptop;
element item;
if(IS_EMPTY(temp)) {
fprintf(stderr,”The stack is empty\n”);
exit(1);
}
item=temp->item;
*ptop=temp->link;
free(temp);
return item;
}
#define IS_EMPTY(ptr) (!(ptr)) item=pop(&top[stack_no]);
Networking Laboratory 16/57
Fall 2009 Data Structures
Dynamically Linked Stacks And QueuesDynamically Linked Stacks And Queues
#define MAX_QUEUES 10 /* m=MAX_QUEUES=10 */
typedef struct queue *queue_ptr;
typedef struct queue {
element item;
queue_ptr link;
};
queue_ptr front[MAX_QUEUES],rear[MAX_QUEUES];
NULL
front
element link
······
rear
(b) linked queue
Networking Laboratory 17/57
Fall 2009 Data Structures
Dynamically Linked Stacks And QueuesDynamically Linked Stacks And Queues
NULL
front[0]
element link
······
rear[0]
key
NULL
front[MAX_QUEUES-1]
······
rear[MAX_QUEUES-1]·
·
·
initial conditon for n queues
front[i]=NULL, 0 £ i < MAX_QUEUES
boundary conditionsfront[i]==NULL iff the ith queue is emptyIS_FULL(temp) iff the memory is full
Networking Laboratory 18/57
Fall 2009 Data Structures
Dynamically Linked Stacks And QueuesDynamically Linked Stacks And Queues
Add to the rear of a linked queuevoid addq(queue_ptr *pfront, queue_ptr *prear, element item) {
queue_ptr temp =(queue_ptr)malloc(sizeof(queue));
if(IS_FULL(temp)) {fprintf(stderr,”The memory is full\n”);exit(1);
}temp->item=item;temp->link=NULL;if (*pfront) (*prear)->link=temp;else *pfront = temp;*prear = temp;
}
addq(&front[queue_no], &rear[queue_no], item);
Networking Laboratory 19/57
Fall 2009 Data Structures
Dynamically Linked Stacks And QueuesDynamically Linked Stacks And Queues
Delete from the front of a linked queueelement deleteq(queue_ptr *pfront) {
queue_ptr temp=*pfront;
element item;
if (IS_EMPTY(*pfront)) {
fprintf(stderr,”The queue is empty\n”);
exit(1);
}
item=temp->item;
*pfront=temp->link;
free(temp);
return item;
}
item=deleteq(&front[queue_no]); comparison: array vs. linked list
Networking Laboratory 20/57
Fall 2009 Data Structures
PolynomialsPolynomials
Representing polynomials as singly linked lists A(x) = am-1xem-1 + ··· + a0xe0
typedef struct poly_node *poly_ptr;
typedef struct poly_node {
int coef; int expon; poly_ptr link;
};
poly_ptr a,b,d;
poly_node
a = 3x14 + 2x8 + 1
b = 8x14 - 3x10 + 10x6
Networking Laboratory 21/57
coef expon link
3 14 2 8 1 0 NULL
a
8 14 -3 10 10 6 NULL
b
Fall 2009 Data Structures
PolynomialsPolynomials
Adding polynomials
(a) a->expon == b->expon
Networking Laboratory 22/57
3 14 2 8 1 0 NULL
8 14 -3 10 10 6 NULL
b
a
11 14 NULL
d rear
Fall 2009 Data Structures
PolynomialsPolynomials
(b) a->expon < b->expon
Networking Laboratory 23/57
3 14 2 8 1 0 NULL
8 14 -3 10 10 6 NULL
b
a
-3 10 NULL
d
11 14
rear
Fall 2009 Data Structures
PolynomialsPolynomials
(c) a->expon > b->expon
Networking Laboratory 24/57
3 14 2 8 1 0 NULL
8 14 -3 10 10 6 NULL
b
a
2 8 NULL
rear
11 14 -3 10
d
Fall 2009 Data Structures
PolynomialsPolynomials
(d) a->expon < b->expon
Networking Laboratory 25/57
3 14 2 8 1 0 NULL
8 14 -3 10 10 6 NULL
b
a
2 811 14 -3 10
10 6 NULL
rear
d
Fall 2009 Data Structures
PolynomialsPolynomials
(e) b == NULL;
3 14 2 8 1 0 NULL
8 14 -3 10 10 6 NULL
b
a
2 811 14 -3 10
rear
10 6 1 0 NULL
d
Networking Laboratory 26/57
Fall 2009 Data Structures
poly_ptr padd(poly_ptr a,poly_ptr b) {
poly_ptr front,rear,temp;
int sum;
rear=(poly_ptr)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->link;
break;
case 0: /* a->expon = b->expon */
sum = a->coef + b->coef;
if(sum) attach(sum,a->expon,&rear);
a = a->link; b = b->link; break;
case 1: /* a->expon > b->expon */
attach(a->coef,a->expon,&rear);
a = a->link;
}
Networking Laboratory 27/57
PolynomialsPolynomials
Fall 2009 Data Structures
PolynomialsPolynomialspoly_ptr padd(poly_ptr a,poly_ptr b) {
·
·
·
(continued from the previous slide)
for(; a; a=a->link)
attach(a->coef,a->expon,&rear);
for(; b; b=b->link)
attach(b->coef,b->expon,&rear);
rear->link = NULL;
temp=front; front=front->link; free(temp);
return front;
}
Networking Laboratory 28/57
Fall 2009 Data Structures
PolynomialsPolynomials
Function attach() to create a new node and append it to the end of d
void attach(float coe, int exp, poly_ptr *pptr)
{
poly_ptr temp;
temp=(poly_ptr)malloc(sizeof(poly_node));
if(IS_FULL(temp)) {
fprintf(stderr,”The memory is full\n”);
exit(1);
}
temp->coef = coe;
temp->expon = exp;
(*pptr)->link = temp;
*pptr=temp;
}
Networking Laboratory 29/57
Fall 2009 Data Structures
PolynomialsPolynomials
Analysis of padd where m, n : number of terms in each polynomial
coefficient additions: O(min{m, n})
exponent comparisons: O(m + n)
creation of new nodes for d O(m + n)
Time complexity: O(m + n)
Networking Laboratory 30/57
Fall 2009 Data Structures
PolynomialsPolynomials
Erasing polynomials
void erase(poly_ptr *pptr) {
poly_ptr temp;
while (*pptr) {
temp = *pptr;
*pptr = (*pptr)->link;
free(temp);
}
}
useful to reclaim the nodes that are being used to represent partial result such as temp(x)
Networking Laboratory 31/57
Fall 2009 Data Structures
PolynomialsPolynomials
Allocating/deallocating nodes
how to preserve free node in a storage pool? initially link together all free nodes into a list in a storage pool avail: variable of type poly_ptr that points to the first node in list
of free nodes
Networking Laboratory 32/57
NULLavail
initial available space list
······
1 2 n
storage pool
Fall 2009 Data Structures
PolynomialsPolynomials
Allocating nodespoly_ptr get_node(void) {
poly_ptr node;
if (avail) {
node = avail; avail = avail->link;
}
else {
node =
(poly_ptr)malloc(sizeof(poly_node));
if (IS_FULL(node)) {
fprintf(stderr,”The memory is full\n”);
exit(1);
}
}
return node;
}
Networking Laboratory 33/57
Fall 2009 Data Structures
PolynomialsPolynomials
Deallocating nodes
void ret_node(poly_ptr ptr) {
ptr->link = avail;
avail = ptr;
}
Networking Laboratory 34/57
Fall 2009 Data Structures
PolynomialsPolynomials
void erase(poly_ptr *pptr) {
poly_ptr temp;
while (*pptr) {
temp = *pptr;
*pptr = (*pptr)->link;
ret_node(temp);
}
}
traverse to the last node in the list: O(n) where n: number of terms
how to erase polynomial efficiently? how to return n used nodes to storage pool?
Networking Laboratory 35/57
Fall 2009 Data Structures
PolynomialsPolynomials
Representing polynomials as circularly linked list
to free all the nodes of a polynomials more efficiently modify list structure
the link of the last node points to the first node in the list called circular list ( chain)
Networking Laboratory 36/57
ptr
Fall 2009 Data Structures
PolynomialsPolynomials
Maintain our own list (as a chain) of nodes that has been freed obtain effective erase algorithm
void cerase(poly_ptr *pptr) {
if (*pptr) {
temp = (*pptr)->link;
(*pptr)->link = avail;
avail = temp;
*pptr = NULL;
}
}
independent of the number of nodes in a list: O(1)
Networking Laboratory 37/57
Fall 2009 Data Structures
PolynomialsPolynomials
Circular list with head nodes
handle zero polynomials in the same way as nonzero polynomials
ptrhead node
- -
ptrhead node
- -(empty list)
Networking Laboratory 38/57
Fall 2009 Data Structures
Operations for ChainsOperations for Chains
Inverting (or reversing) a chain “in place” by using three pointers lead, middle, trail
typedef struct list_node *list_ptr;
typedef struct list_node {
char data; list_ptr link; };
list_ptr invert(list_ptr lead) {
list_ptr middle, trail;
middle = NULL;
while (lead) {
trail = middle;
middle = lead;
lead = lead->link;
middle->link = trail;
}
return middle;
} time: O(length of the list)
Networking Laboratory 39/57
Fall 2009 Data Structures
Operations for ChainsOperations for Chains
NULL
leadmiddletrail
NULL
leadtrail middle
NULL
lead NULL
middle
Networking Laboratory 40/57
Fall 2009 Data Structures
Operations for ChainsOperations for Chains
NULL
leadmiddletrail
NULL
NULL
leadmiddletrail
NULL
NULL
leadmiddletrail
NULL
Networking Laboratory 41/57
Fall 2009 Data Structures
Operations for ChainsOperations for Chains
Concatenates two chains produce a new list that contains ptr1 followed by ptr2
list_ptr concat(list_ptr ptr1,list_ptr ptr2) {
list_ptr temp;
if (IS_EMPTY(ptr1)) return ptr2;
else {
if (!IS_EMPTY(ptr2)) {
for (temp=ptr1; temp->link; temp=temp->link);
temp->link = ptr2;
}
return ptr1;
}
}
Networking Laboratory 42/57
Fall 2009 Data Structures
Operations for ChainsOperations for Chains
Finding the length of a list(chain)int length(list_ptr ptr) {
int count = 0;
while (ptr) {
count++;
ptr = ptr->link;
}
return count;
}
Insert a new node at the front or at the rear of the chain
front-insert: O(1), rear-insert: O(n)
Networking Laboratory 43/57
ptr x1 x2 x3 NULL
Fall 2009 Data Structures
Operations for Chains Operations for Chains
Insert a new node at the front of a list(chain)
void insert_front(list_ptr *pptr, list_ptr node) {
if (IS_EMPTY(*pptr)) {
*pptr = node;
node->link = NULL;
}
else {
node->link = *pptr;
*pptr = node;
}
}
Networking Laboratory 44/57
Fall 2009 Data Structures
Operations for Circularly Linked ListsOperations for Circularly Linked Lists
(singly) circular linked lists
Insert a new node at the front or at the rear move down the entire length of ptr to insert at both front and
rear: insert-front : O(n) insert-rear : O(n)
Networking Laboratory 45/57
ptr x1 x2 x3
Fall 2009 Data Structures
Operations for Circularly Linked ListsOperations for Circularly Linked Lists
improve this better: make ptr points to the last node
insert a new node at the front or at the rear front-insert : O(1) rear-insert : O(1)
Networking Laboratory 46/57
ptrx1 x2 x3
Fall 2009 Data Structures
Operations for Circularly Linked ListsOperations for Circularly Linked Lists
Insert a new node at the front of a circular list
void insert_front(list_ptr *pptr, list_ptr node) {
if (IS_EMPTY(*pptr)) {
*pptr = node;
node->link = node;
}
else {
node->link = (*pptr)->link;
(*pptr)->link = node;
*pptr = node; /* for rear-insert */
}
}
Networking Laboratory 47/57
Fall 2009 Data Structures
Operations for Circularly Linked ListsOperations for Circularly Linked Lists
Finding the length of a circular list
int length(list_ptr ptr) {
list_ptr temp;
int count = 0;
if (ptr) {
temp = ptr;
do {
count++;
temp = temp->link;
} while (temp != ptr);
}
return count;
}
Networking Laboratory 48/57
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
Problems of singly linked lists move to only one way direction hard to find the previous node hard to delete the arbitrary node
Doubly linked circular lists doubly lists + circular lists allow two links two way direction
Networking Laboratory 49/57
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
typedef struct node *node_ptr;
typedef struct node {
node_ptr llink;
element item;
node_ptr rlink;
};
suppose that ptr points to any node in a doubly linked list
ptr = ptr->llink->rlink = ptr->rlink->llink
Networking Laboratory 50/57
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
Introduce dummy node, called, head to represent empty list make easy to implement operations contains no information in item field
Empty doubly linked circular list with head node
Networking Laboratory 51/57
ptr
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
doubly linked circular list with head node
Networking Laboratory 52/57
head node
llink item rlink
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
Insertion into a doubly linked circular list
void dinsert(node_ptr node,node_ptr newnode) {
/* insert newnode to the right of node */
newnode->llink = node;
newnode->rlink = node->rlink;
node->rlink->llink = newnode;
node->rlink = newnode;
}
time: O(1)
Networking Laboratory 53/57
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
Insertion into an empty doubly linked circular list
Networking Laboratory 54/57
newnode
node node
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
Deletion from a doubly linked circular list
void ddelete(node_ptr node,node_ptr deleted)
{
/* delete from the doubly linked list */
if (node == deleted)
printf(“Deletion of head node ”
“not permitted.\n”);
else {
deleted->llink->rlink = deleted->rlink;
deleted->rlink->llink = deleted->llink;
free(deleted);
}
}
time complexity : O(1)
Networking Laboratory 55/57
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
Deletion in a doubly linked list with a single node
Networking Laboratory 56/57
deleted
node
node
Fall 2009 Data Structures
Doubly linked listsDoubly linked lists
Doubly linked circular list
don’t have to traverse a list : O(1)
insert(delete) front/middle/rear is all the same
Networking Laboratory 57/57