Anda di halaman 1dari 17

Pertemuan 14

Pemrograman Procedural
Struktur Data Dinamik
Bagian 1
1
Definisi Struktur Data Dinamik
Adalah struktur data yang berkembang dan
berkurang sesuai dengan eksekusi program
Memori yang digunakan untuk struktur data ini
dapat berubah-ubah sesuai dengan yang dapat berubah-ubah sesuai dengan yang
diperlukan
2
Pointer
Pointer tidak menampung data
Pointer menampung alamat dari sel memori lain
yang menampung nilai data yang dituju
3
nump
num
400
3
nump
num
122
400
3
Reference Ket Nilai
num Menunjuk nilai num 3
nump Menunjuk nilai nump Pointer ke lokasi yang
bernilai 3 (berisi alamat
yang ditunjuk)
*nump Nilai tidak langsung dari nump 3
3
num
400
3
Pointer Sebagai Parameter Output
Dengan cara mengoper alamat dari satu variabel ke
sebuah fungsi, kita memberi fungsi tersebut cara untuk
menyimpan hasil dari fungsi ke variabel yang dituju
Contoh : #include <stdio.h>
void long_division(int dividend, int divisor, int
*quotientp, int *remainderp);
int main(void)
{{
int quot, rem;
long_division(40, 3, &quot, &rem);
printf(40 divided by 3 yields quotient %d, quot);
printf(and remainder %d\n, rem);
return(0);
}
void long_division(int dividend, int divisor, int
*quotientp, int *remainderp)
{
*quotientp = dividend/divisor;
*remainderp = dividend%divisor;
}
4
Pointer yang menggambarkan
Array dan String
Pointer dapat digunakan untuk
mendeklarasikan array maupun string
Contoh :
Char n[] sama dengan char *n Char n[] sama dengan char *n
5
Alokasi Memori Dinamis
Pada pendeklarasian seperti :
Int *nump;
Char *letp;
Planet_t *planet; Planet_t *planet;
Jika nump, letp dan planet adalah variabel
lokal maka memori akan dialokasikan
ketika blok fungsi dimasukkan
6
Fungsi malloc
Fungsi memori allocation malloc digunakan
untuk menempatkan variabel, integer, char dan
struktur secara dinamis
Fungsi malloc terletak pada librari stdlib
Syntax : malloc (sizeof (data_type)) Syntax : malloc (sizeof (data_type))
contoh : malloc (sizeof (int))
Operator sizeof pada tipe data digunakan untuk
mengalokasikan secara tepat jumlah ruangan
memori yang digunakan untuk menyimpan satu
tipe data (mis: int) pada blok dinamis
7
Contoh Penggunaan malloc
nump = (int *)malloc(sizeof(int));
letp = (char *)malloc(sizeof(char));
planetp=(planet_t *)malloc(sizeof(planet_t));
Ruang memori yang belum terpakai (memori bebas)
sebagai pengalokasian suatu informasi/data
secara dinamis disebut dengan heap secara dinamis disebut dengan heap
Function data area
Nump
Letp
Planetp
Heap
?
?
?
?
?
?
?
Penggambaran alokasi memori
Dinamik pada variabel integer,
Char, 5 komponen struktur
planet_t
8
Nilai akan disimpan pada memori yang baru ditempatkan
menggunakan operator tidak langsung (*). Contoh pernyataan :
*nump = 307;
*letp = Q;
*planetp = blank_planet;
Sedangkan untuk deklarasi dari blank_planet:
planet_t blank_planet = { , 0, 0, 0, 0};
Contoh pengisian data
Function data area
Nump
Letp
Planetp
Heap
307
Q
\0
0.0
0
0.0
0.0
9
Mengakses Komponen Struktur Alokasi secara
Dinamis
Pada bab sebelumnya komponen dari suatu struktur
diakses melalui pointer dapat di referensi
menggunakan operator kombinasi tidak langsung (*)
dan operator seleksi kombinasi langsung (.) .Sehingga
menggunakan operator kombinasi tidak langsung (*)
dan operator seleksi kombinasi langsung (.) .Sehingga
dua contoh ini sama.
(*structp).component structp-
>component
10
Alokasi Array Dinamis dengan calloc
Untuk membuat sebuah elemen array yang didefinisikan oleh
user, maka digunakan fungsi dari stdlib yaitu calloc.
Fungsi calloc mengambil dua argumen : banyaknya elemen
array yang dibutuhkan dan ukuran dari elemen. Fungsi
calloc menginisialisasi elemen array sebesar 0.
Contoh : Contoh :
Pada program di bawah ini mengalokasi dan mengisi tiga array
(array dari karakter yang diakses dengan string1, array dari
integer yang diakses dengan array_of_nums,dan array
dari planet yang diakses dengan array_of_planets.
11
#include<stdlib.h> //untuk mengakses calloc
int scan_planet(planet_t *plnp);
int main(void)
{
char *string1;
int *array_of_nums;
planet_t *array_of_planets;
int str_str_siz, num_nums, num_planets, i;
printf(Enter string length and string> );
scanf(%d,&str_siz);
string1=(char *)calloc(str_siz, sizeof(char));
scanf(%s,string1);
printf(\nHow many numbers?> );
scanf(%d,&num_nums); scanf(%d,&num_nums);
array_of_nums = (int *)calloc(num_nums, sizeof(int));
array_of_nums[0] = 5;
for (i=1; i<num_nums;++i)
array_of_nums[i] = array_of_nums[i-1]*i;
printf(\nnEnter number of planets and planet data> );
scanf(%d,&num_planets);
array_of_planets=(planet_t*)calloc(num_planets,sizeof(planet
_t));
for(i=0;i<num_planets;++i)
scan_planet(&array_of_planets[i]);
. . .
}
12
Contoh eksekusi
Enter string length and string> 9 enermous
How many numbers?> 4
Enter of planets and planet data> 2
Earth 12713.5 1 1.0 24.0
Jupiter 132800.0 4 11.9 9.925
Function data area
String1
Array_of_nums
Heap
E N O
U
R M O S
\0
5
Array_of_planets
5
10
30
Earth \0
1.27135e+ 4
1
1.0
24.0
Jupiter \0
10428e+ 5
16
11.9
9.925
13
Mengembalikan Sel ke Heap
Kebalikan dari fungsi malloc() yaitu free().
Kegunaannya untuk membebaskan ruang memori yang
ditunjuk oleh pointer argumennya. Setelah suatu ruang memori
dibebaskan, memori bisa dipakai lagi untuk alokasi variabel
dinamis lainnya.
Contoh : Contoh :
free(letp);
Contoh pengalokasian, pengaksesan terhadap variabel dinamis
dan pembebasan kembali ruang dalam heap ditunjukkan pada
program berikut :
14
#include<stdio.h>
#include<stdlib.h>
main()
{
char *ptr;
ptr=(char *)malloc(500*sizeof(char));
if(!ptr)
puts(Memori tak cukup);
else
{
puts(Pengalokasian sudah dilakukan.); puts(Pengalokasian sudah dilakukan.);
free(ptr); //bebaskan kembali memori yang ditunjuk
ptr
puts(Blok memori telah dibebaskan.);
}
}
15
Contoh eksekusi
Pengalokasian sudah dilakukan.
Blok memori telah dibebaskan.
16
Referensi
Bab 14, Dynamic Data Structures,
Problem Solving and Program Design in
C, Jeri R. Hanly dan Elliot B. Koffman,
Addison Wesley, 2002 Addison Wesley, 2002
17

Anda mungkin juga menyukai