cs 261: data structures double linked list deque double ...web.engr.oregonstate.edu › ~sinisa ›...
TRANSCRIPT
CS 261: Data Structures
Double Linked List Deque
Double Linked List Bag1
Double Links• Allow access to both next and previous link
struct dlink {
TYPE value;
struct dlink * next;
struct dlink * previous;
};
vallinks
vallinks
…links
val2
Dequestruct dlink{
TYPE value;
struct dlink *next;
struct dlink *prev;
};
Link …
Deque
Linknext
backSentinel
frontSentinel
next nextnext
prev prev prevprev
Sentinel
next
prev
Sentinel
struct listDeque{
int size;
struct dlink * frontSentinel;
struct dlink * backSentinel;
};
Remove from Front or Back
void removeFrontDeque (struct listDeque *dq)
{
_removeDeque(dq, dq->frontSentinel->next);
}
void removeBackDeque (struct listDeque *dq)
{
_removeDeque(dq, dq->backSentinel->prev);
} 4
next
prev
Remove Double Link from Dequevoid _removeDeque (struct linkedList *dq,
struct dlink *lnk) {
assert(!isEmptyDeque(dq));
}
Link
Deque
Linknext
backSentinel
frontSentinel
nextprev
prev
next
prev
next
Remove Double Link from Dequevoid _removeDeque (struct linkedList *dq,
struct dlink *lnk) {
assert(!isEmptyDeque(dq));lnk->prev->next = lnk->next;
}
next
prev
Link
Deque
Link
backSentinel
frontSentinel
nextprev
prev
next
prev
next
Remove Double Link from Dequevoid _removeDeque (struct linkedList *dq,
struct dlink *lnk) {
assert(!isEmptyDeque(dq));lnk->prev->next = lnk->next;lnk->next->prev = lnk->prev;
}
next next
prev
Link
Deque
Link
backSentinel
frontSentinel
nextprev
prevprev
next
Remove Double Link from Dequevoid _removeDeque (struct linkedList *dq,
struct dlink *lnk) {
assert(!isEmptyDeque(dq));lnk->prev->next = lnk->next;lnk->next->prev = lnk->prev;free(lnk);dq->size--;
}
next next
prev
Link
DequebackSentinel
frontSentinel
nextprev
prevprev
Arbitrary ordering of elements in the collection
D-Bag
Link …
db
Linknext next next
nextprev prev prev
prev
next
prev
frontSentinelbackSentinel9
D-Bag Structurestruct dlink {
TYPE value; struct dlink * next; struct dlink * prev;
};struct listDBag {
int size; struct dlink * frontSentinel; struct dlink * backSentinel;
};
Link …
db
Linknext next next
nextprev prev prev
prev
next
prev
frontSentinelbackSentinel10
Bag Interface
void initBag(); /* Initialize the bag*/
int isEmptyBag(); /* Check if the bag is empty*/
void addBag(); /* Add value*/
void removeBag(); /* Remove value*/
void containsBag();/* Check if a value is in the bag*/
11
initDBagvoid initDBag (struct listDBag *db) {
assert(db);db->frontSentinel = (struct dlink *)
malloc(sizeof(struct dlink));assert(db->frontSentinel != 0); db->backSentinel = (struct dlink *)
malloc(sizeof(struct dlink)); assert(db->backSentinel != 0);...
} db
frontSentinel backSentinel12
initDBagvoid initDBag (struct listDBag *db) {
assert(db);db->frontSentinel = (struct dlink *)
malloc(sizeof(struct dlink));assert(db->frontSentinel != 0); db->backSentinel = (struct dlink *)
malloc(sizeof(struct dlink)); assert(db->backSentinel != 0);db->frontSentinel->next = db->backSentinel; db->backSentinel->prev = db->frontSentinal; db->size = 0;
}db
nextnext
prevprev
frontSentinel backSentinel
??
isEmpty
void isEmptyDBag (struct listDBag *db){
assert(db);
return db->size == 0;
}
14
db
nextnext
prevprev
frontSentinel backSentinel
AddDBag
void addDBag (struct listDBag *db, TYPE e) {
assert(db);
_addDList(db, db->frontSentinel->next, e);
}
db
lnk
backSentinel
frontSentinel
next
prev
next
prev
AddDListvoid _addDList (struct listDBag *db, struct dlink *lnk, TYPE e) {
}
db
lnk
backSentinel
frontSentinel
next
prev
next
prev
VOLUNTEERS!
AddDListvoid _addDList (struct listDBag *db, struct dlink *lnk, TYPE e) {
struct dlink *new;
new =(struct dlink *) malloc(sizeof(struct dlink)); assert(new);
...
}
db
lnk
backSentinel
frontSentinel
next
prev
next
prev
new
next
prev1st step:
memory allocation
void _addDList (struct listDBag *db, struct dlink *lnk, TYPE e) {
struct dlink *new;
new =(struct dlink *) malloc(sizeof(struct dlink)); assert(new);
new->value = e; new->next = lnk; new->prev = lnk->prev;
...
}
AddDList
2st step:
putting the new link in the bag
new
db
lnk
backSentinel
frontSentinel
nextprev
prev
next
prev
next
next
void _addDList (struct listDBag *db, struct dlink *lnk, TYPE e) {
struct dlink *new;
new =(struct dlink *) malloc(sizeof(struct dlink)); assert(new);
new->value = e; new->next = lnk; new->prev = lnk->prev;
lnk->prev->next = new; lnk->prev = new;
}
AddDList
3st step:
re-connecting the linked list
newlink
db
lnk
backSentinel
frontSentinel
next
prevprev
next
prev
next
void _addDList (struct listDBag *db, struct dlink *lnk, TYPE e) {
struct dlink *new;
new =(struct dlink *) malloc(sizeof(struct dlink)); assert(new);
new->value = e; new->next = lnk; new->prev = lnk->prev;
lnk->prev->next = new; lnk->prev = new;
db->size++;
}
AddDList
4th step:
increment the size
newlink
db
lnk
backSentinel
frontSentinel
next
prevprev
next
prev
Contains Bagint containsDBag (struct listDBag *db, TYPE e) {
struct dlink *lnk;
assert(!isEmptyBag(db));
/*Find the link of e in the d-linked list bag*/
lnk = _containsDList(db,e);
if (lnk) return 1;
return 0;
}21
Contains Returning the Pointerstruct dlink* _containsDList(struct listDBag *db, TYPE e)
{
struct dlink *current = db->frontSentinel->next;
while(current != db->backSentinel){
if(current->value == e) return current;
current = current->next;
}
return NULL; /* e not found */
}
Link …
db
Linknext next next
prev prev prev
next
prev
frontSentinel
backSentinel
Linknext
prev
22
Remove Bagvoid removeDBag (struct listDBag *db, TYPE e) {
struct dlink *lnkassert(!isEmptyBag(db));lnk = _containsDList(db,e);
...
}
Link …
db
Linknext next next
prev prev prev
next
prev
frontSentinel
backSentinel
Linknext
prev
23
Remove Bag
void removeDBag (struct listDBag *db, TYPE e) {
struct dlink *lnk
assert(!isEmptyBag(db));
lnk = _containsDList(db,e);
/* Removes only 1 copy */
_removeDLink(db, lnk);
}
24
Remove Linkvoid _removeLink (struct listDBag *db, struct dlink *lnk)
{
/* already checked that db is not empty */
...
}
Link
db
Linknext next
prev prev
next
prev
frontSentinel
backSentinel
Linknext
prev
lnk
=
25
Remove Linkvoid _removeLink (struct listDBag *db, struct dlink *lnk)
{
/* already checked that db is not empty */
lnk->prev->next = lnk->next;
...
}
26
Link
db
Linknext
prev prev
next
prev
frontSentinel
backSentinel
lnknext
prev
next
Remove Linkvoid _removeLink (struct listDBag *db, struct dlink *lnk)
{
/* already checked that db is not empty */
lnk->prev->next = lnk->next;
lnk->next->prev = lnk->prev;
...
}
27
Link
db
Linknext
prev prev
next
prev
frontSentinel
backSentinel
lnknextnext
prev
Remove Linkvoid _removeLink (struct listDBag *db, struct dlink *lnk)
{
/* already checked that db is not empty */
lnk->prev->next = lnk->next;
lnk->next->prev = lnk->prev;
free(lnk);
db->size--;
}
28
Link
db
Linknext
prev
next
prev
frontSentinel
backSentinel
next
prev
Remove Bag All Copies
void removeDBag (struct listDBag *db, TYPE e) {
struct dlink *lnk
assert(!isEmptyBag(db));
lnk = _containsDList(db,e);
while(lnk){
_removeDLink(db, lnk);
lnk = _containsDList(db,e);
}
} 29