ch05 ADTarray en
ch05 ADTarray en
Data Structures
1
Outline
Introduction
ADT Examples
Operations on Arrays
Implementation of Arrays
Sorted Array
Unsorted Array
Application: array of structures
2
INTRODUCTION AND ADT EXAMPLES
3
Introduction
Data abstraction:
is the description of the functional qualities independently
from the implementation
hides details
ADT (Abstract Data Type) : model real word objects
e.g., int, float, etc are predefined number models
new data types can be created
ADT is constituted by
the representation of the data
the operations on the data
Separate the user interface from the implementation
4
Introduction
Three steps for a good ADT creation
understand a problem
define the interface: the data and functions on these data
• representations, caracteristics, properties, operations
implement interfaces
• interior behavior of the functions, algorithmic and coding
Motivation
Facilitate the management of large software
Flexibility and reutilization of ADT
We can implement the interfaces
• with different languages
• with different manners (e.g., to accelerate the execution time)
5
ADT Example: Queue
Example: wait its turn in a line
Data type: a list
store in a FIFO (First In , First Out)
Operations:
Enqueue: add to the queue (to the last position)
Dequeue: remove from the head of the queue
A user
manipulates his data by doing an enqueue and dequeue
operations only
A programmer
implements and access data freely
6
ADT Example: Stack
Example, a stack of plates
store in a LIFO (Last-in, first-out )
Operations:
Push: add an element
Pop: remove an element
A user
manipulates a stack by using the operations push and
pop
• does not interest in the implementation of the operations
A programmer
implements and access data freely
7
ADT Example: Array
Data type: a general list
Operations
Insert
Remove
Search
Sort
…
This is the subject of this chapter
8
ADT Example: String
String of characters in C++
we don’t have a predefined data type for the string of
characters
a new ADT has been defined: string class
Facilitate the manipulation of strings. This is an example
#include<iostream>
#include <string>
using namespace std;
int main(){
string fname, lname, name;
cout<<"lire un nom\n";
cin>>fname>>lname;
cout<<"size fname: "<<fname.length()<<endl;
cout<<"size lname: "<<lname.length()<<endl;
name=fname+" "+lname;
cout<<"Full name "<<name<<endl;
return 0;
9
}
ADT Example: Time
Data type:
time (hours, minutes, seconds)
Domaine:
verify the time constraints (24h, 60min, 60sec)
Operations:
Insert the actual time
Increase the time, second by second
Display the time
Compare two times (before, after or equal)
10
OPERATIONS ON ARRAYS
11
Operations on the array ADT
An array is also called a list
We consider two types of arrays
1. Unsorted array
2. Sorted array
The main operations (or functions) to do in an array are:
1- Initialization 4- Modification
2- Insertion 5- Removal
3- Searching 6- Display
13
Declarations, initializations and basic
tests
#define MAX 100
struct ARRAY{ The structure ARRAY contains:
int a[MAX]; a[]: array containing the data
int nbele; nbele: the current elements
}; number in the array
void Initialize(ARRAY *t){ Each array starts empty initially
t->nbele=0; It is necessary to test:
} if the array is empty when we try
bool IsEmpty(ARRAY *t){ to remove an element
return (t->nbele==0); if the array is full when we try to
} add an element
bool IsFull(ARRAY *t){
return (t->nbele==MAX);
}
Initialization: nbele=0; array is empty
Remark: to create the array ADT in the main 0 1 2 3 4 … 98 99
function, it is sufficient to do: ARRAY A; or …
ARRAY *pA=new ARRAY; then call the function Initialize(pA) 14
Searching functions
bool IsInArray(ARRAY *t, int val){ Here, we have two
for(int i=0; i<t->nbele; i++) sequential
if(t->a[i]==val)
return true;
searching functions
return false; One of them
} verifies the
int FindElement(ARRAY *t, int val){ existence of a value
for(int i=0; i<t->nbele; i++)
if(t->a[i]==val)
The other returns
return i; the index of the 1st
return -1; value occurrence, if
} it is found
int GetElementNb(ARRAY *t){
return t->nbele;
}
0 1 2 3 4 … 98 99
GetElement returns the effective
elements number. Here, nbele=4 9 11 4 8 …
15
Displaying function
void PrintArray(ARRAY *t){
if(IsEmpty(t)){
cout<<"The array is empty"<<endl;
}
for(int i=0; i<t->nbele; i++)
cout<< t->a[i] << " / ";
cout<<endl;
}
17
Insertion functions (cont.)
bool InsertAtPosition(ARRAY *t, int val, int pos){
if(IsFull(t))
return false;
if(pos<0 || pos>=t->nbele)
return false;
for(int i=t->nbele; i>pos; i--)
t->a[i]=t->a[i-1]; //shifting
t->a[pos]=val; //insert at position
t->nbele++;
return true;
}
Insert the value 5 at the position (with index) 2
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
9 11 4 8 9 11 4 8 9 11 5 4 8
18
Deleting Functions
bool DeleteElement(ARRAY *t, int val){
if(IsEmpty(t))
return false;
for(int i=0;i<t->nbele; i++)
if(t->a[i]==val){//Find the position of val
for(int j=i; j<t->nbele-1; j++)
t->a[j]=t->a[j+1]; //shifting+deleting
t->nbele--; //decrease nbele
return true;
}
return false;
}
Remove the value 11. Firstly, find the position 11 that is 1, then shift
until 1 by crushing 11
0 1 2 3 4 0 1 2 3 4
9 11 4 8 9 4 8
19
Deleting Functions (cont.)
bool DeleteAtPosition(ARRAY *t, int pos){
if(IsEmpty(t))
return false;
if(pos<0 || pos>=t->nbele)
return false;
for (int i=pos; i<t->nbele-1; i++)
t->a[i]=t->a[i+1];
t->nbele--;
return true;
}
bool DeleteAllElement(ARRAY *t){//sufficient to put nbele=0
t->nbele=0; //next insertion will start at pos=0,
} //this will overwrite the existing elements
DeleteAtPosition(t,1): the position is already given:
pos=1, then shift until 1 by crushing pos=1
0 1 2 3 4 0 1 2 3 4
9 11 4 8 9 4 8
20
Modification functions
bool ModifyElement(ARRAY *t, int oldval, int newval){
int i=0;
if(IsEmpty(t))
return false;
for(int i=0; i<t->nbele; i++)
if(t->a[i]==oldval){//Find old value
t->a[i]=newval; //replace it
return true;
}
return false;
}
Find the old value, then replace it by the new one, otherwise
returns false. Here, we modify 4 by 20.
0 1 2 3 4 0 1 2 3 4
9 11 4 8 9 11 20 8
21
Modification functions (cont.)
0 1 2 3 4 0 1 2 3 4
9 11 4 8 9 11 20 8
22
IMPLEMENTATION: SORTED ARRAY
23
Sorted array
• Consider that the array is sorted in ascending order.
• What are the changes to do to the previous functions?
Structure declaration • The following function should
does not change be implemented differently
Non modified functions: – ModifyElement
Initialize • A new function should be added
DeleteAllElement – InsertElement
DeleteElement • The following functions should
not be included
DeleteAtPosition
– ModifyAtPosition
IsEmpty et IsFull
– InsertAtHead
IsInArray et FindElement
– InsertAtQueue
GetElementNb
– InsertAtPosition
PrintArray
24
Insertion Function
bool InsertElement(ARRAY *t, int val){
int pos;
if(IsFull(t))
return false;
//Find position
for(pos=0; pos<t->nbele; pos++)
if(t->a[pos] > val) Find the good
break;
//shifting
insertion position to
for(int i=t->nbele; i>pos; i--)
maintain the array
t->a[i]=t->a[i-1]; sorted
//insertion Shift the elements
t->a[pos]=val; stating from this
t->nbele++; position
return true;
} Insert element
25
Insertion Function (cont.)
bool ModifyElement(ARRAY *t, int oldval, int newval){
int i=0, pos;
if(IsEmpty(t))
return false;
pos=FindElement(t,oldval);
if(pos==-1)
return false;
DeleteAtPosition(t,pos);
return InsertElement(t,newval);
}
26
APPLICATION: ARRAY OF
STRUCTURES
27
An array containing an array of
structures
The same operations seen previously can be
applied to this case
The difference is that the stored data are
somehow complex
all the instructions related to data are modified
But, the same form of the algorithms remains
unchanged
28
Declaration
#define stdMAX 80
#define MAX 100
The structure
struct STUDENT{ ARRAY contains
char fname[stdMAX];
char lname[stdMAX];
now an array of
int id; structures STUDENT
float; GPA;
} STUDENT contains
struct ARRAY{ the information of a
STUDENT a[MAX];
int nbele; student
};
0 1 2 3 … 98 99
0 1 2 3 … 98 99
nbele=3
30
//We consider a sorted array according to id
bool InsertStudent(ARRAY *t, const STUDENT *std){
int pos;
if(IsFull(t)) Insertion function
return false;
//find position
for(pos=0; pos<t->nbele; pos++)
if(t->a[pos].id > std->id)
break;
//shifting
for(int i=t->nbele; i>pos; i--){
strcpy(t->a[i].fname,t->a[i-1].fname);
strcpy(t->a[i].lname,t->a[i-1].lname);
t->a[i].id=t->a[i-1].id;
t->a[i].GPA=t->a[i-1].GPA; Attention: copying
} string of characters
//Insert at position is done with strcpy
strcpy(t->a[pos].fname,std->fname);
strcpy(t->a[pos].lname,std->lname);
t->a[pos].id=std->id;
t->a[pos].GPA=std->GPA;
t->nbele++;
return true;
} 31