Doubly-linked list library.

Slides:



Advertisements
Similar presentations
Chapter 3: Linked List Tutor: Angie Hui
Advertisements

Incomplete Structs struct B; struct A { struct B * partner; // other declarations… }; struct B { struct A * partner; // other declarations… };
Page 11 Solutions to Practice Problems Using a Linked List From Previous Days Notes Create C functions to solve the following problems with linked lists.
Dynamic Allocation and Linked Lists. Dynamic memory allocation in C C uses the functions malloc() and free() to implement dynamic allocation. malloc is.
Stacks, Queues, and Linked Lists
EENG212 Algorithms and Data Structures
Linked Lists.
CSCE 3110 Data Structures & Algorithm Analysis
Linked Lists: deleting...
Data Structures ADT List
LINKED LIST, STACKS AND QUEUES Saras M Srivastava, PGT – Comp. Sc. Kendriya Vidyalaya TengaValley.
CSEB324 Data Structures & Algorithms
Double Linked List Operations Dr. David Tsai 2010/4/12.
Linked Lists CSE 2451 Matt Boggus. Dynamic memory reminder Allocate memory during run-time malloc() and calloc() – return a void pointer to memory or.
418115: II. Linked List A linked list can be thought of a chain of linked list elements. A linked list element contains a single data item, and contains.
CSCE 3110 Data Structures & Algorithm Analysis
LIST PROCESSING.
Singly Linked List BTECH, EE KAZIRANGA UNIVERSITY.
Computer Programming for Engineering Applications ECE 175 Intro to Programming.
Linked List Variations
CSCI2100B Linked List Jeffrey
Data Structure Lecture-5
Data Structure Lecture-3 Prepared by: Shipra Shukla Assistant Professor Kaziranga University.
Senem Kumova Metin Spring2009 STACKS AND QUEUES Chapter 10 in A Book on C.
Chapter 6 Structures By C. Shing ITEC Dept Radford University.
Data Structures: Doubly Linked List1 Doubly linked list l The linear linked list is accessed from the first node each time we want to insert or delete.
Linked Lists. 2 Merge Sorted Lists Write an algorithm that merges two sorted linked lists The function should return a pointer to a single combined list.
Chapter 17 Linked List Saurav Karmakar Spring 2007.
M180: Data Structures & Algorithms in Java
Senem Kumova Metin Spring2009 BINARY TREES && TREE TRAVERSALS Chapter 10 in A Book on C.
Computer Programming Link List (Insertion, Printing and Deletion functions) Lecture 23.
Linked Lists list elements are stored, in memory, in an arbitrary order explicit information (called a link) is used to go from one element to the next.
Introduction to C Programming CE Lecture 20 Insertion and Deletion with Linear Linked Lists.
Linked Lists. Example We would like to keep a list of inventory records – but only as many as we need An array is a fixed size Instead – use a linked.
Dynamic Allocation and Linked Lists. Dynamic memory allocation in C C uses the functions malloc() and free() to implement dynamic allocation. malloc is.
Reference: Vinu V Das, Principles of Data Structures using C and C++
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++ Early Objects Seventh Edition by Tony Gaddis, Judy.
Last meeting..Doubly Linked List  InsertToFront  InsertToEnd  Search  DeleteNode.
Lists 1. Introduction Data: A finite sequence of data items. Operations: Construction: Create an empty list Empty: Check if list is empty Insert: Add.
Linked Lists. A linear linked list is a collection of objects, called nodes, each of which contains a data item and a pointer to the next node in the.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Slide
1. Circular Linked List In a circular linked list, the last node contains a pointer to the first node of the list. In a circular linked list,
Algorithms and Data Structures
COMP x1 Computing 2 C Outside the Style Guide, Linked Lists and Function Pointers 1.
Data Structures. Abstract Data Type A collection of related data is known as an abstract data type (ADT) Data Structure = ADT + Collection of functions.
2/21/20161 List Operations Advanced Programming Ananda Gunawardena.
Lists (2). Circular Doubly-Linked Lists with Sentry Node Head.
Circular Linked List Singly Circular Linked List Doubly Circular Linked List.
LINEAR LINKED LISTS The disadvantages of arrays: 1.The size of the array is fixed. 2.Large size of array??? 3. Inserting and deleting elements. If the.
1 Circular, Doubly-Linked Lists Node Composition List Class Pushing and Popping Values Insert and Erase at Arbitrary Locations List Implementation.
Linked List.  Is a series of connected nodes, where each node is a data structure with data and pointer(s) Advantages over array implementation  Can.
Doubly Linked List Exercises Sometimes it is useful to have a linked list with pointers to both the next and previous nodes. This is called a doubly linked.
Linked Lists Chapter Introduction To The Linked List ADT Linked list: set of data structures (nodes) that contain references to other data structures.
CS32 Discussion Section 1B Week 3 TA: Hao Yu (Cody)
© Oxford University Press All rights reserved. Data Structures Using C, 2e Reema Thareja.
Copyright © 2012 Pearson Education, Inc. Chapter 17: Linked Lists.
CPSC 252 Linked Lists III Page 1 Variations on Singly Linked Lists Inserting or deleting at the front of a list is different from at any other point in.
One implementation of the LIST ADT Insert new node before current and new node becomes current (assume new node created) node newNode = new node; head.
Programming Circular Linked List.
[Chapter 4; Chapter 6, pp ] CSC 143 Linked Lists (cont) [Chapter 4; Chapter 6, pp ]
Linked List :: Basic Concepts
Lectures linked lists Chapter 6 of textbook
UNIT-3 LINKED LIST.
Data Structures 7th Week
Linked Lists head One downside of arrays is that they have a fixed size. To solve this problem of fixed size, we’ll relax the constraint that the.
A Doubly Linked List There’s the need to access a list in reverse order prev next data dnode header 1.
Linked List Sudeshna Sarkar.
Recursion.
Linked List Insert as a first node Insert as a last node
Lists, Strings & Multi-dimensional arrays
Presentation transcript:

Doubly-linked list library. typedef struct dllist { struct dllist *flink; struct dllist *blink; Jval val; } *Dllist; Link to next node Link to previous node The node’s value Next node flink Previous node blink val

Dllist library structure Circular Doubly-linked With a sentinel (header) node list flink blink val flink flink flink flink … blink blink blink blink val val val val

Creating a list: new_dllist() Dllist l; l = new_dllist(); l flink blink val

Augmenting a list: dll_append() Dllist l; l = new_dllist(); dll_append(l, new_jval_i(3)); l flink flink blink blink val val.i=3

Augmenting a list: dll_append() Dllist l; l = new_dllist(); dll_append(l, new_jval_i(3)); dll_append(l, new_jval_i(8)); l flink flink flink blink blink blink val val.i=3 val.i=8

What will this print? 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); l flink flink flink blink blink blink val val.i=3 val.i=8

