+ All Categories
Home > Documents > Doubly-linked list library. typedef struct dllist { struct dllist *flink; struct dllist *blink; Jval...

Doubly-linked list library. typedef struct dllist { struct dllist *flink; struct dllist *blink; Jval...

Date post: 11-Dec-2015
Category:
Upload: domenic-coate
View: 260 times
Download: 0 times
Share this document with a friend
Popular Tags:
39
Doubly-linked list library. typedef struct dllist { struct dllist *flink; struct dllist *blink; Jval val; } *Dllist; Link to next node Link to previous nod The node’s value flink blink val Next node Previous node
Transcript

Doubly-linked list library.

typedef struct dllist { struct dllist *flink; struct dllist *blink; Jval val;} *Dllist;

Link to next nodeLink to previous nodeThe node’s value

flinkblinkval

Next nodePrevious node

Dllist library structure

• Circular

• Doubly-linked

• With a sentinel (header) node

flinkblinkval

flinkblinkval

flinkblinkval

…flinkblinkval

flinkblinkval

list

Creating a list: new_dllist()

flinkblinkval

l

Dllist l;

l = new_dllist();

Augmenting a list: dll_append()

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));

flinkblinkval.i=3

Augmenting a list: dll_append()

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));

flinkblinkval.i=3

flinkblinkval.i=8

What will this print?

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));printf(“%d\n”, l->flink->val.i);

flinkblinkval.i=3

flinkblinkval.i=8

What will this print?

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));printf(“%d\n”, l->flink->val.i);

flinkblinkval.i=3

flinkblinkval.i=8

3

Augmenting a list: dll_prepend()

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));dll_prepend(l, new_jval_s(“Jim”));

flinkblinkval.s

flinkblinkval.i=3

flinkblinkval.i=8

“Jim”

What will this print?

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));dll_prepend(l, new_jval_s(“Jim”));printf(“%d\n”, l->flink->val.i);

flinkblinkval.s

flinkblinkval.i=3

flinkblinkval.i=8

“Jim”

What will this print?

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));dll_prepend(l, new_jval_s(“Jim”));printf(“%d\n”, l->flink->val.i);

flinkblinkval.s

flinkblinkval.i=3

flinkblinkval.i=8

“Jim”

10864 (or somethingsimilar)

Augmenting a list: dll_insert_b()

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));dll_insert_b(l->flink->flink, new_jval_s(“Jim”));

flinkblinkval.i=3

flinkblinkval.s

flinkblinkval.i=8

“Jim”

Inserts before a given node.

What will this do?

flinkblinkval

