MODUL PRAKTIKUM STRUKTUR DATA
Disusun Oleh Achmad Yani, S.T., M.Kom.
PROGRAM STUDI MANAJEMEN INFORMATIKA POLITEKNIK NEGERI MEDAN 2008
KATA PENGANTAR Segala puji dan syukur bagi Allah SWT, karena dengan rahmat dan karunia Nya, penulisan Modul Laboratoium Laboratoium Struktur Data ini dapat dirampungkan. Modul laboratorium yang digunakan sebagai panduan praktikum untuk mata kuliah Struktur Data pada Program Studi Manajemen Informatika Politeknik Negeri Medan ini disusun dengan materi yang sesuai dengan mata kuliah teori. Materi dalam modul ini dibagi atas 10 buah modul untuk diselesaikan dalam 18 kali pertemuan di laboratorium. Dalam proses penulisan dan penyusunan modul ini, penyusun menyadari adanya kekurangan yang tidak mungkin dapat dihindari. Atas dasar kekurangan pada modul ini, penyusun mengharapkan kritik dan saran yang bersifat membangun dari para pembaca agar modul ini dapat disempurnakan. Dalam penyelesaian tulisan ini penulis mengucapkan banyak terima kasih kepada 1. Bapak Ir. Zulkifli Lubis, M.I.Komp., selaku Direktur Politeknik Negeri Medan, 2. Ibu Roslina, M.I.T., selaku Ketua Program Studi Manajemen Informatika, dan 3. Semua pihak yang telah memberikan andil dalam penyelesaian penelitian ini. Akhirnya penulis berharap semoga penelitian ini dapat memberikan manfaat kepada sivitas akademika Politeknik Negeri Medan khususnya dan kepada para pembaca umumnya.
Medan, Desember 2008 Penyusun,
Achmad Yani, S.T., M.Kom.
ii
DAFTAR ISI KATA PENGANTAR DAFTAR ISI
…………………………………………………….
………………………………………………………………
MODUL 1
Searching pada Array
MODUL 2
Sorting pada Array
MODUL 3
Stack dengan Array
MODUL 4
Queue dengan Array
MODUL 5
Single Linked-List Non-Circular
MODUL 6
Single Linked-List Circular
MODUL 7
Double Linked-List Non-Circular
MODUL 8
Double Linked-List Circular
MODUL 9
Stack dengan Linked List
MODUL 10
Queue dengan Linked List
REFERENSI
……………………………….
…………………………………..
………………………………….
………………………………...
…………………...
…………………………
………………….
………………………..
…………………………...
…………………………..
.........................................................................................
ii iii 1 9 15 19 24 35 45 52 59 63 66
iii
Modul Praktikum Struktur Data
MODUL 1
Pertemuan : I dan II Judul Modul : Searching pada Array : Tujuan Memahami beberapa metode searching pada array Dapat membuat program aplikasi searching pada array
DASAR TEORI Pengertian Searching
Pada suatu data seringkali dibutuhkan pembacaan kembali informasi (information retrieval ) dengan cara searching (pencarian). Searching adalah pencarian data dengan menelusuri tempat pencarian data tersebut. Tempat pencarian data tersebut dapat berupa array dalam memori, bisa juga pada file di dalam external storage (disk).
Beberapa metode searching pada array: Sequential Search Binary Search Interpolation Search 1. Sequenti al Search
Sequential search adalah suatu teknik pencarian data dalam array (1 dimensi) yang akan menelusuri semua elemen-elemen array dari awal sampai akhir untuk array yang belum terurut. Kemungkinan terbaik (best case) adalah jika data yang dicari terletak di indeks array terdepan (elemen array pertama) sehingga waktu yang dibutuhkan untuk pencarian data sangat singkat (minimal). Kemungkinan terburuk (worst case) adalah jika data yang dicari terletak di indeks array terakhir (elemen array terakhir) sehingga waktu yang dibutuhkan untuk pencarian data sangat lama (maksimal).
Misalnya terdapat array satu dimensi sebagai berikut: 0
1
2
3
4
5
6
7
Indeks
8
10
6
-2
11
7
1
100
Nilai
Kemudian program akan meminta data yang akan dicari, misalnya 1000. Jika ada, maka akan ditampilkan tulisan “ADA”, sedangkan jika tidak ada maka akan ditampilkan tulisan “TIDAK ADA”. #include #include void main(){ clrscr();
Prodi Manajemen Informatika - Polmed
1
Modul Praktikum Struktur Data
int data[8] = {8,10,6,-2,11,7,1,100}; int cari; int flag=0; printf("masukkan data yang ingin dicari = ");scanf("%d",&cari); for(int i=0;i<8;i++){ if(data[i] == cari) flag=1; } if(flag==1) printf("Data ada!\n"); else printf("Data tidak ada!\n");
Dari program diatas, terlihat bahwa dilakukan perulangan untuk mengakses semua elemen array data satu per satu berdasarkan indeksnya. Program menggunakan sebuah variabel flag yang berguna untuk menandai ada atau tidaknya data yang dicari dalam array data. Hanya bernilai 0 atau 1. Flag pertama kali diinisialiasasi dengan nilai 0. Jika ditemukan, maka flag akan diset menjadi 1, jika tidak ada maka flag akan tetap bernilai 0. Semua elemen array data akan dibandingkan satu per satu dengan data yang dicari dan diinputkan oleh user.
Beberapa trik yang perlu dilakukan berkaitan dengan searching array: Untuk mengetahui posisi data yang ditemukan, maka digunakan indeks array. Jika datanya ada sebanyak, misalnya 100000, untuk meningkatkan efisiensi, seharusnya jika data yang dicari sudah ditemukan maka perulangan harus dihentikan dengan menggunakan break . Untuk menghitung banyaknya data dalam array yang nilainya sama dengan data yang dicari, digunakan variabel counter yang nilainya akan selalu bertambah jika ada data yang ditemukan. Penggunaan Sentinel (Penjaga)
Perhatikan array data berikut ini:
0
1
2
3
4
5
3
12
9
-4
21
6
6
Indeks Nilai
Terdapat 6 buah data dalam array (dari indeks 0 s.d. 5) dan terdapat 1 indeks array tambahan (indeks ke 6) yang belum berisi data (disebut sentinel) Array pada indeks ke 6 berguna untuk menjaga agar indeks data berada pada indeks 0 s.d. 5 saja. Bila pencarian data sudah mencapai array indeks yang ke-6 maka berarti data TIDAK ADA, sedangkan jika pencarian tidak mencapai indeks ke-6, maka data ADA. #include #include void main(){ clrscr();
Prodi Manajemen Informatika - Polmed
2
Modul Praktikum Struktur Data
int data[7] = {3,12,9,-4,21,6}; int cari,i; printf("masukkan data yang ingin dicari = ");scanf("%d",&cari); data[6] = cari; i=0; while(data[i] != cari) i++; if(i<6) printf("Data ada!\n"); else printf("Data tidak ada!\n"); }
Kesimpulan: sangat efisien! 2. Bi nary Search
Data yang ada harus diurutkan terlebih dahulu berdasarkan suatu urutan tertentu yang dijadikan kunci pencarian. Binary search adalah teknik pencarian data dalam array dengan cara membagi data menjadi dua bagian setiap kali terjadi proses pengurutan. Prinsip pencarian biner adalah: □ Data diambil dari posisi 1 sampai posisi akhir N □ Kemudian cari posisi data tengah dengan rumus (posisi awal + posisi akhir) / 2 □ Kemudian data yang dicari dibandingkan dengan data yang di tengah, apakah sama atau lebih kecil, atau lebih besar? □ Jika lebih besar, maka proses pencarian dicari dengan posisi awal adalah posisi tengah + 1 □ Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir adalah posisi tengah – 1 □ Jika data sama, berarti ketemu.
Contoh Data: Misalnya data yang dicari adalah 17 0
1
2
3
4
5
6
7
8
3
9
11
12
15
17
23
31
35
A
B
C
Karena 17 > 15 (data tengah), maka: awal = tengah + 1 0
1
2
3
4
5
6
7
8
3
9
11
12
15
17
23
31
35
A
B
C
Karena 17 < 23 (data tengah), maka: akhir = tengah – 1 0
1
2
3
4
5
6
7
8
3
9
11
12
15
17
23
31
35
A=B=C
Karena 17 = 17 (data tengah), maka KETEMU!
Prodi Manajemen Informatika - Polmed
3
Modul Praktikum Struktur Data
Programnya: int binary_search(int cari){ int l,r,m; l = 0; r = n-1; int ktm = 0; while(l<=r && ktm==0){ m = (l+r)/2; if(data[m] == cari) ktm=1; else if (cari < data[m]) r=m-1; else l=m+1; } if(ktm==1) return 1; else return 0; } 3. I nterpolati on Search
Teknik ini dilakukan pada data yang sudah terurut berdasarkan kunci tertentu. Teknik searching ini dilakukan dengan perkiraan letak data. Contoh ilustrasi: jika kita hendak mencari suatu nama di dalam buku telepon, misal yang berawalan dengan huruf T, maka kita tidak akan mencarinya dari awal buku, tapi kita langsung membukanya pada 2/3 atau 3/4 dari tebal buku. Jadi kita mencari data secara relatif terhadap jumlah data. Rumus posisi relatif kunci pencarian dihitung dengan rumus:
posisi
kunci data[low] data[high] data[low]
(high low) low
Misal terdapat data sebagai berikut: Kode 025 034 041 056 063 072 088 096
Judul Buku The C++ Programming Mastering Delphi 6 Professional C# Pure JavaScript v2 Advanced JSP & Servlet Calculus Make it Easy Visual Basic 2005 Express Artificial Life : Volume 1
Pengarang James Wood Marcopolo Simon Webe Michael Bolton David Dunn Gunner Christian Antonie Gloria Virginia
Kunci Pencarian ? 088 Low ? 0 High ? 7 Posisi = (088 - 025) / (096 - 025) * (7 - 0) + 0 = [6] Kunci[6] = kunci pencarian, data ditemukan : Visual Basic 2005 Kunci Pencarian ? 060 Low ? 0 High ? 7 Posisi = (060 – 025) / (096 – 025) * (7 – 0) + 0 = [3] Kunci[3] < kunci pencarian, maka teruskan
Prodi Manajemen Informatika - Polmed
4
Modul Praktikum Struktur Data
Low = 3 + 1 = 4 High = 7 Ternyata Kunci[4] adalah 063 yang lebih besar daripada 060. Berarti tidak ada kunci 060. Programnya: int interpolationsearch(int key,int n){ int low,high,pos,i; low=0; high=n-1; do{ pos = (key – data[low]) * (high – low) / data[high] – data[low] + low; if (data[pos] == key] return pos; if (data[pos] > key) high = pos-1; else if (data[pos] < key) low = pos + 1; } while(key >= data[low] && key <= data[high]); return -1 }
PERCOBAAN
Tuliskan program-program berikut ini, kemudian lihat hasilnya dan beri penjelasan atas masing-masing program. 1. Program 1 (Sequential Search) #include void main() { //deklarasi variabel int A[10],index[10], i,j,k; //proses penginputan data for(i=0;i<10;i++) { printf("Data ke-%d:",i+1); scanf("%d",&A[i]); } //memasukkan data yang akan dicari ke dalam K printf("Masukkan data yang akan anda cari:"); scanf("%d",&k); //proses pencarian data j=0; for (i=0;i<10;i++) { if(A[i]==k) { index[j]=i; j++; } } //jika data ditemukan dalam array if (j>0)
Prodi Manajemen Informatika - Polmed
5
Modul Praktikum Struktur Data
{ printf("Data %d yang dicari ada %d buah\n",k,j); printf("Data tersebut terdapat dalam index ke :"); for(i=0;i
2. Program 2 ( Binary Search) #include void main() { //deklarasi variabel int A[10], i,j,k,tkr,top,bottom,middle,tm; //proses penginputan data for(i=0;i<10;i++) { printf("Data ke-%d:",i+1); scanf("%d",&A[i]); } printf("Masukkan data yang akan anda cari:"); scanf("%d",&k); //proses pengurutan data for(i=0;i<10;i++) { for(j=i+1;j<10;j++) { if (A[i]>A[j]) { tkr=A[i]; A[i]=A[j]; A[j]=tkr; } } } //proses pencarian data tm=0; top=9; bottom=0; while(top>=bottom) { middle=(top+bottom)/2; if(A[middle]==k) { tm++; } if(A[middle]
Prodi Manajemen Informatika - Polmed
6
Modul Praktikum Struktur Data
else { top=middle-1; } } if (tm>0) { printf("Data %d yang dicari ada dalam array\n",k); } //jika tidak ditemukan else { printf("Data tidak ditemukan dalam array\n"); } }
3. Program 3 ( Interpolation Search) #include void main() { //deklarasi variable int A[10], i,j,k,tkr,low,high,pos,tm; //proses penginputan data for(i=0;i<10;i++) { printf("data ke-%d:",i+1); scanf("%d",&A[i]); } //Input data yang akan dicari printf("Masukkan data yang akan anda cari:"); scanf("%d",&k); //proses pengurutan data for(i=0;i<10;i++) { for(j=i+1;j<10;j++) { if (A[i]>A[j]) { tkr=A[i]; A[i]=A[j]; A[j]=tkr; } } } //proses pencarian data tm=0; high=9; low=0; do { pos = ((k - A[low]) / (A[high] - A[low]))*(high-low) + low; if (A[pos] == k) { tm++; break; } if (A[pos] > k) high = pos-1; else
Prodi Manajemen Informatika - Polmed
7
Modul Praktikum Struktur Data
if (A[pos] < k) low = pos + 1; } while(k >= A[low] && k <= A[high]); if (tm>0) { printf("data %d yang dicari ada dalam array\n",k); } //jika tidak ditemukan else { printf("data tidak ditemukan dalam array\n"); } }
LATIHAN
1. Buat program lengkap untuk menggabungkan ketiga metode searching dengan menggunakan menu. Buat dalam bentuk fungsi. Menu-menunya adalah sebagai berikut: a. Masukkan data b. Cari data c. Edit data d. Tampilkan data 2. Buat array rekening bank dengan ketentuan : a. Setiap elemen array bertipe struktur: (int no_rek, char nama[25], long saldo) b. Buatlah fungsi-fungsi sebagai berikut : - Add - Edit - Cari (Sequential) - Setor - Ambil - Transfer - Tutup Rekening (Delete)
Prodi Manajemen Informatika - Polmed
8
Modul Praktikum Struktur Data
MODUL 2
Pertemuan : III dan IV Judul Modul : Sorting pada Array Tujuan : Memahami beberapa metode sorting pada array Dapat membuat program aplikasi sorting pada array
DASAR TEORI
Sorting (pengurutan) adalah proses menyusun kembali data yang sebelumnya telah disusun dengan suatu pola tertentu ataupun secara acak, sehingga menjadi tersusun secara teratur menurut aturan tertentu. Pada umumnya ada 2 macam pengurutan, yaitu: Pengurutan secara ascending (urut naik). Pengurutan secara descending (urut turun). Ada beberapa metode sorting pada array. Dalam praktikum ini akan dibahas lima di antara metode-metode sorting yang ada, yaitu Bubble sort Selection sort Insertion sort Quick sort Merge sort Algoritma-algoritma ini mempunyai efek yang berbeda dalam setiap prosesnya, ada yang mudah digunakan, ada yang mempunyai proses yang sangat cepat, dan sebagainya. Hal yang umum dilakukan dalam proses sorting adalah proses pertukaran antara 2 elemen atau lebih (analogi memindah air dalam gelas). Untuk melakukan proses pertukaran akan diperlukan adanya variable baru yang digunakan sebagai variable penampung. //fungsi penukar data void tukar (int a[], int i, int j) { int tampung = a[i]; a[i] = a[j]; a[j] = tampung; } 1. Bu bble Sort
Bubble sort merupakan metode sorting paling mudah, namun paling lambat dibandingkan dengan metode yang lain.
Prodi Manajemen Informatika - Polmed
9
Modul Praktikum Struktur Data
Bubble sort mengurutkan data dengan cara membandingkan elemen sekarang dengan elemen berikutnya. Bisa dilakukan baik dari kepala array maupun ekor array. Proses yang berlangsung:
Untuk ascending : jika elemen sekarang lebih besar daripada elemen berikutnya, maka kedua elemen tersebut ditukar.
Untuk descending : jika elemen sekarang lebih kecil daripada elemen berikutnya, maka kedua elemen tersebut ditukar. Contoh fungsi bubble sort:
//Bubble Sort void bubble (int a[], int n) { int i,j; for (i=n;i>=1;i--) { for (j=2;ja[j]) tukar (a,j-1,j); } } 2. Ex change Sort
Mirip dengan bubble sort. Perbedaannya: dalam exchange sort ada elemen yang berfungsi sebagai pusat (pivot), pertukaran hanya akan dilakukan jika diperlukan saja dari pivot tersebut. Contoh fungsi exchange sort: //Exchange Sort void exchange (int a[], int n) { int i,j; for (i=0;i<=n-1;i++) { for (j=(i+1);ja[j]) tukar (a,i,j); } }
3. Selection Sort
Kombinasi sorting dan searching. Untuk setiap proses, akan dilakukan dengan mencari elemen dari posisi yang belum diurutkan dan kemudian memilih elemen yang memiliki nilai terkecil atau terbesar yang akan ditukarkan ke posisi yang tepat di dalam array. Misalnya untuk putaran pertama, akan dicari data dengan nilai terkecil dan data ini akan ditempatkan pada indeks terkecil, pada putaran kedua akan dicari data kedua terkecil, dan akan ditempatkan di indeks kedua, begitu seterusnya hingga tidak ada data yang dicari lagi. Selama proses, pembandingan dan pengubahan hanya dilakukan pada indeks pembanding saja, pertukaran data secara fisik terjadi pada akhir proses. Contoh fungsi selection sort: //Selection Sort void selection (int a[],int n) {
Prodi Manajemen Informatika - Polmed
10
Modul Praktikum Struktur Data
int i,j,pos; for (i=1;i
Analogi pengurutan kartu. Proses dilakukan dengan membandingkan data ke-i dengan data yang sebelum-sebelumnya. Misal ascending: pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika ditemukan data yang lebih kecil, maka akan dimasukkan di posisi yang seharusnya. Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang. Contoh fungsi insertion sort: //Insertion Sort void insertion (int a[],int n) { int i,j,v; for (i=2;i<=n;i++) { v=a[i]; j=1; while (a[j-1]>v) { a[j]=a[j-1] j--; a[j=v]; } }
5. Quick Sort
Bersifat divide & conquer . Merupakan metode pencarian yang sangat cepat (saat ini tercepat). Pertama-tama deret dibagi menjadi dua bagian, misal, semua elemen pada bagian b (bagian pertama) mempunyai kurang dari atau sama dengan semua elemen pada bagaian c (bagian kedua -- membagi). Kemudian kedua bagian tersebut dilakukan proses sorting dengan rekursif secara terpisah dengan prosedur yang sama(coquer). Kemudian gabungkan lagi kedua bagian terpisah tersebut.
Prodi Manajemen Informatika - Polmed
11
Modul Praktikum Struktur Data
Langkah: o Memilih sebuah elemen pembanding (pivot), misal x. o Semua elemen dari deret tersebut yang kurang dari x diletakkan pada bagian pertama. o Kemudian semua elemen dari yang lebih besar dari x diletakkan pada bagian kedua. o Untuk elemen yang sama dengan x bisa diletakkan di mana saja bahkan bisa juga di antara kedua bagian tersebut. Algoritma partisi: Masukan : array A[n] dengan n elemen Keluaran : permutasi dari array sedemikian sehingga smua elemen A[0], …, A[j] kurang dari atau sama dengan semua elemen A[i], …, A[n-1] (i > j) Metode
: pilih elemen di pertengahan array sebagai elemen pembanding x
Buat i = 0 dan j = n-1 Selama i
j
Cari elemen pertama A[i] yang lebih besar atau sama dengan x Cari elemen terakhir A[j] yang lebih kecil atau sama dengan x Jika i
j Tukarkan A[i] dan A[j]
o
o
o o
Buat i = i+1 dan j = j-1 Setelah mempartisi, prosedur sorting akan dilakukan secara rekursif. Hingga proses rekursif tersebut akan berhenti saat sebuah bagian hanya tinggal terdapat satu elemen saja. Tidak baik digunakan jika elemen-elemen yang akan diurutkan hanya ada sedikit atau sudah hamper terurut, karena jika menggunakan metode ini justru akan melakukan perulangan yang tidak berguna dan lama. Mempunyai algoritma dan program yang cukup kompleks. Contoh fungsi quick sort: //Quick Sort void quicksort (int a[],int l,int r) {
Prodi Manajemen Informatika - Polmed
12
Modul Praktikum Struktur Data
int i,j,v; if(r>1) { v=a[r];i=l-1;j=r; for(;;) { while(a[++i]v); if(i>=j) break; tukar(a,i,j) } tukar(a,i,r); quicksort(a,l,i-1); quicksort(a,i+1,r); } }
PERCOBAAN 1. Tuliskan program untuk mengurutkan barisan karakter dengan menggunakan bubble sort berikut ini, kemudian lihat hasilnya dan beri penjelasan // Program untuk mengurutkan barisan karakter // menggunakan bubble sort #include #include using namespace std; void Urutkan(char* str) { unsigned int n = strlen(str); unsigned int i, j; for (i = 1; i < n; i++) for (j = n-1; j >= i; j--) if (str[j] < str[j-1]) { char temp = str[j]; str[j] = str[j-1]; str[j-1] = temp; }; }; int main() { char BarisanKarakter[1024]; // Input barisan karakter cout << "Masukkan barisan karakter: "; cin >> BarisanKarakter; // Urutkan Urutkan(& BarisanKarakter[0]); // Tampilkan hasilnya cout << "Setelah diurutkan: " << BarisanKarakter << endl; return 0; };
2. Buatlah program yang sama seperti pada no. 1 untuk metode sorting yang lain, yaitu selection sort, insertion sort, quick sort , dan merge sort .
Prodi Manajemen Informatika - Polmed
13
Modul Praktikum Struktur Data
LATIHAN
1. Buatlah program lengkap yang dapat menampilkan semua hasil sorting dalam lima metode sorting yang dijelaskan di depan dengan menggunakan menu. 2. Dari program tersebut tambahkanlah bagian program yang dapat menampilkan proses sorting yang sebenarnya terjadi (tidak hanya hasil akhirnya saja). 3. Buat program yang membaca masukan berupa string . Kemudian program melakukan proses QWERTYUIOPASDFGHJKLZXCVBNM sorting sehingga menjadi string ABCDEFGHIJKLMNOPQRSTUVWXYZ. 4. Buat program dengan masukan NIM, nama, dan umur untuk 10 mahasiswa, kemudian lakukan sorting terhadap masukan berdasar kan NIM.
Prodi Manajemen Informatika - Polmed
14
Modul Praktikum Struktur Data
MODUL 3
Pertemuan : V dan VI Judul Modul : Stack dengan Array Tujuan : Memahami pengertian stack Dapat mengimplementasikan stack dengan menggunakan array
DASAR TEORI
Stack atau tumpukan adalah suatu struktur data yang seolah-olah terlihat seperti data yang tersusun secara „menumpuk‟; dalam hal ini, ada data yang terletak di atas data yang lainnya. Penyimpanan data di dalam stack bersifat LIFO (Last In First Out), yang berarti bahwa data yang masuk terakhir akan keluar pertama. Beberapa operasi dasar pada Stack antara lain: IsFull() mengecek apakah stack sudah penuh IsEmpty() mengecek apakah stack sudah kosong Push() menambah data pada stack pada tumpukan paling atas Pop() mengambil data pada stack pada tumpukan paling atas Tampil() mencetak semua data dalam stack Dalam implementasinya, stack dapat disajikan dengan menggunakan struktur data statis maupun dinamis. Implementasi dengan struktur data statis pada percobaan ini adalah dengan menggunakan array. Berikut ini adalah cara deklarasi stack dengan menggunakan array: typedef struct STACK{ int top; char data[10][10]; //misalkan : data adalah array of string //berjumlah 10 data, masing-masing string //menampung maksimal 10 karakter };
STACK tumpuk;
Pada keadaan awal, stack diinisialisasi dengan fungsi inisialisasi() seperti berikut ini: void inisialisasi(){ tumpuk.top = -1; }
Elemen top dari stack diisi dengan nilai -1, karena array dalam C dimulai dari 0, yang berarti stack adalah kosong. Top adalah suatu variabel penanda dalam STACK yang menunjukkan elemen teratas Stack sekarang. Top Of Stack akan selalu bergerak hingga mencapai MAX_STACK (di sini, MAX_STACK adalah ukuran maksimum stack) sehingga menyebabkan stack penuh.
Prodi Manajemen Informatika - Polmed
15
Modul Praktikum Struktur Data
Untuk memeriksa apakah stack sudah penuh, digunakan fungsi IsFull(): int IsFull(){ if(tumpuk.top == MAX_STACK-1) return 1; else return 0; }
Sementara itu, untuk memeriksa apakah stack kosong, dapat dibuat fungsi IsEmpty(): int IsEmpty(){ if(tumpuk.top == -1) return 1; else return 0; }
Adapun fungsi Push() dan Pop() masing-masing diimplementasikan sebagai berikut: void Push(char d[10]){ tumpuk.top++; strcpy(tumpuk.data[tumpuk.top],d); } void Pop(){ printf("Data yang terambil = %s\n",tumpuk.data[tumpuk.top]); tumpuk.top--; }
Untuk menampilkan seluruh data dari stack, maka digunakan perulangan. Karena bersifat LIFO, maka data yang pertama ditampilkan adalah yang berada pada elemen teratas (yaitu yang terakhir sekali disimpan di stack). Fungsi untuk menampilkan ini dapat dibuat sebagai berikut: void TampilStack(){ for(int i=tumpuk.top;i>=0;i--){ printf("Data : %s\n",tumpuk.data[i]); } }
Prodi Manajemen Informatika - Polmed
16
Modul Praktikum Struktur Data
PERCOBAAN
Berikut ini adalah contoh implementasi program menggunakan stack. Ketiklah program berikut ini, kemudian lihat hasilnya, dan beri penjelasannya. #include #include //deklarasi 'STACK' dengan struct dan array struct STACK { int data[5]; int atas; }; //deklarasi variabel 'tumpuk' dari struct STACK tumpuk; void main() { clrscr(); int pilihan,baru,i; //inisialisasi awal tumpuk.atas=-1; do { clrscr(); printf("1.Push Data\n"); printf("2.Pop Data\n"); printf("3.Print Data\n"); printf("\nPilihan = "); scanf("%i",&pilihan); switch(pilihan) { case 1: { if(tumpuk.atas==5-1) { printf("Tumpukan penuh"); getch(); } else { printf("Data yang akan di-push = "); scanf("%d",&baru); tumpuk.atas++; tumpuk.data[tumpuk.atas]=baru; } break; } case 2: { if(tumpuk.atas==-1) { printf("Tumpukan kosong"); getch(); } else { printf("Data yang akan di-pop = %d", tumpuk.data[tumpuk.atas]); tumpuk.atas--; getch(); } break; }
Prodi Manajemen Informatika - Polmed
17
Modul Praktikum Struktur Data
case 3: { if(tumpuk.atas==-1) { printf("Tumpukan kosong"); getch(); } else { printf("Data = "); for(i=0; i<=tumpuk.atas; i++) { printf("%d ",tumpuk.data[i]); } getch(); } break; } default: { printf("\nTidak ada dalam pilihan"); } } }while(pilihan>=1 && pilihan<=3); getch(); }
LATIHAN
1. Ubahlah contoh program stack di depan dalam bentuk fungsi-fungsi yang terpisah dari program utama (fungsi IsFull, IsEmpty, Push, Pop, Tampil) 2. Dengan menggunakan struktur data stack, buatlah program yang menerima masukan berupa string nama Anda. Program kemudian membalik string nama, dan menampilkan string nama yang sudah dibalik itu. 3. Buatlah program yang menerima masukan berupa ekspresi matematika dalam notasi postfix, kemudian menghitung (mengevaluasi) hasilnya. Operator matematika yang digunakan adalah +, – , *, dan /. Contoh: ekspresi dalam notasi infix 10 + 3 * 5 dapat diubah menjadi notasi postfix 3 5 * 10 + Notasi postfix ini kemudian menjadi masukan bagi program. Program membutuhkan dua buah stack, stack Soal (untuk menyimpan data ekspresi dalam notasi postfix) dan stack Hasil (untuk menyimpan hasil evaluasi ekspresi matematika) dan dievaluasi dengan algoritma sebagai berikut: i.
Pop Stack Soal: a. Jika berupa operand, maka Push ke Stack Hasil b. Jika berupa operator, maka i. Pop nilai pertama dari Stack Hasil ii. Pop nilai kedua dari Stack Hasil iii. Lakukan operasi sesuai dengan operator yang didapat. ii. Ulangi langkah i sampai selesai.
Prodi Manajemen Informatika - Polmed
18
Modul Praktikum Struktur Data
MODUL 4
Pertemuan : VII dan VIII Judul Modul : Queue dengan Array Tujuan : Memahami pengertian queue Dapat mengimplementasikan queue dengan menggunakan array
DASAR TEORI
Secara harfiah, queue berarti antrian. Dalam suatu antrian, yang datang lebih dahulu akan dilayani dan akan keluar lebih dahulu. Karena itu, queue merupakan sebuah struktur data yang bersifat FIFO (First In First Out), yaitu data yang pertama sekali disimpan (masuk ke antrian) akan merupakan data yang pertama sekali diambil (keluar dari antrian). Seperti halnya stack, struktur data queue juga dapat diimplementasikan dengan menggunakan array.
Queue dapat dideklarasikan sebagai berikut: #define MAX 8 typedef struct{ int data[MAX]; int head; int tail; } Queue; Queue antrian;
Beberapa operasi dasar pada queue adalah sebagai berikut: 1) Create() Untuk menciptakan dan menginisialisasi Queue Dengan cara membuat Head dan Tail = -1
void Create (){ antrian.head=antrian.tail=-1; }
2) IsEmpty() Untuk memeriksa apakah Antrian sudah penuh atau belum Dengan cara memeriksa nilai Tail, jika Tail = -1 maka empty
Prodi Manajemen Informatika - Polmed
19
Modul Praktikum Struktur Data
Head tidak diperiksa, karena Head adalah tanda untuk kepala antrian (elemen pertama dalam antrian) yang tidak akan berubah-ubah Pergerakan pada Antrian terjadi dengan penambahan elemen antrian ke belakang, yaitu menggunakan nilai Tail
int IsEmpty (){ if(antrian.tail==-1) return 1; else return 0; }
3) IsFull() Untuk mengecek apakah Antrian sudah penuh atau belum Dengan cara mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1 adalah batas elemen array pada C) berarti sudah penuh
int IsFull(){ if(antrian.tail==MAX-1) return 1; else return 0; }
4) EnQueue(data) Untuk menambahkan elemen ke dalam Antrian, penambahan elemen selalu ditambahkan di elemen paling belakang Penambahan elemen selalu menggerakan variabel Tail dengan cara increment counter Tail
void EnQueue(int data){ if(IsEmpty()==1){ antrian.head=antrian.tail=0; antrian.data[antrian.tail]=data; printf("%d masuk!",antrian.data[antrian.tail]); } else if(IsFull()==0){ antrian.tail++; antrian.data[antrian.tail]=data; printf("%d masuk!",antrian.data[antrian.tail]); } }
5) DeQueue() Digunakan untuk menghapus elemen terdepan/pertama dari Antrian
Prodi Manajemen Informatika - Polmed
20
Modul Praktikum Struktur Data
Dengan cara mengurangi counter Tail dan menggeser semua elemen antrian kedepan. Penggeseran dilakukan dengan menggunakan looping
int DeQueue (){ int i; int e = antrian.data[antrian.head]; for(i=antrian.head;i<=antrian.tail-1;i++){ antrian.data[i] = antrian.data[i+1]; } antrian.tail--; return e; }
6) Clear() Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan Head = -1 Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus arraynya, namun hanya mengeset indeks pengaksesan-nya ke nilai -1 sehingga elemenelemen Antrian tidak lagi terbaca
void Clear(){ antrian.head=antrian.tail=-1; printf("data clear"); }
7) Tampil() Untuk menampilkan nilai-nilai elemen Antrian Menggunakan looping dari head sampai dengan tail void Tampil (){ if(IsEmpty()==0){ for(int i=antrian.head;i<=antrian.tail;i++){ printf("%d ",antrian.data[i]); } } else printf("data kosong!\n"); }
Prodi Manajemen Informatika - Polmed
21
Modul Praktikum Struktur Data
PERCOBAAN
Berikut ini adalah implementasi program menggunakan struktur data queue. Tuliskan program ini, kemudian lihat hasilnya dan beri penjelasan. #include #include void main() { int cek=0, data[20], x, hapus; char pil; do { clrscr(); printf("1. Tambah Antrian\n"); printf("2. Hapus Antrian\n"); printf("3. Lihat Antrian\n"); printf("4. Keluar\n"); printf("Silahkan masukkan pilihan anda... pil=getche();
");
if(pil!='1' && pil !='2' && pil !='3' && pil!='4' ) printf("\n\nAnda salah mengetikkan inputan...\n"); else { if(pil=='1') //ENQUEUE { if(cek==20) printf("\nAntrian Penuh\n\n"); else { printf("\nMasukkan nilai--> ");scanf("%i",&x); data[cek]=x; cek++; } } else { if(pil=='2') //DEQUEUE { if(cek==0) printf("\nAntrian kosong\n\n"); else { hapus=data[0]; for(int v=0;v
Prodi Manajemen Informatika - Polmed
22
Modul Praktikum Struktur Data
printf("%i",data[z]); printf(" | "); } } getch(); } } } } }while(pil!='4'); }
LATIHAN
1. Modifikasi program pada Percobaan sehingga modul-modul program dibuat dalam bentuk fungsi, yaitu Create(), IsEmpty(), IsFull(), EnQueue(), DeQueue(), Clear(), dan Tampil(). 2. Tambahkanlah fungsi untuk mencari suatu elemen dalam queue 3. Tambahkan fungsi untuk mengedit suatu elemen dalam queue 4. Carilah nilai total, rata-rata, terbesar dan terkecil dari elemen-elemen queue dalam function tersendiri 5. Buatlah program untuk simulasi antrian registrasi Polmed. Yang tercatat adalah nim mahasiswa. 6. Kembangkan program tersebut sehingga bisa menyimpan keterangan nim, nama, dan prodi mahasiswa tersebut.
Prodi Manajemen Informatika - Polmed
23
Modul Praktikum Struktur Data
MODUL 5
Pertemuan : IX dan X Judul Modul : Single linked-list non-circlar Tujuan : Memahami pengertian single linked-list non-circlar Dapat mengimplementasikan single linked-list non-circular
DASAR TEORI
Linked list (senarai berkait) adalah sebuah struktur data berupa rangkaian elemen saling berkait dengan setiap elemen dihubungkan dengan elemen lain melalui pointer. Penggunaan pointer untuk mengacu elemen berakibat elemen-elemen bersebelahan secara logika walaupun tidak bersebelahan secara fisik di memori. Masing-masing data dalam linked list disebut node (simpul). Setiap simpul dalam linked list terdiri dai dua bagian, yaitu bagian data bagian pointer yang menunjuk ke simpul lain. Ditinjau dari banyaknya pointer dalam setiap simpul, maka linked list dapat dibedakan atas dua jenis, yaitu single linked-list , memiliki sebuah pointer yang menunjuk ke simpul berikutnya, dan double linked-list , memiliki dua buah pointer yang masing-masing menunjuk ke simpul sebelumnya dan simpul berikutnya. Selanjutnya, single linked-list masih dapat dibedakan atas non-circular (tidak melingkar) dan circular (melingkar). Single linked-list non-circular adalah single linked list yang pointer pada elemen terakhirnya tidak menunjuk ke manapun. Sementara itu, pada single linked-list circular, pointer pada elemen terakhirnya menunjuk ke elemen pertama sehingga membentuk cincin (melingkar). Sebuah single linked list non-circular dapat diilustrasikan seperti berikut:
Pembuatan Single Linked List Deklarasi node untuk single linked list dibuat dengan menggunakan struct seperti berikut: typedef struct TNode{ int data; TNode *next; };
Pembentukan node baru - Menggunakan keyword new yang berarti mempersiapkan sebuah node baru berserta alokasi memorinya
Prodi Manajemen Informatika - Polmed
24
Modul Praktikum Struktur Data
-
Kemudian node tersebut diisi data, dan pointer nextnya menunjuk ke NULL. TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL;
Single Linked List Menggunakan Head - Membutuhkan satu buah variabel pointer: head - Head akan selalu menunjuk pada node pertama
Deklarasi Pointer Penunjuk Kepala Single Linked List Manipulasi linked list tidak bisa dilakukan langsung ke node yang dituju, melainkan harus menggunakan suatu pointer penunjuk ke node pertama dalam linked list (dalam hal ini adalah head). Deklarasinya sebagai berikut:
TNode *head; Fungsi Inisialisasi Single LinkedList void init(){ head = NULL; }
Fungsi untuk mengetahui kosong tidaknya Single LinkedList int isEmpty(){ if(head == NULL) return 1; else return 0; }
Penambahan Data Penambahan data di depan Penambahan node baru akan dikaitkan di node paling depan, namun pada saat pertama kali (data masih kosong), maka penambahan data dilakukan dengan cara head ditunjukkan ke node baru tersebut. Pada prinsipnya adalah mengaitkan node baru dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan. void insertDepan(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL; if(isEmpty()==1){ head=baru; head->next = NULL; } else { baru->next = head; head = baru; } cout<<”Data masuk\n”; }
Ilustrasi: 1. List masih kosong (head=NULL) Prodi Manajemen Informatika - Polmed
25
Modul Praktikum Struktur Data
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20 (penambahan di depan)
Penambahan data di belakang Penambahan data dilakukan di belakang, namun pada saat pertama kali, node langsung ditunjuk oleh head. Penambahan di belakang lebih sulit karena kita membutuhkan pointer bantu untuk mengetahui node terbelakang, kemudian setelah itu, dikaitkan dengan node baru. Untuk mengetahui data terbelakang perlu digunakan perulangan. void insertBelakang (int databaru){ TNode *baru,*bantu; baru = new TNode; baru->data = databaru; baru->next = NULL; if(isEmpty()==1){ head=baru; head->next = NULL; } else { bantu=head; while(bantu->next!=NULL){ bantu=bantu->next; } bantu->next = baru; } cout<<"Data masuk\n"; }
Ilustrasi: 1. List masih kosong (head=NULL)
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20 (penambahan di belakang)
Prodi Manajemen Informatika - Polmed
26
Modul Praktikum Struktur Data
4. Datang data baru, misal 25 (penambahan di belakang)
Menampilkan Data Function untuk menampilkan isi single linked list non circular void tampil(){ TNode *bantu; bantu = head; if(isEmpty()==0){ while(bantu!=NULL){ cout<data<<" "; bantu=bantu->next; } cout<
Penghapusan Data Penghapusan data terdepan void hapusDepan (){ TNode *hapus; int d; if (isEmpty()==0){ if(head->next != NULL){ hapus = head; d = hapus->data; head = head->next; delete hapus; } else { d = head->data; head = NULL; } cout<
Prodi Manajemen Informatika - Polmed
27
Modul Praktikum Struktur Data
else cout<<"Masih kosong\n"; }
Penghapusan data di belakang: void hapusBelakang(){ TNode *hapus,*bantu; int d; if (isEmpty()==0){ if(head->next != NULL){ bantu = head; while(bantu->next->next!=NULL){ bantu = bantu->next; } hapus = bantu->next; d = hapus->data; bantu->next = NULL; delete hapus; } else { d = head->data; head = NULL; } cout<
Ilustrasi:
Penghapusan semua elemen Linked List void clear(){
Prodi Manajemen Informatika - Polmed
28
Modul Praktikum Struktur Data
TNode *bantu,*hapus; bantu = head; while(bantu!=NULL){ hapus = bantu; bantu = bantu->next; delete hapus; } head = NULL; }
Single Linked List Menggunakan Head Dan Tail - Membutuhkan dua buah variabel pointer: head dan tail Head akan selalu menunjuk pada node pertama, sedangkan tail akan selalu menunjuk pada node terakhir.
Inisialisasi LinkedList TNode *head, *tail;
Fungsi Inisialisasi LinkedList void init(){ head = NULL; tail = NULL; }
Fungsi untuk mengetahui kosong tidaknya LinkedList int isEmpty(){ if(tail == NULL) return 1; else return 0; }
Penambahan Data Pengaitan node baru ke linked list di depan Penambahan data baru di depan akan selalu menjadi head. void insertDepan(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL; if(isEmpty()==1){ head=tail=baru; tail->next=NULL; } else { baru->next = head; head = baru; } cout<<”Data masuk\n”; }
Ilustrasi: 1. List masih kosong (head=tail=NULL
Prodi Manajemen Informatika - Polmed
29
Modul Praktikum Struktur Data
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20
Penambahan Data di belakang Pada penambahan data di belakang, data akan selalu dikaitkan dengan tail, karena tail terletak di node paling belakang. Setelah dikaitkan dengan node baru, maka node baru tersebut akan menjadi tail baru. void tambahBelakang(int databaru){ TNode *baru,*bantu; baru = new TNode; baru->data = databaru; baru->next = NULL; if(isEmpty()==1){ head=baru; tail=baru; tail->next = NULL; } else { tail->next = baru; tail=baru; } cout<<"Data masuk\n"; }
Ilustrasi: 1. List masih kosong (head=tail=NULL)
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20
Prodi Manajemen Informatika - Polmed
30
Modul Praktikum Struktur Data
Kelebihan dari Single Linked List dengan Head & Tail adalah pada penambahan data di belakang, hanya dibutuhkan tail yang mengikat node baru saja tanpa harus menggunakan perulangan pointer bantu. Fungsi untuk menampilkan isi linked list: void tampil(){ TNode *bantu; bantu = head; if(isEmpty()==0){ while(bantu!=NULL){ cout<data<<" "; bantu=bantu->next; } cout<
Penghapusan data di depan void hapusDepan(){ TNode *hapus; int d; if (isEmpty()==0){ if(head!=tail){ hapus = head; d = hapus->data; head = head->next; delete hapus; } else { d = tail->data; head=tail=NULL; } cout<
Prodi Manajemen Informatika - Polmed
31
Modul Praktikum Struktur Data
Penghapusan data di belakang: Dengan menggunakan Single Linked List ber-Head dan Tail, pengahapusan data di belakang akan mudah dilakukan, tidak seperti pada Single Linked List hanya berHead saja. void hapusBelakang(){ TNode *bantu,*hapus; int d; if (isEmpty()==0){ bantu = head; if(head!=tail){ while(bantu->next!=tail){ bantu = bantu->next; } hapus = tail; tail=bantu; d = hapus->data; delete hapus; tail->next = NULL; } else { d = tail->data; head=tail=NULL; } cout<
Ilustrasi:
Prodi Manajemen Informatika - Polmed
32
Modul Praktikum Struktur Data
Penghapusan semua elemen LinkedList void clear(){ TNode *bantu,*hapus; bantu = head; while(bantu!=NULL){ hapus = bantu; bantu = bantu->next; delete hapus; } head = NULL; tail = NULL; }
PERCOBAAN 1. Buatlah program lengkap dengan menggunakan menu untuk single linked-list non-circular yang menggunakan head dan memiliki fungsi-fungsi seperti yang telah diberikan pada Dasar Teori: init() isEmpty() insertDepan() insertBelakang() hapusDepan() hapusBelakang() clear() 2. Buatlah program seperti pada no. 1, tetapi menggunakan head dan tail.
LATIHAN 1. Buatlah sebuah linked-list non-circular yang berisi nim Anda dan nama lengkap Anda. 2. Buat fungsi untuk menambahkan node single linked-list non-circular dengan tiap node mengandung informasi nim dan nama. Peletakan posisi node diurutkan berdasar nim secara ascending, jadi bisa tambah depan, belakang maupun tambah di tengah. Isikan data nim dan nama lengkap teman sebelah kiri dan kanan Anda. 3. Buatlah fungsi untuk menampilkan data 3 buah node yang telah anda bentuk sebelumnya. Contoh tampilan NIM Nama Lengkap 22053766 Hernawan 22053768 Andrew S 22053791 Anthony S 4. Buatlah fungsi untuk mencari nama yang telah diinputkan dengan menggunakan NIM. Contoh tampilan: Nim yang dicari: 22053768
Prodi Manajemen Informatika - Polmed
33
Modul Praktikum Struktur Data
Nama yang bersangkutan adalah Andrew S
5. Buatlah sebuah fungsi untuk menghapus nim yang diinputkan oleh user. Contoh tampilan: NIM yang mau dihapus: 2205376 NIM dengan nama Andrew S ditemukan dan telah dihapus
6. Buatlah sebuah program dengan menggunakan single linked-list non-circular dengan fungsi-fungsi berikut ini: menambah data(dari depan dan dari belakang) search data yang telah diinputkan menghapus data( dari depan dan dari belakang) mencetak data Buatlah dengan menggunakan menu. 7. Dengan menggunakan soal no 6 tambahkan 4 fungsi berikut ini: menambah data (di tengah) menghapus data tertentu(berada di tengah) mengurutkan data acak secara acending mengurutkan data acak secara decending
Prodi Manajemen Informatika - Polmed
34
Modul Praktikum Struktur Data
MODUL 6
Pertemuan : XI dan XII Judul Modul : Single linked-list circlar Tujuan : Memahami pengertian single linked-list circlar Dapat mengimplementasikan single linked-list circular
DASAR TEORI
Single linked-list circular adalah single linked-list yang pointer pada elemen (simpul) terakhirnya menunjuk ke elemen (simpul) pertama sehingga membentuk cincin (melingkar).
Pembuatan Single Linked List Circular Deklarasi node typedef struct TNode{ int data; TNode *next; };
Pembentukan node baru TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru;
Single Linked List Circular Menggunakan Head - Membutuhkan satu buah variabel pointer: head Head akan selalu menunjuk pada node pertama -
Deklarasi Pointer Head Single Linked List TNode *head;
Fungsi Inisialisasi Single LinkedList void init(){ head = NULL; }
Fungsi untuk mengetahui kosong tidaknya Single LinkedList int isEmpty(){ if(head == NULL) return 1; else return 0; }
Prodi Manajemen Informatika - Polmed
35
Modul Praktikum Struktur Data
Penambahan Data Penambahan data di depan Untuk menghubungkan node terakhir dengan node terdepan dibutuhkan pointer bantu. void insertDepan(int databaru){ TNode *baru,*bantu; baru = new TNode; baru->data = databaru; baru->next = baru; if(isEmpty()==1){ head=baru; head->next=head; } else { bantu = head; while(bantu->next!=head){ bantu=bantu->next; } baru->next = head; head = baru; bantu->next = head; } cout<<"Data masuk\n"; }
Ilustrasi: 1. List masih kosong (head=NULL)
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20 (penambahan di depan)
Penambahan data di belakang Penambahan di belakang lebih sulit karena kita membutuhkan pointer bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan data baru. Untuk mengetahui data terbelakang perlu digunakan perulangan. void insertBelakang (int databaru){ TNode *baru,*bantu; baru = new TNode; baru->data = databaru;
Prodi Manajemen Informatika - Polmed
36
Modul Praktikum Struktur Data
baru->next = baru; if(isEmpty()==1){ head=baru; head->next=head; } else { bantu = head; while(bantu->next != head){ bantu=bantu->next; } bantu->next = baru; baru->next = head; } cout<<"Data masuk\n"; }
Ilustrasi : 1. List masih kosong (head=NULL)
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20 (penambahan di belakang)
4. Datang data baru, misal 25 (penambahan di belakang)
Menampilkan Data Function untuk menampilkan isi single linked list void tampil(){ TNode *b; b = head;
Prodi Manajemen Informatika - Polmed
37
Modul Praktikum Struktur Data
if(isEmpty()==0){ do{ cout<data<<" "; b=b->next; }while(b!=head); cout<
Penghapusan Data Penghapusan data terdepan void hapusDepan (){ TNode *hapus,*bantu; if (isEmpty()==0){ int d; hapus = head; d = head->data; if(head->next != head){ bantu = head; while(bantu->next!=head){ bantu=bantu->next; } head = head->next; delete hapus; bantu->next = head; } else head=NULL; cout<
Penghapusan data di belakang: void hapusBelakang(){ TNode *hapus,*bantu; if (isEmpty()==0){ int d; hapus = head; if(head->next == head){ head = NULL; } else{
Prodi Manajemen Informatika - Polmed
38
Modul Praktikum Struktur Data
bantu = head; while(bantu->next->next != head) bantu = bantu->next; hapus = bantu->next; d = bantu->data; bantu->next = head; delete hapus; } cout<
Ilustrasi:
Function untuk menghapus semua elemen Linked List void clear(){ TNode *bantu,*hapus; bantu = head; while(bantu->next!=head){ hapus = bantu; bantu = bantu->next; delete hapus; } head = NULL; }
Single Linked List Menggunakan Head Dan Tail - Membutuhkan dua buah variabel pointer: head dan tail Head akan selalu menunjuk pada node pertama, sedangkan tail akan selalu menunjuk pada node terakhir.
Prodi Manajemen Informatika - Polmed
39
Modul Praktikum Struktur Data
Inisialisasi LinkedList TNode *head, *tail;
Fungsi Inisialisasi LinkedList void init(){ head = NULL; tail = NULL; }
Fungsi untuk mengetahui kosong tidaknya LinkedList int isEmpty(){ if(tail == NULL) return 1; else return 0; }
Penambahan Data Penambahan data baru di depan void insertDepan(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru; if(isEmpty()==1){ head=baru; tail=baru; head->next=head; tail->next=tail; } else { baru->next = head; head = baru; tail->next = head; } cout<<"Data masuk\n"; }
Ilustrasi: 1. List masih kosong (head=tail=NULL)
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20
Prodi Manajemen Informatika - Polmed
40
Modul Praktikum Struktur Data
Penambahan Data di belakang Pada penambahan data di belakang, data akan selalu dikaitkan dengan tail, karena tail terletak di node paling belakang. Setelah dikaitkan dengan node baru, maka node baru tersebut akan menjadi tail. void tambahBelakang(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru; if(isEmpty()==1){ head=baru; tail=baru; head->next=head; tail->next=tail; } else { tail->next = baru; tail = baru; tail->next = head; } cout<<"Data masuk\n"; }
Ilustrasi: 1. List masih kosong (head=tail=NULL)
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20
Function untuk menampilkan isi linked list: void tampil(){ TNode *b; b = head; if(isEmpty()==0){ do{ cout<data<<" "; b=b->next; }while(b!=tail->next); cout<
Prodi Manajemen Informatika - Polmed
41
Modul Praktikum Struktur Data
Fungsi untuk menghapus data di depan void hapusDepan(){ TNode *hapus; if (isEmpty()==0){ int d; hapus = head; d = head->data; if(head != tail){ hapus = head; head = head->next; tail->next = head; delete hapus; } else head=tail=NULL; cout<
Fungsi untuk menghapus data di belakang: void hapusBelakang(){ TNode *hapus,*bantu; if (isEmpty()==0){ int d; if(head == tail){ d = tail->data; head = tail = NULL; } else{ bantu = head; while(bantu->next != tail) bantu = bantu->next; hapus = tail; tail = bantu; d = hapus->data;
Prodi Manajemen Informatika - Polmed
42
Modul Praktikum Struktur Data
tail->next = head; delete hapus; } cout<
Ilustrasi:
Fungsi untuk menghapus semua elemen LinkedList void clear(){ TNode *bantu,*hapus; if(isEmpty() == 0){ bantu = head; while(bantu->next!=head){ hapus = bantu; bantu = bantu->next; delete hapus; } head = NULL; tail = NULL; } }
PERCOBAAN 1. Buatlah program lengkap dari semua algoritma dan fungsi di atas dalam bentuk menu untuk menambah data, melihat data, dan menghapus data. 2. Buatlah fungsi tambahan yang berguna untuk mencari data yang ada dalam linked list baik secara ber-Head maupun ber-Head dan Tail. 3. Buatlah fungsi untuk menghapus data tertentu dalam linked list. 4. Buatlah fungsi untuk menyisipkan node setelah atau sebelum data tertentu.
LATIHAN 1. Buatlah sebuah Single Linked List Circular dengan data bertipe integer yang mempunyai 5 buah simpul dengan nilai data pada masing-masing simpul (mulai dari simpul pertama atau head sampai simpul terakhir atau tail) adalah 50, 40, 30, 20, dan 10. a. Tuliskan listing program untuk membaca data dari seluruh simpul dengan menggunakan perulangan (for/while)
Prodi Manajemen Informatika - Polmed
43
Modul Praktikum Struktur Data
b. TuIiskan listing program untuk menambah sebuah simpul baru dengan data 5 yang diletakan diantara data 30 dan data 20. c. Tuliskan listing program untuk menghapus simpul dengan data 20 tanpa merusak senarai. d. Tuliskan listing program untuk menghapus semua simpul dengan menggunakan variabel bantu dengan menggunakan perulangan (while/for). 2. Buatlah program Single Linked List Circular yang fleksibel dan dinamis. Dimana user dapat menambah simpul baru beserta datanya, membaca semua data pada senarai, menghapus simpul dengan data yang ditentukan oleh user, dan dapat menghapus semua simpul yang ada. Jangan Iupa membuat trapping errornya. 3. Buatlah sebuah link list yang berisi data-data identitas KTP (nama, alamat, no KTP) buatlah menu sebagai berikut: a. Input entry KTP ( input akan langsung terurutkan berdasarkan no KTP asending ) b. Delete file yang diinginkan user. c. Searching entry KTP d. Cetak semua entry KTP e. Cetak entry KTP tertentu 4. Buatlah 3 link list yang merepresentasikan jam(1-12), menit(1-60) dan detik(160). Mintalah inputan dari user berupa jumlah detik. Konversikan jumlah detik tersebut dan masukkan ke dalam link list (gunakan pointer jam,menit,detik) kemudian cetak jam yang tertera di link list tersebut.
Prodi Manajemen Informatika - Polmed
44
Modul Praktikum Struktur Data
MODUL 7
Pertemuan : XIII dan XIV Judul Modul : Double linked-list non-circlar Tujuan : Memahami pengertian double linked-list non-circlar Dapat mengimplementasikan double linked-list non-circular
DASAR TEORI
Seperti halnya single linked-list, maka double linked-list juga dapat dibedakan atas non-circular dan circular. Dengan demikian, pembahasannya juga tidak jauh berbeda. Modul ini membahas double linked-list non-circular yang diimplementasikan dengan menggunakan head saja dan juga dengan menggunakan head dan tail. Ilustrasi double linked-list non-circular:
Deklarasi node: typedef struct TNode{ int data; TNode *next; Tnode *prev; };
Pembentukan node baru TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL; baru->prev = NULL;
Double Linked List Non Circular Menggunakan Head
Deklarasi Pointer Head TNode *head;
Fungsi Inisialisasi LinkedList void init(){ head = NULL; }
Fungsi untuk mengetahui kosong tidaknya LinkedList
Prodi Manajemen Informatika - Polmed
45
Modul Praktikum Struktur Data
int isEmpty(){ if(head == NULL) return 1; else return 0; }
PENAMBAHAN DATA Penambahan data di depan void insertDepan(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL; baru->prev = NULL; if(isEmpty()==1){ head=baru; head->next = NULL; head->prev = NULL; } else { baru->next = head; head->prev = baru; head = baru; } cout<<”Data masuk\n”; }
Ilustrasi: 1. List masih kosong (head=NULL)
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20
Penambahan data di belakang void insertBelakang (int databaru){ TNode *baru,*bantu; baru = new TNode; baru->data = databaru; baru->next = NULL; baru->prev = NULL; if(isEmpty()==1){
Prodi Manajemen Informatika - Polmed
46
Modul Praktikum Struktur Data
head=baru; head->next = NULL; head->prev = NULL; } else { bantu=head; while(bantu->next!=NULL){ bantu=bantu->next; } bantu->next = baru; baru->prev = bantu; } cout<<"Data masuk\n"; }
Fungsi untuk menampilkan isi linked list void tampil(){ TNode *bantu; bantu = head; if(isEmpty()==0){ while(bantu!=NULL){ cout<data<<" "; bantu=bantu->next; } cout<
Penghapusan Data Fungsi untuk menghapus data di depan: void hapusDepan (){ TNode *hapus; int d; if (isEmpty()==0){ if(head->next != NULL){ hapus = head; d = hapus->data; head = head->next; head->prev = NULL; delete hapus; } else { d = head->data; head = NULL; } cout<
Prodi Manajemen Informatika - Polmed
47
Modul Praktikum Struktur Data
Fungsi untuk menghapus node terbelakang void hapusBelakang(){ TNode *hapus; int d; if (isEmpty()==0){ if(head->next != NULL){ hapus = head; while(hapus->next!=NULL){ hapus = hapus->next; } d = hapus->data; hapus->prev->next = NULL; delete hapus; } else { d = head->data; head = NULL; } cout<
Fungsi untuk menghapus semua elemen void clear(){ TNode *bantu,*hapus; bantu = head; while(bantu!=NULL){ hapus = bantu; bantu = bantu->next; delete hapus; } head = NULL; }
Double Linked List Non Circular Menggunakan Head Dan Tail
Inisialisasi: TNode *head, *tail;
Prodi Manajemen Informatika - Polmed
48
Modul Praktikum Struktur Data
Fungsi Inisialisasi DLLNC void init(){ head = NULL; tail = NULL; }
Fungsi untuk mengetahui kosong tidaknya Linked List int isEmpty(){ if(tail == NULL) return 1; else return 0; }
Penambahan node di depan void insertDepan (int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL; baru->prev = NULL; if(isEmpty()==1){ head=baru; tail=head; head->next = NULL; head->prev = NULL; tail->prev = NULL; tail->next = NULL; } else { baru->next = head; head->prev = baru; head = baru; } cout<<"Data masuk\n"; }
Penambahan node di belakang void insertBelakang(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL; baru->prev = NULL; if(isEmpty()==1){ head=baru; tail=head; head->next = NULL; head->prev = NULL; tail->prev = NULL; tail->next = NULL; } else { tail->next = baru; baru->prev = tail; tail = baru; tail->next = NULL; } cout<<"Data masuk\n"; }
Prodi Manajemen Informatika - Polmed
49
Modul Praktikum Struktur Data
Fungsi untuk menampilkan isi linked list void tampil(){ TNode *bantu; bantu = head; if(isEmpty()==0){ while(bantu!=tail->next){ cout<data<<" "; bantu=bantu->next; } cout<
Fungsi untuk menghapus data terdepan void hapusDepan(){ TNode *hapus; int d; if (isEmpty()==0){ if(head->next != NULL){ hapus = head; d = hapus->data; head = head->next; head->prev = NULL; delete hapus; } else { d = head->data; head = NULL; tail = NULL; } cout<
Fungsi untuk menghapus node terbelakang void hapusBelakang(){ TNode *hapus; int d; if (isEmpty()==0){ if(head->next != NULL){ hapus = tail; d = tail->data; tail = tail->prev; tail->next = NULL; delete hapus; } else { d = head->data; head = NULL; tail = NULL; cout<
Fungsi untuk menghapus semua elemen LinkedList void clear(){ TNode *bantu,*hapus; bantu = head;
Prodi Manajemen Informatika - Polmed
50
Modul Praktikum Struktur Data
while(bantu!=NULL){ hapus = bantu; bantu = bantu->next; delete hapus; } head = NULL; tail = NULL; }
PERCOBAAN 1. Buatlah ilustrasi dari masing-masing potongan program. 2. Buat program lengkap dari potongan-potongan program yang ada di atas. Buat dengan menggunakan menu. 3. Buat program untuk memasukkan node baru tetapi di antara node yang sudah ada. Tentukan node yang baru akan berada pada antrian keberapa.
LATIHAN 1. Buatlah fungsi tambahan yang berguna untuk mencari data yang ada dalam linked list baik dengan head maupun head & tail. 2. Buatlah fungsi untuk menghapus data tertentu dalam linked list. 3. Buatlah fungsi untuk menampilkan data list secara terbalik. 4. Buatlah fungsi untuk menghitung nilai rata-rata dari sebuah linked-list yang memiliki elemen bertipe float.
Prodi Manajemen Informatika - Polmed
51
Modul Praktikum Struktur Data
MODUL 8
Pertemuan : XV dan XVI Judul Modul : Double linked-list circlar Tujuan : Memahami pengertian double linked-list circlar Dapat mengimplementasikan double linked-list circular
DASAR TEORI
Pada double linked-list cicular, pointer next dan prev menunjuk ke dirinya sendiri secara circular (melingkar).
Pembuatan Double Linked List Circular Deklarasi node typedef struct TNode{ int data; TNode *next; Tnode *prev; };
Pembentukan node baru TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru; baru->prev = baru;
Double Linked List Circular Menggunakan Head
Deklarasi Pointer Head TNode *head;
Fungsi Inisialisasi LinkedList void init(){ head = NULL; }
Prodi Manajemen Informatika - Polmed
52
Modul Praktikum Struktur Data
Fungsi untuk mengetahui kosong tidaknya LinkedList int isEmpty(){ if(head == NULL) return 1; else return 0; }
Penambahan Data Penambahan data di depan void insertDepan(int databaru){ TNode *baru, *bantu; baru = new TNode; baru->data = databaru; baru->next = baru; baru->prev = baru; if(isEmpty()==1){ head=baru; head->next = head; head->prev = head; } else { bantu = head->prev; baru->next = head; head->prev = baru; head = baru; head->prev = bantu; bantu->next = head; } cout<<"Data masuk\n"; }
Ilustrasi: 1. List masih kosong (head=NULL)
2. Masuk data baru, misalnya 5
3. Datang data baru, misalnya 20
4. Datang data baru, misalnya 30
Prodi Manajemen Informatika - Polmed
53
Modul Praktikum Struktur Data
Penambahan data di belakang void insertBelakang (int databaru){ TNode *baru,*bantu; baru = new TNode; baru->data = databaru; baru->next = baru; baru->prev = baru; if(isEmpty()==1){ head=baru; head->next = head; head->prev = head; } else { bantu=head->prev; bantu->next = baru; baru->prev = bantu; baru->next = head; head->prev = baru; } cout<<"Data masuk\n"; }
Fungsi untuk menampilkan isi linked list void tampil(){ TNode *bantu; bantu = head; if(isEmpty()==0){ do{ cout<data<<" "; bantu=bantu->next; }while(bantu!=head); cout<
Penghapusan Data Fungsi untuk menghapus data di depan void hapusDepan (){ TNode *hapus,*bantu; int d; if (isEmpty()==0){ if(head->next != head){ hapus = head; d = hapus->data; bantu = head->prev; head = head->next; bantu->next = head; head->prev = bantu;
Prodi Manajemen Informatika - Polmed
54
Modul Praktikum Struktur Data
delete hapus; } else { d = head->data; head = NULL; } cout<
Fungsi untuk menghapus node node terbelakang void hapusBelakang(){ TNode *hapus,*bantu; int d; if (isEmpty()==0){ if(head->next != head){ bantu = head; while(bantu->next->next != head){ bantu = bantu->next; bantu->next; } hapus = bantu->next; bantu->next; d = hapus->data; hapus->data; bantu->next = head; delete hapus; } else { d = head->data; head = NULL; } cout<
Fungsi untuk menghapus semua semua elemen void clear(){ TNode *bantu,*hapus; if (isEmpty()==0){ bantu = head; while(bantu->next!=head){ hapus = bantu; bantu = bantu->next; bantu->next; delete hapus; } head = NULL; } }
Double Linked List Menggunakan Head Dan Tail
Inisialisasi: TNode *head, *tail;
Prodi Manajemen Informatika - Polmed
55
Modul Praktikum Struktur Data
Fungsi Inisialisasi: void init(){ head = NULL; tail = NULL; }
Fungsi untuk mengetahui kosong tidaknya LinkedList int isEmpty(){ if(tail == NULL) return 1; else return 0; }
Penambahan node di depan void insertDepan (int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru; baru->prev = baru; if(isEmpty()==1){ head=baru; tail=baru; head->next = head; head->prev = head; tail->next = tail; tail->prev = tail; } else { baru->next = head; head->prev = baru; head = baru; head->prev = tail; tail->next = head; } cout<<"Data masuk\n"; }
Penambahan Penambahan node di belakang void insertBelakang(int databaru){ TNode *baru; baru = new TNode; baru->data = databaru; baru->next = baru; baru->prev = baru; if(isEmpty()==1){ head=baru; tail=baru; head->next = head; head->prev = head; tail->next = tail; tail->prev = tail; } else { tail->next = baru; baru->prev = tail; tail = baru; tail->next = head; head->prev = tail; } cout<<"Data masuk\n"; }
Prodi Manajemen Informatika - Polmed
56
Modul Praktikum Struktur Data
Function untuk menampilkan menampilkan isi linked list void tampil(){ TNode *bantu; bantu = head; if(isEmpty()==0){ do{ cout<data<<" "; bantu=bantu->next; }while(bantu!=tail->next); cout<
Function untuk menghapus data terdepan void hapusDepan(){ TNode *hapus; int d; if (isEmpty()==0){ if(head != tail){ hapus = head; d = hapus->data; hapus->data; head = head->next; tail->next = head; head->prev = tail; delete hapus; } else { d = head->data; head = NULL; tail = NULL; } cout<
Function untuk menghapus node terbelakang void hapusBelakang(){ TNode *hapus; int d; if (isEmpty()==0){ if(head != tail){ hapus = tail; d = hapus->data; hapus->data; tail = tail->prev; tail->next = head; head->prev = tail; delete hapus; } else { d = head->data; head = NULL; tail = NULL; } cout<
Prodi Manajemen Informatika - Polmed
57
Modul Praktikum Struktur Data
Function untuk menghapus semua elemen LinkedList void clear(){ TNode *bantu,*hapus; if (isEmpty()==0){ bantu = head; while(bantu->next!=head){ hapus = bantu; bantu = bantu->next; delete hapus; } head = NULL; } }
PERCOBAAN 4. Buatlah ilustrasi dari masing-masing potongan program. 5. Buat program lengkap dari potongan-potongan program yang ada di atas. Buat dengan menggunakan menu. 6. Buat program untuk memasukkan node baru tetapi di antara node yang sudah ada. Tentukan node yang baru akan berada pada antrian keberapa.
LATIHAN 5. Buatlah fungsi tambahan yang berguna untuk mencari data yang ada dalam linked list baik dengan head maupun head & tail. 6. Buatlah fungsi untuk menghapus data tertentu dalam linked list. 7. Buatlah fungsi untuk menampilkan data list secara terbalik. 8. Buatlah fungsi untuk menghitung nilai rata-rata dari sebuah linked-list yang memiliki elemen bertipe float.
Prodi Manajemen Informatika - Polmed
58
Modul Praktikum Struktur Data
MODUL 9
Pertemuan : XVII Judul Modul : Stack dengan linked list Tujuan : Memahami pengertian stack dengan linked-list Dapat mengimplementasikan operasi-operasi dasar pada stack dengan linked list
DASAR TEORI
Selain implementasi stack dengan array, ada cara lain untuk mengimplementasikan stack, yaitu dengan linked list. Pada modul ini, stack akan diimplementasikan dengan single linked list. Keunggulan implementasi dengan linked list dibandingkan dengan array adalah penggunaan alokasi memori yang dinamis sehingga menghindari pemborosan memori. Sebagai contoh, jika sebuah stack dengan array dialokasikan tempat untuk stack berisi 150 elemen, sementara ketika dipakai oleh user stack hanya diisi 50 elemen, maka telah terjadi pemborosan memori untuk sisa 100 tempat elemen yang tidak terpakai. Dengan penggunaan linked list, maka tempat yang digunakan akan sesuai dengan banyaknya elemen yang mengisi stack. Oleh karena itu, dalam stack dengan linked list, tidak ada istilah full (penuh), sebab biasanya program tidak menentukan jumlah elemen stack yang mungkin ada (kecuali jika sudah dibatasi oleh pembuatnya). Namun demikian, sebenarnya stack ini pun memiliki batas kapasitas, yakni dibatasi oleh jumlah memori yang tersedia. Top E
D
C
B
A
NULL
Pembuatan stack dengan single linked list Deklarasi node: typedef struct TNode { int Data; TNode *Next; };
Prodi Manajemen Informatika - Polmed
59
Modul Praktikum Struktur Data
Deklarasi variabel Top: TNode *Top;
Beberapa operasi dasar untuk stack dengan single linked list: 1) Fungsi Init(): void Init() { Top = NULL; }
2) Fungsi isEmpty(): int isEmpty() { if(Top==NULL) return 1; else return 0; }
3) Fungsi Push(): Untuk memasukkan elemen baru ke dalam stack int Push(int X) { TNode *Baru = new TNode; Baru->Data=X; Baru->Next=Top; Top=Baru; return X; }
Ilustrasi: 1. Mula-mula stack masih kosong:
Top NULL
2. Masuk data 23 dengan Push(23): Top
23
NULL
3. Masuk data 11 dengan Push(11): Top 11 23
4) Fungsi Pop(): int Pop() { int X; if(!isEmpty()) { X = Top->Data; TNode *Sampah = Top; Top = Top->Next; delete Sampah; } return X; }
Prodi Manajemen Informatika - Polmed
NULL
60
Modul Praktikum Struktur Data
Ilustrasi: 1. Keadaan awal stack sudah berisi lima
2. Ambil elemen teratas dengan Pop(): Sampah
Top 90
Top
68
52
11
68
52
11 23 23 NULL
5) Fungsi Clear()
NULL
void Clear() { while(!isEmpty()) Pop(); }
PERCOBAAN 1. Buatlah fungsi Tampil () untuk menampilkan semua elemen dalam stack dengan single linked list. 2. Buatlah program lengkap dengan menggunakan menu yang memiliki fungsifungsi dasar untuk operasi pada stack dengan single linked list, yaitu Init(), isEmpty(), Push(), Pop(), dan Tampil();
LATIHAN 1. Dengan menggunakan struktur data stack, buatlah program yang menerima masukan berupa string nama Anda. Program kemudian membalik string nama, dan menampilkan string nama yang sudah dibalik itu. 2. Buatlah program yang menerima masukan berupa ekspresi matematika dalam notasi postfix, kemudian menghitung (mengevaluasi) hasilnya. Operator matematika yang digunakan adalah +, – , *, dan /. Contoh: ekspresi dalam notasi infix 10 + 3 * 5 dapat diubah menjadi notasi postfix 3 5 * 10 +
Prodi Manajemen Informatika - Polmed
61
Modul Praktikum Struktur Data
Notasi postfix ini kemudian menjadi masukan bagi program. Program membutuhkan dua buah stack, stack Soal (untuk menyimpan data ekspresi dalam notasi postfix) dan stack Hasil (untuk menyimpan hasil evaluasi ekspresi matematika) dan dievaluasi dengan algoritma sebagai berikut: 1) Pop Stack Soal: a. Jika berupa operand, maka Push ke Stack Hasil b. Jika berupa operator, maka i. Pop nilai pertama dari Stack Hasil ii. Pop nilai kedua dari Stack Hasil iii. Lakukan operasi sesuai dengan operator yang didapat. 2) Ulangi langkah i sampai selesai.
Prodi Manajemen Informatika - Polmed
62
Modul Praktikum Struktur Data
MODUL 10
Pertemuan : XVIII Judul Modul : Queue dengan linked list Tujuan : Memahami pengertian queue dengan linked-list Dapat mengimplementasikan operasi-operasi dasar pada queue dengan linked list
DASAR TEORI
Selain menggunakan array, queue juga dapat diimplementasikan dengan menggunakan linked list. Pada modul ini, linked list yang digunakan adalah double linked list. Pembuatan queue dengan double linked list adalah melalui deklarasi queue sebagai berikut: typedef struct TNode { int Data; TNode *Prev; TNode *Next; }
Untuk keperluan operasi-operasi pada queue selanjutnya, maka diperlukan variabel Head dan Tail, masing-masing sebagai penunjuk antrian paling depan dan antrian paling belakang. Selain itu, diperlukan juga variabel untuk menyimpan banyaknya data dalam antrian, yaitu Count. TNode *Head, *Tail; unsigned int Count;
Adapun fungsi-fungsi untuk melakukan operasi-operasi dasar yang diperlukan adalah Init() untuk melakukan inisialisasi queue isEmpty() untuk memeriksa apakah queue kosong isFull() untuk memeriksa apakah queue sudah penuh EnQueue() untuk memasukkan sebuah elemen ke dalam queue (mirip dengan fungsi Push pada oerasi stack) DeQueue() untuk mengeluarkan sebuah elemen dari dalam queue (mirip dengan fungsi Pop pada stack) 1) Fungsi Init(): void Init() { Head = NULL; Tail = NULL; Count = 0; }
Head
2) Fungsi isEmpty():
Tail NULL
Count = 0
int isEmpty() { if(Head==NULL) return 1; else return 0; }
Prodi Manajemen Informatika - Polmed
63
Modul Praktikum Struktur Data
3) Fungsi isFull(): int isFull() { if(Count==MAX_QUEUE) // MAX_QUEUE adalah kapasitas queue maksimum return 1; else return 0; }
4) Fungsi EnQueue(): int EnQueue(int X) { if(!isFull()) { TNode *Baru = new TNode; Baru -> Data = X; Baru -> Next = NULL; Baru -> Prev = Tail; if(isEmpty()) Head = Baru; else Tail->Next = Baru; Tail = Baru; Count++; } return X; }
5) Fungsi DeQueue(): int DeQueue() { int Temp; if(!isEmpty()) { Temp=Head->Data; TNode *Sampah = Head; Head=Head->Next; Head->Prev=NULL; delete Sampah; Count--; } return Temp; }
6) Fungsi Clear() void Clear() { while(!isEmpty()) DeQueue(); }
PERCOBAAN 1. Buatlah ilustrasi untuk menggambarkan fungsi EnQueue() dan DeQueue(). 2. Buatlah fungsi Tampil () untuk menampilkan semua elemen dalam queue dengan double linked list. 3. Buatlah program lengkap dengan menggunakan menu untuk operasi-operasi dasar pada queue dengan double linked list, yaitu Init() , isEmpty(), isFull(), EnQueue(), DeQueue(), Clear(), dan Tampil() .
Prodi Manajemen Informatika - Polmed
64
Modul Praktikum Struktur Data
LATIHAN Gunakan fungsi-fungsi untuk operasi-operasi dasar pada struktur data Queue yang elemen datanya berupa nilai float untuk membuat program lengkap menggunakan menu-menu berikut: 1. Masukkan data 2. Hapus data 3. Hapus seluruh data 4. Tampilkan data dalam Queue dengan disertai data statistik: a. Banyak data n n
b. Jumlah semua nilai
x
i
i 1
c. Nilai rata-rata x d. Nilai maksimum e. Nilai minimum 5. Selesai
xmax
xmin
Prodi Manajemen Informatika - Polmed
65