Date post: | 11-Dec-2015 |
Category: |
Documents |
Upload: | domenic-coate |
View: | 260 times |
Download: | 0 times |
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
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