cs 261: data structures double linked list deque double ...web.engr.oregonstate.edu › ~sinisa ›...
TRANSCRIPT
![Page 1: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/1.jpg)
CS 261: Data Structures
Double Linked List Deque
Double Linked List Bag1
![Page 2: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/2.jpg)
Double Links• Allow access to both next and previous link
struct dlink {
TYPE value;
struct dlink * next;
struct dlink * previous;
};
vallinks
vallinks
…links
val2
![Page 3: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/3.jpg)
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;
};
![Page 4: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/4.jpg)
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
![Page 5: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/5.jpg)
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
![Page 6: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/6.jpg)
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
![Page 7: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/7.jpg)
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
![Page 8: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/8.jpg)
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
![Page 9: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/9.jpg)
Arbitrary ordering of elements in the collection
D-Bag
Link …
db
Linknext next next
nextprev prev prev
prev
next
prev
frontSentinelbackSentinel9
![Page 10: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/10.jpg)
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
![Page 11: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/11.jpg)
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
![Page 12: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/12.jpg)
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
![Page 13: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/13.jpg)
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
??
![Page 14: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/14.jpg)
isEmpty
void isEmptyDBag (struct listDBag *db){
assert(db);
return db->size == 0;
}
14
db
nextnext
prevprev
frontSentinel backSentinel
![Page 15: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/15.jpg)
AddDBag
void addDBag (struct listDBag *db, TYPE e) {
assert(db);
_addDList(db, db->frontSentinel->next, e);
}
db
lnk
backSentinel
frontSentinel
next
prev
next
prev
![Page 16: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/16.jpg)
AddDListvoid _addDList (struct listDBag *db, struct dlink *lnk, TYPE e) {
}
db
lnk
backSentinel
frontSentinel
next
prev
next
prev
VOLUNTEERS!
![Page 17: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/17.jpg)
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
![Page 18: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/18.jpg)
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
![Page 19: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/19.jpg)
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
![Page 20: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/20.jpg)
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
![Page 21: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/21.jpg)
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
![Page 22: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/22.jpg)
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
![Page 23: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/23.jpg)
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
![Page 24: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/24.jpg)
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
![Page 25: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/25.jpg)
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
![Page 26: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/26.jpg)
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
![Page 27: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/27.jpg)
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
![Page 28: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/28.jpg)
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
![Page 29: CS 261: Data Structures Double Linked List Deque Double ...web.engr.oregonstate.edu › ~sinisa › courses › OSU › CS261... · Double Linked List Deque Double Linked List Bag](https://reader034.vdocuments.net/reader034/viewer/2022042310/5ed8bf6e6714ca7f47687ed2/html5/thumbnails/29.jpg)
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