03_linkedList
03_linkedList
Data Structure:
List
L i s t A D T: s p e c i f i c a t i o n
List L 34 12 52 16 12
L i s t A D T: simple implementation with array
List L 34 12 52 16 12
34 12 52 16 12
insert X
34 12 52 X 16 12
L i s t A D T: simple implementation with array
A1 A2 A3 A4 A5
L i s t A D T: linked list
A1
1000
A1 0
L i s t A D T: linked list
A1 A2
1000 800
A1 800 A2 0
L i s t A D T: linked list
A1 A2 A3
A1 A2 A3 A4
A1 A2 A3 A4 A5
A1 A2 A3 A4 A5
10 20
L i s t A D T: representation of linked list
A1 A2 A3 A4 A5
A1 A2 A3 A4 A5
L p
A1 A2 A3 A4 A5
L p
A1 A2 A3 A4 A5
p
L
X
L i s t A D T: deletion
A1 A2 A3 A4 A5
p
L
Delete(A3, L)
A1 A2 A3 A4 A5
L p
A1 A2 A4 A5
L
l i s t A D T: type declaration for a linked list
List MakeEmpty();
int IsEmpty( List L );
int IsLast( Position P, List L );
Position Find( ElementType X, List L );
Position FindPrevious ( ElementType X, List L );
void Delete( ElementType X, List L );
void Insert ( ElementType X, List L, Position P );
void DeleteList ( List L );
l i s t A D T: M a ke E m p t y
header
L
l i s t A D T: I s E m p t y
header true →1
false →0
header 6
L
l i s t A D T: I s E m p t y
header true
false
header 6
L
l i s t A D T: I s L a s t
header 6 true
L
p
header 6 7 false
L p
l i s t A D T: I s L a s t
header 6 true
L
p
header 6 7 false
L p
l i s t A D T: F i n d
/* return position of X in L; NULL if not found */
header A1 X A2 A3
L
l i s t A D T: F i n d
/* return position of X in L; NULL if not found */
return P;
}
header A1 X A2 A3
L p
l i s t A D T: F i n d
/* return position of X in L; NULL if not found */
return P;
}
header A1 X A2 A3
L p p
l i s t A D T: F i n d
/* return position of X in L; NULL if not found */
return P;
}
Stop condition
header header A1 A2
L p L p
header A1 X A2 A3
L p
l i s t A D T: F i n d P rev i o u s
Stop condition
header header A1 A2
L L P
P
l i s t A D T: F i n d P rev i o u s
header A1 A2 X A3
L P
header A1 A2 X A3
L P
L i s t A D T: I n s e r t
A1 A2 A3 A4 A5
L P
L i s t A D T: I n s e r t
TmpCell->Element = X;
A1 A2 A3 A4 A5
L P
X
TmpCell
L i s t A D T: I n s e r t
TmpCell->Element = X;
TmpCell->Next = P->Next;
A1 A2 A3 A4 A5
L P
X
TmpCell
L i s t A D T: I n s e r t
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
A1 A2 A3 A4 A5
L P
X
TmpCell
l i s t A D T: D e l e t e
header A1 A2 X A3
L
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
header A1 A2 X A3
L P
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
if ( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
}
}
header A1 A2 X A3
L P
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
if ( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = P->Next;
}
}
header A1 A2 X A3
L P
TmpCell
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
if ( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = P->Next;
P->Next = TmpCell->Next; /* Bypass deleted cell */
}
}
header A1 A2 X A3
L P
TmpCell
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
if ( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = P->Next;
P->Next = TmpCell->Next; /* Bypass deleted cell */
free( TmpCell );
}
}
header A1 A2 A3
L P
TmpCell
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
if ( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = P->Next;
P->Next = TmpCell->Next; /* Bypass deleted cell */
free( TmpCell );
}
}
header A1 A2 X ???
L P
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
if ( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = P->Next;
P->Next = TmpCell->Next; /* Bypass deleted cell */
free( TmpCell );
}
}
header A1 A2 X
L P
TmpCell
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
if ( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = P->Next;
P->Next = TmpCell->Next; /* Bypass deleted cell */
free( TmpCell );
}
}
Stop condition
header header A1 A2
L L P
P
l i s t A D T: D e l e t e
P = FindPrevious( X, L );
if ( !IsLast( P, L ) ) /* Assumption of header use */
{ /* X is found; delete it */
TmpCell = P->Next;
P->Next = TmpCell->Next; /* Bypass deleted cell */
free( TmpCell );
}
}
header A1 A2
L P
l i s t A D T: D e l e t e L i s t
header A1 A2 X A3
L
l i s t A D T: D e l e t e L i s t
header A1 A2 X A3
L
l i s t A D T: D e l e t e L i s t
header A1 A2 X A3
L P
l i s t A D T: D e l e t e L i s t
header A2 X A3
L P
l i s t A D T: D e l e t e L i s t
void DeleteList( List L ) void DeleteList( List L )
{ {
Position P; Position P, Tmp;
header A1 A2 X A3
L P
header A1 A2 X A3
L P Tmp
header A2 X A3
L P
Review
l i s t A D T: F i n d P rev i o u s
header
header A1 A2 X A3
L P
Doubly Linked List
struct Node
{
ElementType Element;
Position Next;
Position Prev;
};
FindPrevious() in singly linked list is not necessary in the doubly linked list
L
Doubly Linked List: inser t
Doubly Linked List: inser t
P
x
TmpCell
TmpCell->Element = X;
}
Doubly Linked List: inser t
P
x
TmpCell
TmpCell->Element = X;
TmpCell->Next = P->Next;
TmpCell->Next->Prev = TmpCell;
}
Doubly Linked List: inser t
P
x
TmpCell
TmpCell->Element = X;
TmpCell->Next = P->Next;
TmpCell->Next->Prev = TmpCell;
}
Doubly Linked List: inser t
P
x
TmpCell
P
x
TmpCell
void Insert( ElementType X, List L, Position P ) struct Node
{ {
Position TmpCell; ElementType Element;
Position Next;
TmpCell = malloc( sizeof( struct Node ) ); Position Prev;
if ( TmpCell == NULL ) };
FatalError( “Out of space!!!” );
TmpCell->Element = X;
TmpCell->Next = P->Next;
TmpCell->Next->Prev = TmpCell;
P->Next = TmpCell;
TmpCell->Prev = P
}
Doubly Linked List: delete
Doubly Linked List: delete
p
P->Previous P->Next
P->Prev->Next = P->Next;
}
Doubly Linked List: delete
p
P->Previous P->Next
P->Prev->Next = P->Next;
P->Next->Prev = P->prev;
}
Doubly Linked List: delete
P->Prev->Next = P->Next;
P->Next->Prev = P->prev;
free(P);
}
Circularly Linked List