Upload
elmer-bryan
View
229
Download
0
Embed Size (px)
Citation preview
Linear ListLinked Representation
Linked Representation
• 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
Memory Layout
a b c d e
c a e d b
A linked representation uses an arbitrary layout.
Layout of L = (a,b,c,d,e) using an array representation.
The figures show computer memory. An array uses a contiguous chunk of memory.
Linked Representation
pointer (or link) in e is NULL
c a e d b
use a variable firstNode to get to the first element a
firstNode
Normal Way To Draw A Linked List
link or pointer field of node
data field of node
a b c d e
NULL
firstNode
Chain
•A chain is a linked list in which each node represents one element.
• There is a link or pointer from one element to the next.
• The last node has a NULL pointer.
a b c d e
NULL
firstNode
Node Representation
template <class T>struct chainNode { // data members T element; chainNode<T> *next; // constructors come here};
next
element
Constructors Of chainNode
chainNode() {}?
?
?
element
next
element
chainNode(const T& element)
{this->element = element;}
chainNode(const T& element, chainNode<T>* next)
{this->element = element;
this->next = next;}
get(0)
checkIndex(0);
desiredNode = firstNode; // gets you to first node
return desiredNode->element;
a b c d e
NULL
firstNode
Do a checkIndex first. Then move to desired node. Once you are at the desired node, you can return the element in that node as inreturn desiredNode.element;When firstNode = null, there is no element whose index is 0.
get(1)
checkIndex(1);
desiredNode = firstNode->next; // gets you to second node
return desiredNode->element;
a b c d e
NULL
firstNode
get(2)
checkIndex(2);
desiredNode = firstNode->next->next; // gets you to third node
return desiredNode->element;
a b c d e
NULL
firstNode
get(5)
checkIndex(5); // throws exception
desiredNode = firstNode->next->next->next->next->next;
// desiredNode = NULL
return desiredNode->element; // NULL.element
a b c d e
NULL
firstNode
Get(theIndex)
• Check theIndex• currentNode = firstNode• For (i=0; i<theIndex;i++)
– currentNode = currentNode->next;
• Return currentNode->element
Erase An Element
erase(0)
a b c d e
NULL
firstNode
deleteNode = firstNode;
firstNode = firstNode->next;
delete deleteNode;
a b d e
NULL
firstNode
c
erase(2)
first get to node just before node to be removed
cc
beforeNode = firstNode->next;
b
beforeNode
erase(2)
save pointer to node that will be deleted
deleteNode = beforeNode->next;
beforeNode
a b c d enull
firstNode
erase(2)
now change pointer in beforeNode
beforeNode->next = beforeNode->next->next;
delete deleteNode;
beforeNode
a b c d enull
firstNode
Erase(theIndex)• Check theIndex• If theIndex == 0
– Delete firstNode– firstNode = firstNode->next
• Else– Find beforeNode– deleteNode = beforeNode->next;– beforeNode->next = beforNode->next->next– Delete deleteNode
• listSize--
insert(0,’f’)
a b c d e
NULL
firstNode
f
newNode
Step 1: get a node, set its data and link fields
newNode = new chainNode<char>(theElement,
firstNode);
insert(0,’f’)
a b c d e
NULL
firstNode
f
newNode
Step 2: update firstNode
firstNode = newNode;
One-Step insert(0,’f’)
a b c d e
NULL
firstNode
f
newNode
firstNode = new chainNode<char>(‘f’, firstNode);
insert(3,’f’)
• first find node whose index is 2
a b c d e
NULL
firstNode
fnewNode
beforeNode
c
• next create a node and set its data and link fields
chainNode<char>* newNode = new chainNode<char>( ‘f’,
beforeNode->next);
• finally link beforeNode to newNodebeforeNode->next = newNode;
Two-Step insert(3,’f’)
beforeNode = firstNode->next->next;
beforeNode->next = new chainNode<char>
(‘f’, beforeNode->next);
a b c d e
NULL
firstNode
fnewNode
beforeNode
c
Insert(theIndex, theElement)
• Check theIndex (0-listSize)• If theIndex == 0
– create newNode– newNode = firstNode
• Else– Create newNode– Find the beforeNode– newNode->next = beforeNode->next– beforeNode->next = newNode
• listSize++
Other chain structures
Chain With Header Node
a b c d e
NULL
headerNode
a b c d e
NULL
firstNode
insert/erase code is simplified
Empty Chain With Header Node
headerNode
NULL
The Class chainWithHeader
template<class T>class chainWithHeader : public linearList<T> { public:// other ADT methods defined here
protected: void checkIndex(int theIndex) const; chainNode<T>* HeaderNode; int listSize; };
Circular List
a b c d e
firstNode
Insert(0,’f’)insert(listSize,’g’)
erase(0)erase(listSize-1)
a b c d e
firstNode
Doubly Linked List
a b c d e
NULL
firstNode
NULL
lastNode
Node Representation
template <class T>struct doublyChainNode { // data members T element; chainNode<T> *previous; chainNode<T> *next;
// constructors come here};
next
element
previous
Insert(0,’f’)insert(listSize,’g’)
erase(0)erase(listSize-1)
a b c d e
NULL
firstNode
NULL
lastNode
Doubly Linked Circular List
a b c d e
firstNode
Insert(0,’f’)insert(listSize,’g’)
erase(0)erase(listSize-1)
a b c e
headerNode
d
Doubly Linked Circular List With Header Node
a b c e
headerNode
d
Empty Doubly Linked Circular List With Header Node
headerNode
The STL Class list/vector
Linked implementation of a linear list. Doubly linked circular list with header node. Has many more methods than chain. Similar names and signatures.
Lab 2
• Check the note and download your lab material before lab, bring your labtop with you in class!