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

Post on 30-May-2020

3 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related