Data Structures: Lists
Data Structures: Lists
Lists
Hikmat Farhat
March 7, 2013
Hikmat Farhat
Data Structures
March 7, 2013
1 / 39
Introduction
Hikmat Farhat
Data Structures
March 7, 2013
1 / 39
Operations on lists
Hikmat Farhat
Data Structures
March 7, 2013
2 / 39
Vector Implementation
Hikmat Farhat
Data Structures
March 7, 2013
3 / 39
Iterators
Hikmat Farhat
Data Structures
March 7, 2013
4 / 39
s t r i n g e l e m e n t s /
back ( f i r s t s t r i n g ) ;
back ( second s t r i n g ) ;
back ( t h i r d s t r i n g ) ;
v e c t o r <s t r i n g > : : i t e r a t o r
itr ;
f o r ( i t r =v . b e g i n ( ) ; i t r != v . end ( ) ; i t r ++)
cout << i t r <<e n d l ;
return 0;
}
Hikmat Farhat
Data Structures
March 7, 2013
5 / 39
Data Structures
March 7, 2013
6 / 39
Hikmat Farhat
Data Structures
March 7, 2013
7 / 39
itr ;
f o r ( i t r =m y l i s t . b e g i n ( ) ; i t r != m y l i s t . end ( ) ; i t r ++)
cout << i t r <<e n d l ;
return 0;
}
Hikmat Farhat
Data Structures
March 7, 2013
8 / 39
Vector interface
#i f n d e f l i s t v e c t o r V e c t o r h
#d e f i n e l i s t v e c t o r V e c t o r h
t e m p l a t e <typename O b j e c t>
c l a s s Vector
{
private :
int theSize ;
int theCapacity ;
Object o b j e c t s ;
public :
e x p l i c i t V e c t o r ( i n t i n i t S i z e =0);
Vector ( const Vector & rhs ) ;
Vector ( ) ;
c o n s t V e c t o r & o p e r a t o r= ( c o n s t V e c t o r & r h s ) ;
void r e s i z e ( i n t newCapacity ) ;
Object & operator [ ] ( i n t index ) ;
b o o l empty ( ) c o n s t ;
i n t s i z e ( ) c o n s t ; / / how many e l e m e n t s ?
i n t capacity ( ) const ;// t o t a l capacity
void push back ( const Object & x ) ;
void pop back ( ) ;
typedef Object i t e r a t o r ;
i t e r a t o r begin ( ) ;
i t e r a t o r end ( ) ;
};
Hikmat Farhat
Data Structures
March 7, 2013
9 / 39
Hikmat Farhat
Data Structures
March 7, 2013
10 / 39
Vector Implementation
t e m p l a t e <typename O b j e c t>
V e c t o r<O b j e c t >:: V e c t o r ( i n t i n i t S i z e )
: theSize ( i n i t S i z e ) , theCapacity ( i n i t S i z e )
{ o b j e c t s=new O b j e c t [ t h e C a p a c i t y ] ; }
t e m p l a t e <typename O b j e c t>
V e c t o r<O b j e c t >:: V e c t o r ( c o n s t V e c t o r<O b j e c t>& r h s ) : t h e S i z e ( r h s . s i z e ( ) ) ,
theCapacity ( rhs . theCapacity )
{
o b j e c t s = new O b j e c t [ c a p a c i t y ( ) ] ;
f o r ( i n t k = 0 ; k < s i z e ( ) ; k++ )
objects [ k ] = rhs . objects [ k ] ;
}
t e m p l a t e <typename O b j e c t>
V e c t o r<O b j e c t >:: V e c t o r ( )
{ d e l e t e [ ] o b j e c t s ;}
t e m p l a t e <typename O b j e c t>
c o n s t V e c t o r<O b j e c t> & V e c t o r<O b j e c t >:: o p e r a t o r= ( c o n s t V e c t o r<O b j e c t>& r h s )
i f ( t h i s != &r h s )
{
delete [ ] objects ;
t h e S i z e=r h s . s i z e ( ) ;
t h e C a p a c i t y=r h s . c a p a c i t y ( ) ;
o b j e c t s=new O b j e c t [ c a p a c i t y ( ) ] ;
f o r ( i n t k =0; k<s i z e ( ) ; k++)
o b j e c t s [ k ]= r h s . o b j e c t s [ k ] ;
}
return this ;
}
Hikmat Farhat
Data Structures
March 7, 2013
11 / 39
Vector Implementation
t e m p l a t e <typename O b j e c t>
v o i d V e c t o r<O b j e c t >:: r e s i z e ( i n t n e w C a p a c i t y )
{
i f ( newCapacity < t h e S i z e )
return ;
Object oldArray = o b j e c t s ;
o b j e c t s = new O b j e c t [ n e w C a p a c i t y ] ;
f o r ( i n t k = 0 ; k < t h e S i z e ; k++ )
objects [ k ] = oldArray [ k ] ;
theCapacity = newCapacity ;
delete [ ] oldArray ;
}
t e m p l a t e <typename O b j e c t>
O b j e c t & V e c t o r<O b j e c t >:: o p e r a t o r [ ] (
{ return objects [ index ] ; }
int index )
t e m p l a t e <typename O b j e c t>
b o o l V e c t o r<O b j e c t >:: empty ( ) c o n s t
{ r e t u r n s i z e ( ) == 0 ; }
Hikmat Farhat
Data Structures
March 7, 2013
12 / 39
Hikmat Farhat
Data Structures
March 7, 2013
13 / 39
Hikmat Farhat
Data Structures
March 7, 2013
14 / 39
why a destructor?
Hikmat Farhat
Data Structures
March 7, 2013
15 / 39
Linked lists
Hikmat Farhat
Data Structures
March 7, 2013
16 / 39
Hikmat Farhat
Data Structures
March 7, 2013
17 / 39
Sentinel Node
For convenience, we use empty nodes, called sentinel, for head and
tail.
The first element in the list is the node just after the head.
The last element in the list is the node just before the tail.
Hikmat Farhat
Data Structures
March 7, 2013
18 / 39
Hikmat Farhat
Data Structures
March 7, 2013
19 / 39
Hikmat Farhat
Data Structures
March 7, 2013
20 / 39
Iterator Class
class iterator{
protected :
Node c u r r e n t ;
public :
i t e r a t o r (){}
i t e r a t o r ( Node p ) : c u r r e n t ( p){}
Object & o p e r a t o r ()
{ r e t u r n c u r r e n t >d a t a ; }
i t e r a t o r & o p e r a t o r ++(){
c u r r e n t=c u r r e n t >n e x t ;
return this ;
}
i t e r a t o r & o p e r a t o r ++( i n t i n ){
c u r r e n t=c u r r e n t >n e x t ;
return this ;
}
i t e r a t o r & o p e r a t o r (){
c u r r e n t=c u r r e n t >p r e v ;
return this ;
}
i t e r a t o r & o p e r a t o r (i n t i n ){
c u r r e n t=c u r r e n t >p r e v ;
return this ;
}
b o o l o p e r a t o r ==( c o n s t
i t e r a t o r & rhs ) const
{ r e t u r n c u r r e n t==r h s . c u r r e n t ; }
b o o l o p e r a t o r !=( c o n s t i t e r a t o r &r h s ) c o n s t
{ r e t u r n ! ( c u r r e n t==r h s . c u r r e n t ) ; }
f r i e n d c l a s s L i s t <O b j e c t >;
};
Hikmat Farhat
Data Structures
March 7, 2013
21 / 39
Empty list
Since we always have sentinel nodes an empty list has two nodes:
head and tail
Hikmat Farhat
Data Structures
March 7, 2013
22 / 39
In the code above, begin() should return the first element (i.e the one
after head)
Whereas end should return tail thus
iterator
return
}
iterator
return
}
Hikmat Farhat
begin (){
i t e r a t o r ( head>n e x t ) ;
end ( ) {
iterator ( tail );
Data Structures
March 7, 2013
23 / 39
Inserting a Node
Data Structures
March 7, 2013
24 / 39
Deleting a node
i t e r a t o r e r a s e ( i t e r a t o r i t r ){
Node p= i t r . c u r r e n t ;
i t e r a t o r r e t ( p>n e x t ) ;
p>p r e v >n e x t=p>n e x t ;
p>n e x t >p r e v=p>p r e v ;
delete p;
t h e S i z e ;
return ret ;
}
Hikmat Farhat
Data Structures
March 7, 2013
25 / 39
List Destructor
Hikmat Farhat
Data Structures
March 7, 2013
26 / 39
clear ();
d e l e t e head ;
delete t a i l ;
}
L i s t & o p e r a t o r =( L i s t &r h s )
{
pop front ();
}
Object & f r o n t ( )
void pop back ( )
{ e r a s e ( end ( ) ) ; }
Hikmat Farhat
Data Structures
March 7, 2013
27 / 39
Vector
I
I
Linked list
I
I
Hikmat Farhat
Data Structures
March 7, 2013
28 / 39
Stack ADT
Hikmat Farhat
Data Structures
March 7, 2013
29 / 39
Stack implementation
We can use linked list but since insertion and deletion is done only at
the top it is better to use an array
Since only the top of the stack is accessible, insertion and deletion is
done efficiently
We need the following operations top(),push(),pop()
The stack has :
I
I
I
capacity
top of stack
array of objects
Hikmat Farhat
Data Structures
March 7, 2013
30 / 39
Stack Implementation
t e m p l a t e <typename O b j e c t >
c l a s s Stack
{
private :
i n t topOfStack ;
int theCapacity ;
Object o b j e c t s ;
void r e s e r v e ( i n t newCapacity ) ;
public :
S t a c k ( i n t c a p a c i t y =0)
: theCapacity ( capacity ? capacity :16)
{ t o p O f S t a c k =1;
o b j e c t s=new O b j e c t [ t h e C a p a c i t y ] ;
}
Stack ( const Stack & rhs )
{ o p e r a t o r =( r h s ) ; }
Stack ( )
{ delete [ ] objects ;}
Hikmat Farhat
Data Structures
March 7, 2013
31 / 39
Stack Implementation
c o n s t S t a c k & o p e r a t o r= ( c o n s t S t a c k & r h s ) ;
int s i z e ( ) const {
r e t u r n t o p O f S t a c k +1;
}
v o i d push ( c o n s t O b j e c t & x ) {
i f ( t o p O f S t a c k== t h e C a p a c i t y 1 )
reserve ( 2 theCapacity + 1 );
o b j e c t s [++ t o p O f S t a c k ]= x ;
}
v o i d pop ( ) {
// c h e c k f o r e r r o r
t o p O f S t a c k ;
}
Object top (){
r e t u r n o b j e c t s [ topOfStack ] ;
}
};
Hikmat Farhat
Data Structures
March 7, 2013
32 / 39
Assignment Operator
t e m p l a t e <typename O b j e c t >
c o n s t Stack <O b j e c t > & Stack <O b j e c t > : : o p e r a t o r= ( c o n s t Stack
{
i f ( t h i s != &r h s )
{
delete [ ] objects ;
t o p O f S t a c k = r h s . s i z e ( ) 1;
theCapacity = rhs . theCapacity ;
o b j e c t s = new O b j e c t [ t h e C a p a c i t y ] ;
f o r ( i n t k = 0 ; k < s i z e ( ) ; k++ )
objects [ k ] = rhs . objects [ k ] ;
}
return this ;
}
Hikmat Farhat
Data Structures
March 7, 2013
33 / 39
Overflow
t e m p l a t e <typename O b j e c t >
v o i d Stack <O b j e c t > : : r e s e r v e ( i n t n e w C a p a c i t y )
{
i f ( n e w C a p a c i t y < t o p O f S t a c k+1 )
return ;
Object oldArray = o b j e c t s ;
o b j e c t s = new O b j e c t [ n e w C a p a c i t y ] ;
f o r ( i n t k = 0 ; k < t o p O f S t a c k +1; k++ )
objects [ k ] = oldArray [ k ] ;
theCapacity = newCapacity ;
delete [ ] oldArray ;
}
Hikmat Farhat
Data Structures
March 7, 2013
34 / 39
Hikmat Farhat
Data Structures
March 7, 2013
35 / 39
2
3
the appropriate number of arguments (usually two) are poped from the
stack.
the operator is applied to the arguments
The results is pushed back onto the stack.
Example, evaluate 6 5 2 3 + 8 * + 3 + *
Hikmat Farhat
Data Structures
March 7, 2013
36 / 39
Queue ADT
Hikmat Farhat
Data Structures
March 7, 2013
37 / 39
Hikmat Farhat
Data Structures
March 7, 2013
38 / 39
front
Initially
After enqueue(7)
12
back
12
After dequeue()
Hikmat Farhat
back
front
back
After enqueue(12)
front
5
back
Data Structures
front
March 7, 2013
39 / 39