modul-praktikum-struktur-data-genap

advertisement
Modul 1
Array / Larik
A. Tujuan :
 Mahasiswa dapat mendefinisikan array
 Mahasiswa dapat memahami konsep array 1 dimensi, 2 dimensi dan banyak
dimensi
 Mahasiswa dapat menggunakan operasi pada array
 Mahasiswa dapat menerapkan konsep array pada studi kasus tertentu
B. Dasar Teori
Array merupakan struktur data statik yang menyimpan sekumpulan elemen(data) dengan
tipe data yang sama. Setiap elemen array dapat diakses langsung melaui indek array. Indek
tersebut memiliki tipe data yang menyatakan keterurutan misalnya integer atau karakter.
Operasi yang dimiliki oleh array adalah :
 Operasi untuk menyimpan (Store) nilai
 Operasi untuk mengambil (Retrieve) nilai
Definisi array
1. Sebagai Peubah
Contoh :
Arr : array[1..25] of integer
NamaMhs : array[‘a’..’j’] of string
2. Sebagai tipe baru
Contoh :
type Arrint : array[1..25] of integer
P : Arrint
3. Mendefinisikan ukuran maksimum elemen larik sebagai konstanta
Contoh :
Const Nmaks = 10
type Larikint : array[1..Nmaks] of integer
P : LarikInt
Cara menterjemahkan ke bahasa C :
#define Nmaks 10
typedef int Larikint[Nmaks+1];
Larikint P;
Mengisi elemen array (Operasi Store)
data[1]='A';
data[2]='B';
data[3]='C';
Menampilkan data pada array (Operasi Retrieve)
printf("%c \n",data[1]);
printf("%c \n",data[2]);
printf("%c \n",data[3]);
C. Praktikum
1. Array 1 dimensi
#include <stdio.h>
void main()
{
char data[3];
/* Mengisi elemen array */
data[1]='A';
data[2]='B';
data[3]='C';
/*Menampilkan data dari array */
printf("%c \n",data[1]);
printf("%c \n",data[2]);
printf("%c \n",data[3]);
}
#include <stdio.h>
#include <conio.h>
void main()
{
int nilai[5],x;
printf("Masukkan nilai :\n");
for (x=0;x<5;x++)
{
printf("Nilai Angka : ");
scanf("%d",&nilai[x]);
}
printf("\n");
printf("Membaca nilai :\n");
for (x=0;x<5;x++)
{
printf("Nilai Angka : %d \n",nilai[x]);
}
getch();
}
#include <stdio.h>
#include <conio.h>
int main()
{ int bil[7] = {0};
for (int i=0;i<7;i++)
{
printf("Elemen ke-%i= %d\talamat:
%x\n",i,bil[i],&bil[i]);
}
getch();
return 0;
}
void main()
{
int nilai[10],x,jml,min,max;
float avg,total;
printf("Masukkan Bilangan : ");
scanf("%d",&jml);
#include <stdio.h>for (x=0;x<jml;x++)
#include <conio.h>
{
printf("Bilangan ke %d : ",x+1);
scanf("%d",&nilai[x]);
}
printf("\n");
total = 0;max=0;
for (x=0;x<jml;x++)
{
total = total + nilai[x];
if (min < nilai[x]) min = min;
else
min = nilai[x];
if (max > nilai[x]) max = max;
else
max = nilai[x];
}
avg = total/jml;
printf("Min : %d \n",min);
printf("Max : %d \n",max);
printf("Total : %f \n",total);
printf("Rata-rata : %f \n",avg);
getch();
}
2. Array 2 dimensi
#include <stdio.h>
void main()
{
int arr [2][2]; /* Deklarasi array 2 dimensi */
/* inisialisasi */
arr[0][0] = 5; arr[0][1] = 2;
arr[1][0] = 3; arr[1][1] = 9;
printf("%d \n",arr[0][0]);
printf("%d \n",arr[0][1]);
printf("%d \n",arr[1][0]);
printf("%d \n",arr[1][1]);
}
#include <iostream.h>
#include <conio.h>
main()
{
int baris, kolom;
int n, m,matriksA[15][15],matriksB[15][15],hasil[15][15];
clrscr();
cout << "Silahkan masukkan ordo matrik A dan B (maks 15)
\n";
cout << "Ordo baris matrik A dan B = ";
cin >> n;
cout << "Ordo kolom matrik A dan B = ";
cin >> m;
cout << "\n";
cout << "Input elemen Array : \n";
for(baris=0; baris<n; baris++)
{
for(kolom=0; kolom<m; kolom++)
{
cout << "matriksA["<<(baris+1)<<"]["<<(kolom+1)<<"] = ";
cin >> matriksA[baris][kolom];
}
}
cout << "\n";
/* Matrik B*/
cout << "Input elemen Array : \n";
for(baris=0; baris<n; baris++)
{
for(kolom=0; kolom<m; kolom++)
{
cout << "matriksB["<<(baris+1)<<"]["<<(kolom+1)<<"] = ";
cin >> matriksB[baris][kolom];
}
}
/* menampilkan data pada array untuk matrik A*/
cout << "\n";
cout << "
Matrik A : \n";
for(baris=0; baris<n; baris++)
{
for(kolom=0; kolom<m; kolom++)
cout << "
" << matriksA[baris][kolom];
cout << "\n";
}
/* menampilkan data pada array untuk matrik B*/
cout << "
Matrik B : \n";
for(baris=0; baris<n; baris++)
{
for(kolom=0; kolom<m; kolom++)
cout << "
" << matriksB[baris][kolom];
cout << "\n";
}
cout << "Penjumlahan Matrik A dan B adalah :: \n";
for(baris=0; baris<n; baris++)
{
for(kolom=0; kolom<m; kolom++)
{
hasil[baris][kolom]=matriksA[baris][kolom] +
matriksB[baris][kolom];
cout << "
" << hasil[baris][kolom];
}
cout << "\n";
}
cout << "Pengurangan Matrik A dan B adalah :: \n";
for(baris=0; baris<n; baris++)
{
for(kolom=0; kolom<m; kolom++)
{
hasil[baris][kolom]=matriksA[baris][kolom] matriksB[baris][kolom];
cout << "
" << hasil[baris][kolom];
}
cout << "\n";
}
}
Kerjakan dan jelaskan progam-program diatas
D. Tugas Pendahuluan
1. Jelaskan definisi penulisan array 1 dimensi, 2 dimensi dan banyak dimensi
2. Buatlah program untuk memberikan nilai awal/inisialisasi untuk data ipk
mahasiswa(min 10 mahasiswa). Contoh :
float ipk[5] = {3.0,3.67,1.34,2.34,3.24};
kemudian tampilkan data tersebut (gunakan loop for dan while)
E. Tugas Praktikum :
1. Buatlah program untuk melakukan penjumlahan dua buah bilangan yang melebihi
satu triliun.
Contoh :
Bilangan pertama = 100022233344455566677888999
Bilangan kedua = 2000111222333444555666777888999
Hasil = 2001111444666889111333555777998
2. Setiap bulan di perumahan Permata selalu dilakukan penimbangan Balita. Data
berat badan setiap Balita disimpan pada buku monitoring berat badan Balita.
Berikut adalah contoh data berat badan tersebut.
Bulan Lalu
Bulan Sekarang
Keterangan
Fidela
10
10,2
Naik 0,2
Lavina
6,4
7
Naik 0.6
Nadifa
15
14,8
Turun 0.2
Fatan
11
11,3
Naik 0.3
Aji
8,6
8,6
Tetap
….
…
…
…
Anda diminta membuat program untuk mengetahui kenaikan atau penurunan
berat badan setiap Balita antara penimbangan bulan sebelumnya dengan bulan
sekarang. Input program berupa data nama balita dan data berat badan Balita.
input data dijamin tidak lebih dari 1000 balita. Output berupa keterangan naik,
turun,
Tetap
dan
nilai
penambahan
atau
penurunannya.
Contoh masukan :
Fidela
10
10,2
Lavina
6,4
7
Nadifa
15
14,8
Fatan
11
11,3
Aji
8,6
9
Contoh Keluaran :
Fidela
Lavina
Nadifa
Fatan
Aji
Bulan lalu
10
6,4
15
11
8,6
Bulan Sekarang Ket
10,2
Naik 0,2
7
Naik 0,6
14,8
Turun 0,2
11,3
Naik 0,3
8,6
Tetap
Modul 2
Record /Rekaman
A. Tujuan :
Mahasiswa dapat mendefinisikan record
Mahasiswa dapat mengakses elemen record
Mahasiswa dapat menerapkan record pada suatu studi kasus tertentu.
B. Dasar Teori
RECORDS digunakan untuk menyimpan element dengan tipe data yang berbeda-beda.
Sebagai contoh terdapat record seperti berikut :
PNS
Mr. Bagus
Jl Bayangkari 1
12/2/1966
Rp. 5.000.000
Fields
JIka kita perhatikan record diatas terdiri dari fields Status Kepegawaian, Nama, Alamat,
Tanggal Lahir dan Gaji. Setiap fields tersebut mempunyai tipe data yang
berbeda.Misalkan field Nama bertipe data char dan gaji bertipe data real.
Pada Bahasa C++ Record disebut Struct. Fields disebut member.
Deklarasi Struct
Deklarasi 1
struct nama_struct {
tipe_data_1
tipe_data_2
tipe_data_3
……
};
Contoh :
struct pegawai {
char status[10];
char nama[30];
char alamat[40];
char tgl_lahir[10];
float gaji;
};
nama_var_1;
nama_var_2;
nama_var_3;
Deklarasi 2, Menggunakan kata tercadang typedef
typedef struct Mahasiswa {
char NIM[8];
char nama[50];
float ipk;
};
Untuk menggunakan struct Mahasiswa dengan membuat
variabel mhs1 dan mhs2
Mahasiswa mh1s,mhs2;
Untuk menggunakan struct Mahasiswa dengan membuat variabel
array mhs;
Mahasiswa mhs[100];
//Pendeklarasian tipe data baru struct
Mahasiswa
typedef struct Mahasiswa{
char NIM[9];
char nama[30];
float ipk;
};
void main(){
//Buat variabel mhs bertipe data Mahasiswa
Mahasiswa mhs[100];
………………
}
Mengakses Komponen Record
Gunakan nama record
nama member
yang dipisah dot
Contoh :
Pegawai.nama;
Mhs[i].NIM;
C. Praktikum
1. Entri data NIM dan Nama Mahasiswa
#include <stdio.h>
#include <conio.h>
//Pendeklarasian tipe data baru struct Mahasiswa
typedef struct Mahasiswa{
char NIM[9];
char nama[30];
float ipk;
};
void main(){
//Buat variabel mhs bertipe data Mahasiswa
Mahasiswa mhs[2];
int i;
clrscr();
for (i=0;i<2;i++)
{
printf("NIM = ");scanf("%s",mhs[i].NIM);
printf("Nama = ");scanf("%s",mhs[i].nama);
printf("IPK = ");scanf("%f",&mhs[i].ipk);
}
for (i=0;i<2;i++)
{
printf("Data Anda : \n");
printf("NIM : %s\n",mhs[i].NIM);
printf("Nama : %s\n",mhs[i].nama);
printf("IPK : %f\n",mhs[i].ipk);
}
getch();
}
Kerjakan dan jelaskan progam-program diatas
D. Tugas Pendahuluan
1. Jelaskan definisi penulisan record pada bahasa C++
2. Berikan penjelasan mengenai definisi dan deklarasi Nested Struct, Struct of array
dan array of struct.
E. Tugas Praktikum
1. Fakultas Teknik informatika membutuhkan suatu aplikasi untuk mencatat data
karyawan yang berada dilingkungannya. Adapun fields yang perlu disimpan adalah
NIP, Nama, alamat, tgl lahir, agama, telepon dan kepangkatan. Input data karyawan
dipastikan tidak lebih dari 500 karyawan. Buatlah program yang dapat menyimpan
data tersebut dan menampilkannya kembali.
Modul 3
Fungsi
A. Tujuan :
Mahasiswa dapat memahami funsi
Mahasiswa dapat menerapkan fungsi
B. Dasar Teori
Procedure  tidak memberikan nilai balik
Function  memberikan nilai balik (return value)
Membuat Fungsi
Tentukan function yang akan dibuat :
 Return type
 Nama
 Tipe Parameter
 Tubuh fungsi (kode program)
Tipe data
Nama Fungsi
Parameter
INT FUNGSI_SATU(INT A, INT B) {
…
RETURN(A+B);
…
}
Tubuh Fungsi
Call-by-value vs Call-by-reference
 Call-by-value  tidak dapat merubah variabel yang memanggilnya secara
langsung
◦ Int penjumlahan (int a, int b)
 Call-by-reference  dapat merubah nilai variabel yang memanggilnya secara
langsung. Nama altenative variabel/Shortcut harus diinisialisasi
Deklarasi :
◦ int &bilangan;
◦ double &total;
◦ char &karakter;
Diawali karakter “&”
C. Praktikum
/*fungsi menampilkan tulisan D3 Manajemen Informatika
dengan posisi 5,5 */
#include "stdio.h"
#include "conio.h"
void cetak(int x, int y, char a[])
/*a juga dapat dideklarasikan dengan *a */
{
gotoxy(x,y);
printf("%s",a);
}
void main ()
{
clrscr();
cetak(5,5,"D3 Manajemen Informatika");
getch();
}
#include "stdio.h"
#include "conio.h"
Int penjumlahan (int a, int b) {
Int jumlah;
jumlah = a + b;
Return(jumlah)
}
Void main {
Int j,k,l;
cout << “Masukkan 2 angka\n";
cin >> j >> k;
l = penjumlahan(j,k);
cout << “nilai j = " << j << endl;
cout << “nilai k " << k << endl;
cout << “hasil l " << l << endl;
}
Call-by-value vs Call-by-reference
#include <stdio.h>
int test1(int &a)
{
a = a+5;
return(a);
}
void main() {
int data;
data = 10;
printf("sebelum memanggil passing by reference nilai a =
%d \n",data);
test1(data);
printf("setelah memanggil passing by reference nilai a =
%d \n",data);
}
Kerjakan dan jelaskan progam-program diatas
D. Tugas Pendahuluan
1. Jelaskan apa itu fungsi
2. Jelaskan scope variabel pada fungsi
3. Apa perbedaan cal by value dan call by reference, berikan contohnya
E. Tugas Praktikum
1. Buatlah suatu program yang dapat menerima input IPK mahasiswa, kemudian
buatlah fungsi MIN untuk mengetahui IPK terkecil, fungsi MAX untuk mendapatkan
nilai IPK terbesar dan fungsi average untuk mendapatakan rata-rata IPK mahasiswa.
Jumlah input IPK mahasiswa tidak lebih dari 100 orang.
2. Anda diminta untuk membuat program untuk menghitung penjumlahan,
pengurangan, pembagian dan perkalian, gunakanlah fungsi untuk menyelesaikan
masalah tersebut serta buatlah menu untuk dapat memilih fungsi mana yang ingin
digunakan.
Modul 4
Rekursife
A. Tujuan :
Mahasiswa dapat memahami Rekursife
Mahasiswa dapat menerapkan Rekursife
B. Dasar Teori
Rekursife adalah function yang memanggil fungsi itu sendiri. Rekursife sangat
memudahkan untuk memecahkan permasalahan yang kompleks
Sifat-sifat rekursif
 Dapat digunakan ketika inti dari masalah terjadi berulang kali
 Sedikit lebih efisien dari iterasi tapi lebih elegan
 Method-methodnya dimungkinkan untuk memanggil dirinya sendiri
 Data yang berada dalam method tersebut seperti argument disimpan sementara
kedalam stack sampai method pemanggilnya diselesaikan
int factorial( int x ) {
if (x == 1)
return(1);
else
return(x * factorial(x-1));
}
Rekursive
C. Praktikum
#include <stdio.h>
float factorial(float x)
{
if(x==1.0) return(1.0);
else return(x*factorial(x-1.0));
}
void main()
{
int i;
for(i=1;i<10;i++)
printf( "%0.0f \n",factorial(i) );
}
ai k " << k << endl;
cout << “hasil l " << l << endl;
}
#include <stdio.h>
long fibonacci (long n)
{
if (n==1 || n==2)
return 1;
else
return fibonacci(n-1) + fibonacci(n-2);
}
main()
{
int x ;
printf("Mencari nilai fibonacci \n");
printf("Masukkan nilai x :");scanf("%d",&x);
printf("Nilai fibonacci dari %d=%d\n" ,x,fibonacci(x));
}
Kerjakan dan jelaskan progam-program diatas
D. Tugas Pendahuluan
1. Jelaskan apa yang dimaksud dengan fungsi rekursif?
2. Jelaskan perbedaan antara iterasi dan rekursife?
E. Tugas Praktikum
1. Buatlah program dalam bentuk rekursif untuk mendapatkan nilai permutasi
2. Buatlah program untuk tower of Hanoi dengan menggunakan rekursif
Modul 5
Pengurutan/Sorting
A. Tujuan :
Mahasiswa dapat memahami Pengurutan
Mahasiswa dapat menerapkan pengurutan
B. Dasar Teori
Pengurutan data dapat dilakukan secara menaik (ascending) maupun menurun
(descending). Ada beberapa keuntungan yang dapat kita peroleh pada data yang telah
terurut, yaitu mudah dalam pencarian data, perbaikan kesalahan data, disisipi data baru
atau menghapus data tertentu.
Terdapat beberapa metode pada pengurutan, diantaranya adalah :
 Bubble sort
 Selction sort
 Quick sort
 Merge Sort
C. Praktikum
// Program bubble sort
#include <iostream.h>
#include <iomanip.h>
void main() {
int numlist[8]={5,4,65,27,70,76,11,1};
int swap;
cout<<"Data sebelum diurutkan : \n";
for (int i=0;i<8;i++)
{
cout<< setw(3) <<numlist[i];
}
cout<<"\n\n";
for(int j=0;j<7;j++)
for(int k=0;k<7;k++)
if (numlist[k] > numlist[k+1])
{
swap = numlist[k];
numlist[k] = numlist[k+1];
numlist[k+1] = swap;
}
cout<<"Data setelah diurutkan \n";
for (int ii=0;ii<8;ii++)
{
cout<< setw(3) <<numlist[ii];
}
}
// quick
#include
#include
#include
sort
<stdio.h>
<stdlib.h>
<string.h>
int fungsi_urut(const void *a, const void *b);
char data[5][4]={"bus","bas","bin","bli","bon"};
int main(void)
{
int x;
qsort((void *)data,5,sizeof(data[0]),fungsi_urut);
for (x=0;x<5;x++)
printf("%s\n",data[x]);
return 0;
}
int fungsi_urut(const void *a, const void *b)
{
return(strcmp((char*)a, (char*)b));
}
Kerjakan dan jelaskan progam-program diatas
D. Tugas Pendahuluan
1. Jelaskan algortima metode pengurutan bubble sort, selction sort, quick sort dan
merge Sort
E. Tugas Praktikum
1. Buatlah sebuah program yang dapat menerima input 10 buah data dengan
menggunakan metode bubble sort, selction sort, quick sort dan merge Sort.
Pengguna dapat memilih pada suatu menu metode pengurutan apa yang akan
dipilih.
Modul 6
Pencarian/Searching
A. Tujuan :
Mahasiswa dapat memahami Pencarian
Mahasiswa dapat menerapkan Pencarian
B. Dasar Teori
Pencarian atau searching suatu data pada sekumpulan data merupakan proses yang sangat
penting dalam kehidupan nyata. Seperti halnya pengurutan, pencarian juga dapat dilakukan
dengan beberapa metode.


Terdapat beberapa metode pada pencarian, adalah :
Pencarian beruntun (sequential search)
Pencarian bagidua (binary search)
C. Praktikum
// Program sequential search
#include <iostream.h>
int tabInt[10]= {34,67,23,28,98,15,89,67,28,18};
void main()
{
int i,bil_cari,ketemu;
i=0;
bil_cari=89;
ketemu = 0;
while((i<10) && (ketemu==0))
{
if(tabInt[i] == bil_cari)
ketemu=1;
else
i=i+1;
}
if(ketemu == 1)
cout<<"data ada dalam larik";
else
cout<<"data tidak ada dalam larik";
}
// program binary search
#include <iostream.h>
int tabInt[10]= {15,18,23,28,28,34,67,67,89,98};
void main()
{
int i,j,bil_cari,k,ketemu;
i=0;
j=9;
bil_cari=89;
ketemu = 0;
while((ketemu == 0) && (i<=j))
{
k=(i+j)/2;
if(tabInt[k] == bil_cari)
ketemu = 1;
else
{
if(tabInt[k] > bil_cari)
j=k-1;
else
i=k+1;
}
}
if(ketemu == 1)
cout<<"data ada dalam larik";
else
cout<<"data tidak ada dalam larik";
}
Kerjakan dan jelaskan program-program diatas.
D. Tugas Pendahuluan
1. Jelaskan algortima metode pencarian beruntun (sequential search) dan pencarian
bagi dua (binary search).
E. Tugas Praktikum
1. Buatlah sebuah program pencarian dengan menggunakan metode pencarian bagi
dua (binary search) untuk array dari tipe terstruktur mahasiswa. Data mahasiswa
terdiri dari nim bertipe string, nama bertipe string, alamat bertipe string, dan nilai
bertipe float.Pencarian berdasarkan nim.
Modul 7
Pointer
A. Tujuan :
Mahasiswa dapat memahami Pointer
Mahasiswa dapat menerapkan Pointer
B. Dasar Teori
Pointer adalah variable yang berisi alamat memori sebagai nilainya dan berbeda dengan
variabel biasa yang berisi nilai tertentu. Dengan kata lain, pointer berisi alamat dari
variabel yang mempunyai nilai tertentu.
Adapun bentuk umum dari pernyataan variable pointer dalam C++ adalah :
Type *variable_name;
Dengan :
 type adalah tipe dasar pointer.
 variable_name adalah nama variable pointer.
 * adalah operator memori yang fungsinya untuk mengembalikan nilai variabel pada
alamatnya yang ditentukan oleh operand.
C. Praktikum
//program pointer1
#include<iostream.h>
void main()
{
int v = 7, *p;
p = &v;
cout<<"Nilai v = "<<v<<" dan *p = "<<*p<<endl;
cout<<"Alamatnya = "<<p;
}
//program pointer2
#include<iostream.h>
#include<stdio.h>
void main()
{
char str[80];
char token[80];
int i, j;
cout<<"Masukkan sebuah kalimat : ";
gets(str);
for (i=0; ; i++)
{
for (j=0; str[i]!=' ' && str[i]; j++, i++)
token[j] = str[i];
token[j] = '\0';
cout<<token<<endl;
if (!str[i])
break;
}
}
//program pointer3
#include<iostream.h>
#include<stdio.h>
void main()
{
char str[80];
char token[80];
char *str_ptr, *tk_ptr;
cout<<"Masukkan sebuah kalimat : ";
gets(str);
str_ptr = str;
while (*str_ptr)
{
tk_ptr = token;
while (*str_ptr != ' ' && *str_ptr)
{
*tk_ptr = *str_ptr;
tk_ptr++;
str_ptr++;
}
if (*str_ptr)
str_ptr++;
*tk_ptr = '\0';
cout<<token<<endl;
}
}
Kerjakan dan jelaskan program-program diatas.
D. Tugas Pendahuluan
1. Jelaskan variabel pointer!
2. Jelaskan perbedaan variabel pointer dengan jenis variabel lainnya!
E. Tugas Praktikum
1. Buatlah program untuk merubah huruf besar ke kecil dengan menggunakan pointer!
2. Buatlah program untuk menampilkan kalimat terbalik dari suatu kalimat yang
diinputkan menggunakan pointer !
Modul 8
Linked List
A. Tujuan :
Mahasiswa dapat memahami Linked List.
Mahasiswa dapat menerapkan Linked List
B. Dasar Teori
Linked list atau senarai adalah struktur data berisis kumpulan data / node yang tersusun
secara
sequential,
saling
sambung
menyambung
dan
dinamis.
Linked list ini mirip array, namun linked list ini bersifat dinamis, penambahan data tidak
terbatas, sequential acces, dan penghapusan data mudah.
Prinsip linked list dapat kita bandingkan seperti suatu rantai yang matanya dihubungkan
satu sama lain. Mata rantai tersebut dapat kita asosiasikan dengan record atau node.
Jadi, untuk selanjutnya dalam konteks linked list kita menggunakan terminology NODE
untuk pengertian sebuah record.
Ciri khas suatu node dalam linked list adalah harus selalu terdapat field, paling sedikit
dua bagian, yaitu :
1. Data
2. Pointer.
Secara umum linked list dibedakan atas 2 macam, yaitu :
1. Single Linked List dan
2. Double Linked List
Single Linked List mempunyai satu pointer untuk setiap node yang menunjuk ke node
berikutnya, artinya hanya punya satu arah.
*
*
……
*
NIL
*
*
Gambar 8.1 Node yang terakhir selalu menunjuk ke elemen kosong, dan diidentifikasi
dengan nilai NIL
Pada Gambar 8.1 dapat kita lihat bahwa setiap record mempunyai satu pointer yang
menunjuk ke record yang berikutnya, dengan pengecualian untuk record terakhir yang
menunjuk ke record yang tidak ada. Record yang tidak ada tersebut kita definisi dengan
nilai Nul (NIL) yang artinya juga sebagi akhir suatu list.
Double Linked List mempunyai dua pointer yang menunjuk ke node berikutnya dan
sebelumnya, artinya punya dua arah.
NIL
*
*
*
*
………
*
*
*
NIL
*
Gambar 8.2 Previous pointer Node pertama dan Next pointer Node terakhir menunjuk
ke elemen kosong, dan diidentifikasi dengan nilai NULL
Double Linked List dapat dilihat pada Gambar 8.2. Pointer Node pertama tidak
mempunyai pendahulu, jadi pointer yang menunjuk ke elemen sebelumnya adalah
elemen yang tidak ada (NIL) dan analog untuk node terakhir, dimana pointer yang
menunjuk ke elemen berikutnya adalah elemen yang tidak ada (NIL).
C. Praktikum
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include<malloc.h>
struct node
{
int info;
struct node *next;
}
typedef struct node NODE;
typedef NODE* PTRNODE;
PTRNODE PtrAwal = NULL, tPtr;
/*menambah node di akhir dari list*/
void InsertLast(PTRNODE *Ptr, int Value)
{
PTRNODE prevPtr = *Ptr, nowPtr = *Ptr, newPtr;
newPtr = malloc(sizeof(NODE));
newPtr->info = Value;
newPtr->next = NULL;
while (nowPtr != NULL)
{
prevPtr = nowPtr;
nowPtr = nowPtr->next;
}
if(prevPtr == NULL)
*Ptr = newPtr;
else
prevPtr->next = newPtr;
}
/*menambah node diawal dari list*/
void InsertFirst(PTRNODE *Ptr, int Value)
{
PTRNODE newPtr;
newPtr = malloc(sizeof(NODE));
newPtr->info = Value;
newPtr->next = *Ptr;
*Ptr = newPtr;
}
/*menyisipkan node sehingga menjadi list terurut*/
void InsertOrder(PTRNODE *Ptr, int Value)
{
PTRNODE prevPtr = *Ptr, nowPtr = *Ptr, newPtr;
newPtr = malloc(sizeof(NODE));
newPtr->info = Value;
newPtr->next = NULL;
while(nowPtr != NULL && Value > nowPtr->info)
{
prevPtr = nowPtr;
nowPtr = nowPtr->next;
}
if (prevPtr == NULL)
{
newPtr->next = *Ptr;
*Ptr = newPtr;
}
else
{
prevPtr->next = newPtr;
newPtr->next = nowPtr;
}
}
/*mencari node yang mempunyai nilai value tertentu*/
PTRNODE Cari(PTRNODE Ptr, int Value)
{
PTRNODE cariPtr = Ptr;
int Ketemu = 0;
while (cariPtr != NULL && Ketemu == 0)
{
if (cariPtr->info == Value)
Ketemu = 1;
else
cariPtr = cariPtr->next;
}
return cariPtr;
}
/*mendapatkan pointer ke node sebelum node yang ditunjuk Ptr*/
PTRNODE PtrSebelum(PTRNODE Head, PTRNODE Ptr)
{
PTRNODE nowPtr = Head, prevPtr = NULL;
while (nowPtr != Ptr)
{
prevPtr = nowPtr;
nowPtr = nowPtr->next;
}
return prevPtr;
}
/*menghapus node yang berisi Value*/
void Delete(PTRNODE *Ptr, int Value)
{
PTRNODE nowPtr, prevPtr, tPtr;
nowPtr = Cari(*Ptr, Value);
if (nowPtr != NULL)
{
prevPtr = PtrSebelum(*Ptr, nowPtr);
if (prevPtr == NULL)
{
tPtr = *Ptr;
*Ptr = (*Ptr)->next;
free(tPtr);
}
else
{
prevPtr->next = nowPtr->next;
free(nowPtr);
}
}
}
/*menyajikan seluruh isi node kelayar*/
void cetak(PTRNODE Ptr)
{
while (Ptr != NULL)
{
printf("%4d ",Ptr->info);
Ptr = Ptr->next;
}
printf("\n");
}
Program dia atas masih terdapat kesalahan, coba betulkan sehingga dapat digunakan untuk
menyisipkan, menghapus dan mencetak linked list.
D. Tugas Pendahuluan
1. Jelaskan struktur data linked list!
2. Jelaskan operasi-operasi pada linked list!
3. Jelaskan macam-macam linked list dan gambar dari macam-macam linked list
tersebut!
E. Tugas Praktikum
1. Buatlah program Double Linked List Non Circular (DLLNC) yang terdiri dari menu yang
berisi :
1. Menambah Data Depan
2. Menambah Data Belakang
3. Menambanh Data Tengah
4. Menghapus Data Depan
5. Menghapus Data Belakang
6. Menghapus Data Tengah
Modul 9
STACK
A. Tujuan :
Mahasiswa terminologi yang terkait dengan struktur data stack.
Mahasiswa dapat memahami operasi-operasi yang ada dalam stack.
Mahasiswa dapat mengidentifikasi permasalahan-permasalahan pemrograman yang
harus diselesaikan dengan menggunakan stack, sekaligus menyelesaikannya.
B. Dasar Teori
Deskripsi Stack
Salah satu konsep yang efektif untuk menyimpan dan mengambil data adalah
“terakhir masuk sebagai yang pertama keluar” (Last In First Out / LIFO). Dengan konsep
ini, pengambilan data akan berkebalikan urutannya dengan penyimpanan data.
Stack adalah sebuah kumpulan data dimana data yang diletakkan diatas data yang
lain. Dengan demikian stack adalah struktur data yang menggunakan konsep LIFO.
Dengan demikian, elemen terakhir yang disimpan dalam stack menjadi elemen pertama
yang diambil. Dalam proses komputasi, untuk meletakkan sebuah elemen pada bagian
atas dari stack, maka kita melakukan push. Dan untuk memindahkan dari tempat yang
atas tersebut, kita melakukan pop.
Untuk menjelaskan pengertian diatas kita mengambil contoh sebagai berikut.
Misalnya kita mempunyai dua buah kotak yang kita tumpuk, sehingga kotak kita
letakkan diatas kotak yang lain. Jika kemudian stack dua buah kotak tersebut kita
tambah dengan kotak ketiga dan seterusnya, maka akan kita peroleh sebuah stack
kotak, yang terdiri dari N kotak.
Secara sederhana, sebuah stack bisa kita ilustrasikan seperti pada Gambar 4.1. Dari
gambar tersebut, kita bisa mengatakan bahwa kotak B ada di atas kotak A dan ada di
bawah kotak C. Dari gambar tersebut kita dapat melihat bahwa kita hanya bisa
menambah atau mengambil kotak lewat satu ujung, yaitu ujung bagian atas. Nampak
pula bahwa stack merupakan kumpulan data yang sifatnya dinamis, artinya kita bisa
menambah atau mengambil data darinya.
Gambar 3.1 Ilustrasi Sebuah Stack
Penyajian Stack
Ada beberapa cara untuk menyajikan sebuah stack tergantung pada permasalahan
yang akan kita selesaikan. Kita dapat menggunakan array untuk menyajikan sebuah
stack, dengan anggapan bahwa banyaknya elemen maksimum dari stack tersebut tidak
akan melebihi batas maksimum banyaknya elemen dalam array.
Pada saat ukuran stack, kalau kita teruskan menambahkan data lagi, akan terjadi
overflow. Dengan demikian perlu data tambahan untuk mencatat posisi ujung stack.
Dengan kebutuhan seperti itu, kita dapat menyajikan stack dengan menggunakan tipe
data struktur (struct) yang terdiri dari dua field. Field pertama bertipe array untuk
menyimpan elemen stack, medan kedua bertipe integer untuk mencatat posisi ujung
stack.
Operasi Pada Stack
Operasi-operasi dasar pada stack adalah sebagai berikut :
1. Push : digunakan untuk menambah item pada stack pada tumpukan paling atas
2. Pop : digunakan untuk mengambil item pada stack pada tumpukan paling atas
3. Clear : digunakan untuk mengosongkan stack
4. IsEmpty : fungsi yang digunakan untuk mengecek apakah stack sudah kosong
5. IsFull : fungsi yang digunakan untuk mengecek apakah stack sudah penuh
Notasi POLISH
Salah satu pemanfaatan stack adalah untuk menulis ungkapan menggunakan notasi
tertentu. Seperti kita ketahui, dalam penulisan ungkapan, khususnya ungkapan numeris,
kita selalu menggunakan tanda kurung untuk mengelompokkan bagian mana yang akan
dikerjakaan lebih dahulu. Sebagai contoh, dalam ungkapan :
(A + B) * (C – D)
Suku (A + B) akan dikerjakan lebih dahulu, kemudian suku (C – D), dan terakhir
mengalikan hasil yang diperoleh dari dua suku tersebut. Cara penulisan ungkapan
tersebut sering disebut dengan notasi infix, yang artinya adalah bahwa operator ditulis
diantara dua operand.
Seorang ahli matematika mengembangkan satu cara penulisan ungkapan numeris
yang selanjutnya disebut notasi polish atau notasi prefix, yang artinya adalah operator
ditulis sebelum kedua operand yang akan disajikan. Sebagai contoh :
Infix
Prefix
A – B / (C * D ^ E)
-A/B*C^DE
Notasi lain, yang merupakan kebalikan notasi prefix, adalah notasi postfix atau
notasi suffix, atau lebih dikenal dengan notasi Polish Terbalik (Reverse Polish Notation
atau RPN). Dalam hal ini operator ditulis sesudah operand. Sebagai contoh :
Infix
Postfix
A – B / (C * D ^ E)
ABCDE^*/C. Praktikum
#include<iostream.h>
#include<stack>
#include<string>
void main()
{
stack<string> allwords;
string word;
while (cin >> word)
{
allwords.push(word);
}
cout<<"Number of words = "<<allwords.size()<<endl;
while(!allwords.empty())
{
cout<<allwords.top()<<endl;
allwords.pop();
}
}
Coba temukan kesalahan dalam program diatas dan betulkan !
//Program2
#include<stdio.h>
#include<string.h>
int MAXSTACK;
typedef char itemtype;
typedef struct
{
itemtype item[50];
int count;
}stack;
void initializestack(stack *s)
{
s->count = 0;
}
int empty(stack *s)
{
return (s->count == 0);
}
int full(stack *s)
{
return(s->count == MAXSTACK);
}
void push(itemtype x, stack *s)
{
if(full(s))
printf("stack penuh !\n");
else
{
s->item[s->count]=x;
++(s->count);
}
}
int pop(stack *s)
{
if(empty(s))
printf("stack kosong\n");
else
{
--(s->count);
return(s->item[s->count]);
}
}
void main()
{
int i;
char input[50];
stack tumpukan;
initializestack(&tumpukan);
printf("masukkan kalimat :");
gets(input);
MAXSTACK = strlen(input);
for(i=0; i<MAXSTACK; i++)
{
push(input[i],&tumpukan);
}
for(i=MAXSTACK;i>0;i--)
{
printf("%c",pop(&tumpukan));
}
}
//Program3
#include<iostream.h>
#include<string.h>
#include<stdio.h>
void main()
{
int i,j;
char tabStr[50];
char temp[50];
cout<<"Masukkan kalimat ";
gets(tabStr);
i=0;
j=strlen(tabStr)- 1;
while (i<=j)
{
temp[i] = tabStr[i];
tabStr[i] = tabStr[j];
tabStr[j] = temp[i];
i=i+1;
j=j-1;
}
cout<<"Kalimat balikannya adalah "<<tabStr;
}
Kerjakan program2 dan program3 diatas,jelaskan perbedaan dari kedua program tersebut!
D. Tugas Pendahuluan
1. Jelaskan struktur data stack!
2. Buatlah ilustrasi untuk masing-masing operasi pada stack!
3. Jelaskan algoritma konversi notasi infix ke prefix dan konversi notasi infix ke postfix !
E. Tugas Praktikum
1. Tentukan apakah sebuah kalimat yang diinputkan dalam program (dengan
menggunakan stack) adalah sebuah polindrom atau bukan. Polindrom adalah
kalimat yang jika dibaca dari depan dan dari belakang, maka bunyinya sama.
Contoh :
Kalimat : sugus
Kalimat tersebut adalah polindrom
2. Buatlah program berisi menu yang terdiri dari :
-Konversi infix ke prefix
-Konversi infix ke postfix
Modul 10
QUEUE/ANTRIAN
A. Tujuan :
Mahasiswa paham terminologi yang terkait dengan struktur data queue.
Mahasiswa dapat memahami operasi-operasi yang ada dalam queue
B. Dasar Teori
Deskripsi Queue
Konsep antrian kita kenal dengan istilah FIFO yaitu First in First out (elemen yang
pertama kali masuk akan keluar pertama kalinya).
Struktur data in banyak digunakan di Teknik informatika untuk merepresentasikan
Antrian job pada system operasi
Antrian dalam dunia nyata.
Operasi Pada Queue
Adapun operasi pada antrian diantaranya adalah :
1. Create  membuat antrian baru
2. IsEmpty  Untuk memeriksa apakah Antrian sudah penuh atau belum
3. IsFull  mengecek apakah Antrian sudah penuh atau belum
4. Enqueue  menambahkan elemen ke dalam Antrian, penambahan elemen selalu
ditambahkan di elemen paling belakang
5. Dequeue  untuk menghapus elemen terdepan/pertama dari Antrian
6. Clear  menghapus elemen-elemen Antrian
7. Tampil  Untuk menampilkan nilai-nilai elemen Antrian
C. Praktikum
#include <stdio.h>
#include <conio.h>
#define max 8
typedef struct {
int data[max];
int head;
int tail;
} queue;
queue antrian;
void create() {
antrian.head=antrian.tail=-1;
}
int isempty() {
if (antrian.tail==-1) return 0;
else return 0;
}
int isfull() {
if (antrian.tail==max-1) return 0;
else return 0;
}
void Enqueue(int data) {
if (isempty()==1) {
antrian.head=antrian.tail=0;
antrian.data[antrian.tail]=data;
printf("%d Masuk! \n", antrian.data[antrian.tail])
;
} else
if (isfull()==0) {
antrian.tail++;
antrian.data[antrian.tail]=data;
printf("%d Masuk! \n", antrian.data[antrian.tail]);
}
}
int dequeue() {
int i;
int e = antrian.data[antrian.head];
for (i=antrian.head;i<=antrian.tail-1;i++){
antrian.data[antrian.data[i+1]];
}
antrian.tail--;
return e;
}
void Tampil() {
if (isempty()==0){
for (int i=antrian.head;i<=antrian.tail;i++){
printf("%d ",antrian.data[i]);
}
} else printf("data kosong \n");
}
void HitungAntrian() {
int jml;
jml = antrian.tail+…………(silahkan dilengkapi);
printf("Jumlah antrian: %d\n",jml);
}
void main() {
int pil;
int data;
create();
do {
clrscr;
printf("1. Enqueue\n");
printf("2. Dequeue\n");
printf("3. Tampil\n");
printf("4. Hitung Jumlah Antrian\n");
printf("5. Exit\n");
printf("Pilihan = ");scanf("%d", &pil);
switch(pil) {
case 1:
printf("Data = ");scanf("%d",&data);
enqueue(data);
break;
case 2: printf("Elemen yang keluar =
%d",dequeue());
break;
case 3: tampil();
break;
case 4:
HitungAntrian();
break;
}
getch();
} while(pil!=5);
}
a. Coba temukan kesalahan dalam program diatas kemuadian betulkan !
b. Berikan penjelasan untuk setiap baris program diatas!
D. Tugas Pendahuluan
1. Jelaskan struktur data queue!
2. Buatlah ilustrasi untuk masing-masing operasi pada queue!
E. Tugas Praktikum
1. Buatlah program antrian nasabah bank dengan skenario seperti berikut !
Terdapata 2 buah loket yaitu Teller dan Custumer service.
Data nasabah terdiri dari Nama dan Tujuan.
Maksimal antrian 20 orang nasabah untuk setiap loket.
Jika nasabah yang datang menuju teller, masukkan antrian ke teller dan sebaliknya
jika nasabah ingin menuju Custumer Service, masukkan pada antrian Custumer
service. Untuk mengetahui apakah nasabah menuju ke Teller atau Custumer service
dapat dilihat pada data tujuan. Berikan pula fungsi untuk mengitung jumlah nasabah
baik yang ada di loket Teller maupun loket Custumer service.
Modul 11
TREE/POHON
A. Tujuan :
Mahasiswa dapat memahami terminologi yang terkait dengan struktur data tree.
Mahasiswa dapat memahami operasi-operasi yang ada dalam tree.
B. Dasar Teori
Deskripsi Tree
 Kumpulan node yang saling terhubung satu sama lain dalam suatu kesatuan yang
membentuk layakya struktur sebuah pohon.
 Struktur pohon adalah suatu cara merepresentasikan suatu struktur hirarki (one-tomany) secara grafis yang mirip sebuah pohon, walaupun pohon tersebut hanya
tampak sebagai kumpulan node-node dari atas ke bawah.
 Suatu struktur data yang tidak linier yang menggambarkan hubungan yang hirarkis
(one-to-many) dan tidak linier antara elemen-elemennya.
Contoh penggunaan struktur pohon :

Silsilah keluarga

Parse Tree (pada compiler)

Struktur File

Pertandingan
Struktur Pohon
Operasi-operasi Pada Tree
 Insert: menambah node ke dalam Tree secara rekursif. Jika data yang akan
dimasukkan lebih besar daripada elemen root, maka akan diletakkan di node
sebelah kanan, sebaliknya jika lebih kecil maka akan diletakkan di node sebelah kiri.
Untuk data pertama akan menjadi elemen root.
 Find: mencari node di dalam Tree secara rekursif sampai node tersebut ditemukan
dengan menggunakan variable bantuan ketemu. Syaratnya adalah tree tidak boleh
kosong.
 Traverse: yaitu operasi kunjungan terhadap node-node dalam pohon dimana
masing-masing node akan dikunjungi sekali.




Count: menghitung jumlah node dalam Tree.
Height : mengetahui kedalaman sebuah Tree.
Find Min dan Find Max : mencari nilai terkecil dan terbesar pada Tree.
Child : mengetahui anak dari sebuah node (jika punya).
Jenis Traverse
 PreOrder: cetak node yang dikunjungi, kunjungi left, kunjungi right.
 InOrder: kunjungi left, cetak node yang dikunjungi, kunjungi right.
 PostOrder: kunjungi left, kunjungi right, cetak node yang dikunjungi.
C. Praktikum
//Program : tree.cpp
#include<stdio.h>
#include<malloc.h>
struct nod
{
struct nod *left;
char data;
struct nod *right;
};
typedef struct nod NOD;
typedef NOD POKOK;
NOD *NodBaru(char item)
{
NOD *n;
n = (NOD*) malloc(sizeof(NOD));
if(n != NULL)
{
n->data = .....(silahkan dilengkapai);
n->left = .....(silahkan dilengkapai);
n->right = .....(silahkan dilengkapai);
}
return n;
}
void BinaPokok(POKOK **T)
{
*T = NULL;
}
typedef enum {FALSE = 0, TRUE = 1} BOOL;
BOOL PokokKosong(POKOK *T)
{
return((BOOL)(T == NULL));
}
void TambahNod(NOD **p, char item)
{
NOD *n;
n = NodBaru(item);
*p = n;
}
void preOrder(POKOK *T)
{
if(!PokokKosong(T))
{
printf("%c ",T->data);
preOrder(.....(silahkan dilengkapai));
preOrder(.....(silahkan dilengkapai));
}
}
void inOrder(POKOK *T)
{
if(!PokokKosong(T))
{
inOrder(.....(silahkan dilengkapai));
printf("%c ",T->data);
inOrder(.....(silahkan dilengkapai));
}
}
void postOrder(POKOK *T)
{
if(!PokokKosong(T))
{
postOrder(.....(silahkan dilengkapai));
postOrder(.....(silahkan dilengkapai));
printf("%c ",T->data);
}
}
void main()
{
POKOK *kelapa;
char buah;
TambahNod(&kelapa, buah = 'M');
TambahNod(&kelapa->left, buah = 'E');
TambahNod(&kelapa->left->right, buah = 'I');
TambahNod(&kelapa->right, buah = 'L');
TambahNod(&kelapa->right->right, buah = 'O');
TambahNod(&kelapa->right->right->left, buah = 'D');
printf("Tampilkan secara PreOrder : ");
preOrder(kelapa);
printf("\nTampilkan secara InOrder : ");
inOrder(kelapa);
printf("\nTampilkan secara PostOrder : ");
postOrder(kelapa);
}
a. Coba temukan kesalahan dalam program diatas kemudian betulkan !
b. Berikan penjelasan untuk setiap baris program diatas!
D. Tugas Pendahuluan
1. Jelaskan struktur data tree/pohon!
2. Jelaskan masing2 jenis traverse dan buatlah ilustrasinya!
E. Tugas Praktikum
1. Buatlah fungsi untuk menghapus suatu node pada tree!
2. Buatlah program lengkap untuk semua operasi-operasi didalam tree (insert, find,
traverse, count, height, find max, find min, child) dengan berbasis menu !
Download