What will this print? 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); l flink flink flink 3 blink blink blink val val.i=3 val.i=8

Augmenting a list: dll_prepend() 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”)); l flink flink flink flink blink blink blink blink val val.s val.i=3 val.i=8 “Jim”

What will this print? 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); l flink flink flink flink blink blink blink blink val val.s val.i=3 val.i=8 “Jim”

What will this print? Dllist l; 10864 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); 10864 (or something similar) l flink flink flink flink blink blink blink blink val val.s val.i=3 val.i=8 “Jim”

Augmenting a list: dll_insert_b() 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”)); Inserts before a given node. l flink flink flink flink blink blink blink blink val val.i=3 val.s val.i=8 “Jim”

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”); l flink flink flink blink blink blink val val.i=3 val.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”); l flink flink flink flink blink blink blink blink val val.i=3 val.i=8 val.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); l flink flink flink flink before blink blink blink blink val val.i=3 val.i=8 val.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); l flink flink flink after blink blink blink val val.i=3 val.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) l flink flink flink blink blink blink val val.i=3 val.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) l flink flink flink blink blink blink val val.i=3 val.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() Dllist new_dllist() { Dllist d; d = (Dllist) malloc (sizeof(struct dllist)); d->flink = d; d->blink = d; return d; } d flink blink val

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; } e.g. before dll_insert_b(n, new_jval_i(10)); n flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

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; } newnode dll_insert_b(n, new_jval_i(10)); flink blink n val flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

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; } newnode dll_insert_b(n, new_jval_i(10)); flink blink n val.i=10 flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

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; } newnode dll_insert_b(n, new_jval_i(10)); flink blink n val.i=10 flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

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; } newnode dll_insert_b(n, new_jval_i(10)); flink blink n val.i=10 flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

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; } newnode dll_insert_b(n, new_jval_i(10)); flink blink n val.i=10 flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

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; } newnode dll_insert_b(n, new_jval_i(10)); flink blink n val.i=10 flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

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)); n flink flink flink flink blink blink blink blink val.i=3 val.i=10 val.i=8 val.i=2

Implementation: dll_insert_a() void dll_insert_a(Dllist n, Jval val) { dll_insert_b(n->flink, val); } n flink flink flink blink blink blink val val.i=3 val.i=8

Implementation: dll_append() void dll_append(Dllist l, Jval val) { dll_insert_b(l, val); } l flink flink flink blink blink blink val val.i=3 val.i=8

Implementation: dll_prepend() void dll_prepend(Dllist l, Jval val) { dll_insert_a(l, val); } l flink flink flink blink blink blink val val.i=3 val.i=8

Implementation: dll_delete_node() void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node); } e.g. before dll_delete_node(n); n flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

Implementation: dll_delete_node() void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node); } dll_delete_node(n); n flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

Implementation: dll_delete_node() void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node); } dll_delete_node(n); n flink flink flink blink blink blink val.i=3 val.i=8 val.i=2

Implementation: dll_delete_node() void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node); } dll_delete_node(n); n flink flink blink blink val.i=3 val.i=2

Implementation: dll_delete_node() void dll_delete_node(Dllist node) { node->flink->blink = node->blink; node->blink->flink = node->flink; free(node); } dll_delete_node(n); n ? flink flink blink blink val.i=3 val.i=2

Implementation: free_dllist() void free_dllist(Dllist l) { while (!dll_empty(l)) { dll_delete_node(dll_first(l)); } free(l); l flink flink flink blink blink blink val val.i=3 val.i=8

Implementation: dll_empty() int dll_empty(Dllist l) { return (l->flink == l); } l flink flink flink blink blink blink val val.i=3 val.i=8