l

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));dll_insert_b(l, new_jval_s(“Jim”);

flinkblinkval.i=3

flinkblinkval.i=8

What will this do?

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));dll_insert_b(l, new_jval_s(“Jim”);

flinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.s

“Jim”

Deleting: dll_delete_node()

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));dll_insert_b(l, new_jval_s(“Jim”);dll_delete_node(l->blink);

flinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.s

“Jim”

before

Deleting: dll_delete_node()

Dllist l;

l = new_dllist();dll_append(l, new_jval_i(3));dll_append(l, new_jval_i(8));dll_insert_b(l, new_jval_s(“Jim”);dll_delete_node(l->blink);

afterflinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8

Deleting: free_dllist()

• Destroys a list

• Including the sentinel node.

• Frees all malloc’d nodes

• Does not free jvals!

IS is; Dllist l;

l = new_dllist();is = new_inputstruct(NULL);

while(get_line(is) >= 0) { dll_prepend(l, new_jval_s(strdup(is->text1)));}free_dllist(l);

Handy macros (from dllist.h)

#define dll_first(d) ((d)->flink)#define dll_next(d) ((d)->flink)#define dll_last(d) ((d)->blink)#define dll_prev(d) ((d)->blink)#define dll_nil(d) (d)

flinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8

Traversal macros: weird but useful!

#define dll_traverse(ptr, list) \ for (ptr = (list)->flink; ptr != (list); ptr = ptr->flink)

#define dll_rtraverse(ptr, list) \ for (ptr = (list)->blink; ptr != (list); ptr = ptr->blink)

flinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8

Two programs to reverse stdin:

#include “fields.h”#include “dllist.h”

main(){ IS is; Dllist l;

is = new_inputstruct(NULL); l = new_dllist();

while(get_line(is) >= 0) { dll_prepend(l, new_jval_s(strdup(is->text1))); }

dll_traverse(tmp, l) { printf(“%s”, tmp->val.s); }}

#1

Two programs to reverse stdin:

#include “fields.h”#include “dllist.h”

main(){ IS is; Dllist l;

is = new_inputstruct(NULL); l = new_dllist();

while(get_line(is) >= 0) { dll_append(l, new_jval_s(strdup(is->text1))); }

dll_rtraverse(tmp, l) { printf(“%s”, tmp->val.s); }}

#2

Implementation: new_dllist()

flinkblinkval

d

Dllist new_dllist(){ Dllist d;

d = (Dllist) malloc (sizeof(struct dllist)); d->flink = d; d->blink = d; return d;}

Implementation: dll_insert_b()void dll_insert_b(Dllist node, Jval v) { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode;}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

e.g. before dll_insert_b(n, new_jval_i(10));

n

Implementation: dll_insert_b()void dll_insert_b(Dllist node, Jval v) { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode;}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

dll_insert_b(n, new_jval_i(10));

n

flinkblinkval

newnode

Implementation: dll_insert_b()void dll_insert_b(Dllist node, Jval v) { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode;}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

dll_insert_b(n, new_jval_i(10));

n

flinkblink

val.i=10

newnode

Implementation: dll_insert_b()void dll_insert_b(Dllist node, Jval v) { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode;}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

dll_insert_b(n, new_jval_i(10));

n

flinkblink

val.i=10

newnode

Implementation: dll_insert_b()void dll_insert_b(Dllist node, Jval v) { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode;}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

dll_insert_b(n, new_jval_i(10));

n

flinkblink

val.i=10

newnode

Implementation: dll_insert_b()void dll_insert_b(Dllist node, Jval v) { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode;}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

dll_insert_b(n, new_jval_i(10));

n

flinkblink

val.i=10

newnode

Implementation: dll_insert_b()void dll_insert_b(Dllist node, Jval v) { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode;}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

dll_insert_b(n, new_jval_i(10));

n

flinkblink

val.i=10

newnode

Implementation: dll_insert_b()void dll_insert_b(Dllist node, Jval v) { Dllist newnode; newnode = (Dllist) malloc (sizeof(struct dllist)); newnode->val = v; newnode->flink = node; newnode->blink = node->blink; newnode->flink->blink = newnode; newnode->blink->flink = newnode;}

dll_insert_b(n, new_jval_i(10));

flinkblinkval.i=3

n

flinkblink

val.i=10

flinkblinkval.i=8

flinkblinkval.i=2

Implementation: dll_insert_a()

void dll_insert_a(Dllist n, Jval val) { dll_insert_b(n->flink, val);}

flinkblinkval

n

flinkblinkval.i=3

flinkblinkval.i=8

Implementation: dll_append()

void dll_append(Dllist l, Jval val) { dll_insert_b(l, val);}

flinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8

Implementation: dll_prepend()

void dll_prepend(Dllist l, Jval val) { dll_insert_a(l, val);}

flinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8

Implementation: dll_delete_node()

void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node);}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

e.g. before dll_delete_node(n);

n

Implementation: dll_delete_node()

void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node);}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

dll_delete_node(n);

n

Implementation: dll_delete_node()

void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node);}

flinkblinkval.i=3

flinkblinkval.i=8

flinkblinkval.i=2

dll_delete_node(n);

n

Implementation: dll_delete_node()

void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node);}

flinkblinkval.i=3

flinkblinkval.i=2

dll_delete_node(n);

n

Implementation: dll_delete_node()

void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node);}

flinkblinkval.i=3

flinkblinkval.i=2

dll_delete_node(n);

n ?

Implementation: free_dllist()

void free_dllist(Dllist l){ while (!dll_empty(l)) { dll_delete_node(dll_first(l)); } free(l);}

flinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8

Implementation: dll_empty()

int dll_empty(Dllist l){ return (l->flink == l);}

flinkblinkval

l

flinkblinkval.i=3

flinkblinkval.i=8


Recommended