cs 261: data structures double linked list deque double ...web.engr.oregonstate.edu › ~sinisa ›...

29
CS 261: Data Structures Double Linked List Deque Double Linked List Bag 1

Upload: others

Post on 30-May-2020

3 views

Category:

Documents


0 download

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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