Modul Praktikum Struktur Data Genap 2010 2011 Rev41

42
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;

description

wedkjjdfslfd

Transcript of Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Page 1: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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 TeoriArray 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 array1. Sebagai Peubah Contoh :

Arr : array[1..25] of integerNamaMhs : array[‘a’..’j’] of string

2. Sebagai tipe baru Contoh :

type Arrint : array[1..25] of integerP : Arrint

3. Mendefinisikan ukuran maksimum elemen larik sebagai konstanta Contoh :

Const Nmaks = 10type Larikint : array[1..Nmaks] of integerP : LarikInt

Cara menterjemahkan ke bahasa C :#define Nmaks 10typedef 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

Page 2: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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 : ");

Page 3: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

#include <iostream.h>#include <conio.h>main()

{int baris, kolom;int n, m,matriksA[15][15],matriksB[15][15],hasil[15][15];

#include <stdio.h>#include <conio.h>

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]);}

void main(){

int nilai[10],x,jml,min,max;float avg,total;

printf("Masukkan Bilangan : ");

Page 4: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

#include <iostream.h>#include <conio.h>main()

{int baris, kolom;int n, m,matriksA[15][15],matriksB[15][15],hasil[15][15];

/* 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];

Page 5: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. Jelaskan definisi penulisan array 1 dimensi, 2 dimensi dan banyak dimensi2. 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 :

/* 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];

Bilangan pertama = 100022233344455566677888999Bilangan kedua = 2000111222333444555666777888999Hasil = 2001111444666889111333555777998

Page 6: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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 KeteranganFidela 10 10,2 Naik 0,2 Lavina 6,4 7 Naik 0.6Nadifa 15 14,8 Turun 0.2Fatan 11 11,3 Naik 0.3Aji 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 : Contoh Keluaran :

Fidela1010,2Lavina6,47Nadifa1514,8Fatan1111,3Aji8,69

Bulan lalu Bulan Sekarang KetFidela 10 10,2 Naik 0,2Lavina 6,4 7 Naik 0,6Nadifa 15 14,8 Turun 0,2Fatan 11 11,3 Naik 0,3Aji 8,6 8,6 Tetap

Page 7: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 2Record /Rekaman

A. Tujuan : Mahasiswa dapat mendefinisikan recordMahasiswa dapat mengakses elemen recordMahasiswa dapat menerapkan record pada suatu studi kasus tertentu.

B. Dasar TeoriRECORDS 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

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 StructDeklarasi 1

Contoh :

Fields

struct nama_struct { tipe_data_1 nama_var_1; tipe_data_2 nama_var_2; tipe_data_3 nama_var_3; ……

};

struct pegawai {char status[10];char nama[30];char alamat[40];char tgl_lahir[10];float gaji;

};

Page 8: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Deklarasi 2, Menggunakan kata tercadang typedef

Mengakses Komponen Record

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 Mahasiswatypedef struct Mahasiswa{char NIM[9];char nama[30];float ipk;};void main(){

//Buat variabel mhs bertipe data MahasiswaMahasiswa mhs[100];………………}

Gunakan nama record nama member yang dipisah dot

Contoh :

Pegawai.nama;

Mhs[i].NIM;

Page 9: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

C. Praktikum1. Entri data NIM dan Nama Mahasiswa

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. 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 Praktikum1. 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.

#include <stdio.h>#include <conio.h>//Pendeklarasian tipe data baru struct Mahasiswatypedef struct Mahasiswa{char NIM[9];char nama[30];float ipk;};void main(){//Buat variabel mhs bertipe data MahasiswaMahasiswa 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();}

Page 10: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 3Fungsi

A. Tujuan : Mahasiswa dapat memahami funsiMahasiswa dapat menerapkan fungsi

B. Dasar TeoriProcedure à tidak memberikan nilai balik Function à memberikan nilai balik (return value)

Membuat FungsiTentukan function yang akan dibuat :

Return type Nama Tipe Parameter Tubuh fungsi (kode program)

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;

INT FUNGSI_SATU(INT A, INT B) {…RETURN(A+B);…

}

Tipe data Nama Fungsi Parameter

Tubuh Fungsi

Diawali karakter “&”

Page 11: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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;}

Page 12: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Call-by-value vs Call-by-reference

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. Jelaskan apa itu fungsi2. Jelaskan scope variabel pada fungsi3. Apa perbedaan cal by value dan call by reference, berikan contohnya

E. Tugas Praktikum1. 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.

#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);}

Page 13: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 4Rekursife

A. Tujuan : Mahasiswa dapat memahami RekursifeMahasiswa dapat menerapkan Rekursife

B. Dasar TeoriRekursife adalah function yang memanggil fungsi itu sendiri. Rekursife sangat memudahkan untuk memecahkan permasalahan yang kompleksSifat-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

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;}

int factorial( int x ) {if (x == 1)return(1);elsereturn(x * factorial(x-1));}

Rekursive

Page 14: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. Jelaskan apa yang dimaksud dengan fungsi rekursif?2. Jelaskan perbedaan antara iterasi dan rekursife?

E. Tugas Praktikum1. Buatlah program dalam bentuk rekursif untuk mendapatkan nilai permutasi2. Buatlah program untuk tower of Hanoi dengan menggunakan rekursif

#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));

}

Page 15: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 5Pengurutan/Sorting

A. Tujuan : Mahasiswa dapat memahami PengurutanMahasiswa 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];

}}

Page 16: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Kerjakan dan jelaskan progam-program diatas

D. Tugas Pendahuluan1. Jelaskan algortima metode pengurutan bubble sort, selction sort, quick sort dan

merge SortE. 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.

// quick sort#include <stdio.h>#include <stdlib.h>#include <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));}

Page 17: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 6Pencarian/Searching

A. Tujuan : Mahasiswa dapat memahami PencarianMahasiswa dapat menerapkan Pencarian

B. Dasar TeoriPencarian 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;

elsei=i+1;

}

if(ketemu == 1)cout<<"data ada dalam larik";

elsecout<<"data tidak ada dalam larik";

}

Page 18: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Kerjakan dan jelaskan program-program diatas.

D. Tugas Pendahuluan1. Jelaskan algortima metode pencarian beruntun (sequential search) dan pencarian

bagi dua (binary search).

E. Tugas Praktikum1. 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.

// 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;

elsei=k+1;

}}if(ketemu == 1)

cout<<"data ada dalam larik";else

cout<<"data tidak ada dalam larik";}

Page 19: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 7Pointer

A. Tujuan : Mahasiswa dapat memahami PointerMahasiswa dapat menerapkan Pointer

B. Dasar TeoriPointer 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;}

}

Page 20: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Kerjakan dan jelaskan program-program diatas.

D. Tugas Pendahuluan1. Jelaskan variabel pointer!2. Jelaskan perbedaan variabel pointer dengan jenis variabel lainnya!

E. Tugas Praktikum1. 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 !

//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;

}}

Page 21: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 8Linked List

A. Tujuan : Mahasiswa dapat memahami Linked List.Mahasiswa dapat menerapkan Linked List

B. Dasar TeoriLinked 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. Data2. Pointer.Secara umum linked list dibedakan atas 2 macam, yaitu :1. Single Linked List dan2. Double Linked ListSingle Linked List mempunyai satu pointer untuk setiap node yang menunjuk ke node berikutnya, artinya hanya punya satu arah.

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.

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

* * * * NIL……

**

**

**

NIL **

……… NIL

Page 22: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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;elseprevPtr->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;

Page 23: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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;

elsecariPtr = 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;

Page 24: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

*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 Pendahuluan1. 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 Praktikum1. Buatlah program Double Linked List Non Circular (DLLNC) yang terdiri dari menu yang

berisi :1. Menambah Data Depan2. Menambah Data Belakang3. Menambanh Data Tengah4. Menghapus Data Depan5. Menghapus Data Belakang6. Menghapus Data Tengah

Modul 9

Page 25: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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 TeoriDeskripsi 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 StackAda beberapa cara untuk menyajikan sebuah stack tergantung pada permasalahan

yang akan kita selesaikan. Kita dapat menggunakan array untuk menyajikan sebuah

Page 26: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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 StackOperasi-operasi dasar pada stack adalah sebagai berikut :1. Push : digunakan untuk menambah item pada stack pada tumpukan paling atas2. Pop : digunakan untuk mengambil item pada stack pada tumpukan paling atas3. Clear : digunakan untuk mengosongkan stack4. IsEmpty : fungsi yang digunakan untuk mengecek apakah stack sudah kosong5. IsFull : fungsi yang digunakan untuk mengecek apakah stack sudah penuh

Notasi POLISHSalah 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 PrefixA – 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 PostfixA – 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);

Page 27: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

}

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)

Page 28: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

{ 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;

Page 29: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

} cout<<"Kalimat balikannya adalah "<<tabStr;}

Kerjakan program2 dan program3 diatas,jelaskan perbedaan dari kedua program tersebut!

D. Tugas Pendahuluan1. 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 Praktikum1. 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 : sugusKalimat tersebut adalah polindrom

2. Buatlah program berisi menu yang terdiri dari :-Konversi infix ke prefix-Konversi infix ke postfix

Page 30: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 10QUEUE/ANTRIAN

A. Tujuan : Mahasiswa paham terminologi yang terkait dengan struktur data queue.Mahasiswa dapat memahami operasi-operasi yang ada dalam queue

B. Dasar TeoriDeskripsi QueueKonsep 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 operasiAntrian dalam dunia nyata.

Operasi Pada QueueAdapun operasi pada antrian diantaranya adalah :1. Create à membuat antrian baru2. IsEmpty à Untuk memeriksa apakah Antrian sudah penuh atau belum3. IsFull à mengecek apakah Antrian sudah penuh atau belum4. Enqueue à menambahkan elemen ke dalam Antrian, penambahan elemen selalu

ditambahkan di elemen paling belakang5. Dequeue à untuk menghapus elemen terdepan/pertama dari Antrian6. Clear à menghapus elemen-elemen Antrian7. Tampil à Untuk menampilkan nilai-nilai elemen Antrian

C. Praktikum#include <stdio.h>#include <conio.h>

#define max 8typedef 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;

Page 31: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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]) ;} elseif (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");

Page 32: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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 Pendahuluan1. Jelaskan struktur data queue!2. Buatlah ilustrasi untuk masing-masing operasi pada queue!

E. Tugas Praktikum1. 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.

Page 33: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

Modul 11TREE/POHON

A. Tujuan : Mahasiswa dapat memahami terminologi yang terkait dengan struktur data tree.Mahasiswa dapat memahami operasi-operasi yang ada dalam tree.

B. Dasar TeoriDeskripsi 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-to-

many) 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.

Page 34: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

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);

Page 35: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

*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);

}

Page 36: Modul Praktikum Struktur Data Genap 2010 2011 Rev41

a. Coba temukan kesalahan dalam program diatas kemudian betulkan !b. Berikan penjelasan untuk setiap baris program diatas!

D. Tugas Pendahuluan1. Jelaskan struktur data tree/pohon!2. Jelaskan masing2 jenis traverse dan buatlah ilustrasinya!

E. Tugas Praktikum1. 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 !