Laboratorium Informatika
Program Studi Teknik Informatika, Fakultas Teknik, Universitas Muhammadiyah Jakarta
Jalan Cempaka Putih Tengah 27, Jakarta 10510
Telepon: (021)70329963
Website: http://if.umj.ac.id/laboratorium/
Email: lab.informatika@ftumj.ac.id
ii
LEMBAR PENGESAHAN
MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA
Disahkan di : Jakarta
Pada Tanggal : 23 Maret 2020
Menyetujui,
Kepala Laboratorium Informatika Fakultas Teknik
Universitas Muhammadiyah Jakarta
Mengesahkan,
PLT Ketua Jurusan Informatika Fakultas Teknik
Universitas Muhammadiyah Jakarta
iii
KATA PENGANTAR
Assalamua’alaikum wr. wb.
Bismillahirrohmanirrohiim
Dengan segala doa dan harapan, modul praktikum Struktur Data Dan Algoritma ini
diharapkan dapat menjadi panduan yang baik dan jelas bagi siapapun yang membacanya.
Modul ini akan digunakan dalam proses belajar praktikum Struktur Data Dan Algoritma.
Tahun ini, Laboratorium Informatika FT-UMJ bekerja sama dengan dosen pengampu mata
kuliah Struktur Data Dan Algoritma berusaha untuk menyelaraskan pelaksanaan praktikum
dengan pelaksanaan kuliah di kelas. Dengan usaha tersebut kami berharap penyerapan materi
Struktur Data Dan Algoritma oleh para mahasiswa dapat lebih efektif, sehingga pada akhir
semester hasil evaluasi belajar mahasiswa dapat lebih meningkat dibandingkan dengan tahun-
tahun yang lalu.
Sebagai penutup, saya ucapkan banyak-banyak terima kasih kepada semua pihak yang telah
membantu terselesaikannya modul ini, dosen-dosen pengampu mata kuliah Struktur Data
Dan Algoritma, serta tim penyusun modul laboratorium informatika FT-UMJ atas seluruh
dedikasi yang diberikan kepada Lab tercinta.
Terima kasih sebelumnya kami sampaikan kepada para pembaca modul ini, semoga ilmu
yang telah dipelajari dapat bermanfaat dan semakin berkembang di tangan anda semua.
Tim Penyusun
iv
DAFTAR ISI
v
Tugas Akhir Modul 3 ............................................................................................ 15
4.3 Union.......................................................................................................... 17
vi
MODUL 1 FUNGSI MASUKKAN DAN KELUARAN
1.1 Typecasting
Typecasting adalah cara untuk mengkonversi variabel dari satu tipe data ke
tipe data yang lain. Misalnya, jika kita ingin menyimpan nilai 'long' integer
menjadi sederhana maka kita gunakan type casting 'long' to 'int'. Kita juga dapat
mengubah nilai-nilai dari satu jenis yang lain secara eksplisit menggunakan
operator cast sebagai berikut :
Syntax :
(type_casting) ekspresi
Contoh program 1-1:
#include <stdio.h>
main()
{
int a = 17, b = 5;
float c;
c = (float)a / b;
printf("C = %f\n", c);
}
putchar('s');
putchar('a');
putchar('y');
putchar('a');
1
puts(" kuliah di ");
puts(a);
return 0;
}
1.4 Array
1.4.1 Pengertian Array
Array adalah kumpulan dari bilangan atau data yang bertipe sama dan
terstruktur dalam urutan tertentu menggunakan sebuah nama yang dimulai dari 0.
Array sendiri dapat digolongkan menjadi tiga bagian dalam penggunaannya dalam
bahasa C yaitu array berdimensi satu, array berdimensi dua, array berdimensi tiga.
Namun pada modul ini hanya akan dibahas sampai array berdimensi dua saja.
2
1.4.2 Array 1 Dimensi
Sebelum digunakan, variabel array perlu dideklarasikan terlebih dahulu.
Cara pendeklarasiannya sama dengan mendeklarasikan variable yang lain hanya
saja diikuti dengan indeks yang menunjukkan jumlah maksimum data yang
disediakan.
Syntax :
tipeData namaVariable[ukuran];
1. #include<stdio.h>
2. main(){
3. float x[ ]={9, 8, 7}, jum=0;
4. int i;
5. for(i=0; i<5; i++)
6. jum+=x[i];
7. printf("Jumlah = %.1f\n", jum);
8. }
3
Contoh program 1-5:
1. #include<stdio.h>
2. int main(){
3. int asli[100], balik[100], jml_data, i;
4. printf(“masukan jumlah data = “);
5. scanf(“%d”, &jml_data);
6. printf(“bilangan = “);
7. for(i=0; i<jml_data; i++)
8. scanf(“%d”,&asli[i]);
9. for(i=0; i<jml_data; i++)
10. balik[i]=asli[jml_data-i-1];
11. for(i=0; i<jml_data; i++)
12. printf(“%d”,balik[i]);
13. return 0;
14. }
4
Contoh program 1-7;
1. #include<stdio.h>
2. main() {
3. int A[3][4], B[3][4], C[3][4],i ,j;
4. puts(“Inputs matrik A dan B”);
5. for(i=0; i<=2; i++){
6. for(j=0; j<4; j++){
7. printf(“A[%d][%d]= “, i, j); scanf(“%d”, &A[i][j]);
8. printf(“B[%d][%d]= “, i, j); scanf(“%d”, &B[i][j]);
9. }
10. }
11. puts(“Jumlahkan Matrik A dan B\n”);
12. for(i=0; i<3; i++){
13. printf(“| “);
14. for(j=0; j<=3; j++){
15. C[i][j]=A[i][j]+B[i][j];
16. printf(“%d “, C[i][j]);
17. }
18. printf(“|\n”);
19. }
20. }
1. #include<stdio.h>
2. main(){
3. int A[3][4], jml=0, i, j;
4. puts(“Input matrik A dan B”);
5. for(i=0; i<=2; i++){
6. for(j=0; j<4; j++){
7. printf(“A[%d][%d]= “,i ,j); scanf(“%d”, &A[i][j]);
8. }
9. }
10. for(i=0; i<3; i++){
11. for(j=0; j<=3; j++){
12. if (i==1)
13. jml+=A[i][j];
14. }
15. }
16. printf(“hasil penjumlahan baris pertama = %d”, jml);
17. }
18.
Tugas Akhir Modul 1
Kerjakanlah tugas berikut ini!
a. Buatlah rangkuman modul 2!
b. Buatlah program pegolahan data mahasiswa sederhana dengan fungsi
Typecasting, getchar, putchar, serta puts !
c. Buatlah program penjumlahan diagonal array 2 dimensi.
5
MODUL 2 SELECTION SORT DAN QUICK SORT
Secara efisien kita membagi list menjadi dua bagian yaitu bagian yang
sudah diurutkan, yang didapat dengan membangun dari kiri ke kanan dan
dilakukan pada saat awal, dan bagian list yang elemennya akan diurutkan.
6
Contoh program 2-1:
#include<stdio.h>
#include<conio.h>
main()
{
int i, j, data, k, x, bantu, A[100];
printf(" Masukkan jumlah data = "); scanf("%d", &data);
printf("\n\n");
for (i = 1; i <= data; i++)
{
printf(" A[%d] = ", i); scanf("%d", &A[i]);
}
printf("\n\n");
printf("--------------Data tak terurut-----------------");
printf("\n\n");
printf(" A = { ");
for (i = 1; i <= data; i++)
{
printf("%d,", A[i]);
}
printf(" } ");
for (i = 1; i <= data; i++)
{
k = i;
j = i + 1;
while (j <= data)
{
if (A[k]>A[j])
{
k = j;
}
else
{
j = j + 1;
}
}
bantu = A[i];
A[i] = A[k];
A[k] = bantu;
}
printf("\n\n");
printf("--------------Data terurut---------------------");
printf("\n\n");
printf(" A = { ");
for (i = 1; i <= data; i++)
{
printf("%d,", A[i]);
}
printf(" } ");
getch();
return 0;
7
}
2.2.Quick Sort
Quick Sort merupakan suatu algoritma pengurutan data yang
menggunakan teknik pemecahan data menjadi partisi-partisi, sehingga metode ini
disebut juga dengan nama partition exchange Sort. Untuk memulai irterasi
pengurutan, pertama-tama sebuah elemen dipilih dari data, kemudian elemen-
elemen data akan diurutkan diatur sedemikian rupa, sehingga nilai variabel
Sementara berada di suatu posisi ke I yang memenuhi kondisi sebagai berikut :
Semua elemen di posisi ke 1 sampai dengan ke I-1 adalah lebih kecil atau sama
dengan Sementara.
Semua elemen di posisi ke I+1 sampai dengan ke N adalah lebih besar atau sama
dengan Sementara.
Sebagai contoh, data yang akan diurutkan sejumlah 12 elemen sebagai berikut:
33 45 18 7 5 99 57 25 55 10 40 50
Misalnya element yang dipilih adalah element yang pertama, maka variabel
Sementara bernilai 33. Setelah diatur, maka nilai 33 akan menempati posisi ke I,
yaitu posisi urutan ke 6 sebagai berikut :
8
Tampak bahwa kondisi berikut terpenuhi, yaitu :
Semua elemen di posisi ke 1 sampai dengan posisi ke 5 (10, 25, 18, 7,dan 5) akan
lebih kecil atau sama dengan nilai 33 yang dipilih.
Dengan demikian, data tersebut akan terpecah menjadi 2 partisi, sebagai berikut :
Proses ini diulangi kembali untuk masing-masing partisi data, yaitu untuk data
(10, 25, 18, 7, 5) dan data (57, 99, 55, 45, 40, 50). Untuk partisi yang pertama,
bila nilai Sementara yang diambil adalah data pertama kembali dalam partisi
bersangkutan, yaitu 10 dan diatur kembali sedemikian rupa, maka nilai data yang
dipilih akan terletak di posisi sebagai berikut:
5 7 10 18 25 33 (50 40 55 45) 57 99
5 7 10 18 25 33 (45 40) 50 55 57 99
5 7 10 18 25 33 40 (45) 50 55 57 99
9
5 7 10 18 25 33 40 45 50 55 57 99
printf("=\n");
}
void display() {
int i;
printf(" [");
for (i = 0; i<jumlah; i++) {
printf("%d ", data[i]);
}
printf("]\n");
}
while (true) {
10
}
else {
printf(" Tukar Isi :%d,%d\n",
data[pointerKiri], data[pointerKanan]);
tukar(pointerKiri, pointerKanan);
}
11
MODUL 3 POINTER
Syntax :
Tipe_data *namaVariabelPointer;
12
NULL disebut pointer nol. NULL pointer adalah konstan dengan nilai nol
didefinisikan dalam beberapa perpustakaan standar.
int main()
{
int *P=NULL;
printf(" Nilai P = %x \n", P);
return 0;
}
int main() {
return 0;
}
13
int main()
{
char *nama[] = {
"RANI",
"JONI",
"DANI",
"DANANG",
};
int i = 0;
for (i = 0; i < MAX; i++)
{
printf("Nama ke %d = %s\n", i + 1, nama[i]);
}
return 0;
}
int main()
{
int var1;
int *pointer1;
int **pointer2;
var1 = 550;
pointer1 = &var1;
pointer2 = &pointer1;
printf("Isi dari var1 = %d\n", var1);
printf("Isi dari *pointer1 = %d\n", *pointer1);
printf("Isi **pointer2 = %d\n", **pointer2);
return 0;
14
}
int * angkaGenap() {
15
MODUL 4 TIPE DATA TINGKAT LANJUT
4.1 Struktur
Struktur (structure) digunakan untuk mengelompokkan sejumlah data
yang mempunyai tipe dan ukuran berbeda. Dalam bahasa pemrogramana Pascal,
struktur sama dengan record. Struktur dapat dideklarasikan sebagai berikut :
Syntax :
struct namaTipeStruktur
{
elemenStruktur1;
elemenStruktur2;
. . . . . . . . . . . . ;
elemenStrukturN;
}namaObjek;
Contoh program:
#include<stdio.h>
main()
{
struct {
float jariJari;
float keliling;
float luas;
} lingkaran;
4.2 Typedef
Bahasa C memungkinkan programmer untuk mendefinisikan tipe data
yang baru berdasarkan tipe data yang lama. Pendefinisian ini dapat dilakukan
dengan penggunaan kata kunci typedef.
typedef char C;
C karakter1, karakter2, *pKarakter;
16
4.3 Union
Union adalah suatu struktur yang elemen-elemen strukturnya menempati
lokasi memori yang sama. Union mempunyai struktur yang sama dengan struct
hanya saja union dideklarasikan dengan kata kunci union.
Syntax :
union namaUnion {
elemen1;
. . . . . . ;
elemenN;
} namaObjek;
Contoh program :
#include<stdio.h>
int main()
{
union
{
float luas, keliling;
}persegi;
float sisi;
4.5 Enumerasi
Enumerisasi adalah suatu tipe data yang mempunyaii elemen-elemen
bernilai konstanta dengan urutan yang sudah ditentukan. Tipe data enumerisasi
dapat dideklarasikan dengan kata kunci enum.
17
Contoh program:
#include<stdio.h>
main()
{
enum {senin, selasa, rabu, kamis, jumat, sabtu, minggu};
printf("%d\n", senin);
printf("%d\n", selasa);
printf("%d\n", rabu);
printf("%d\n", kamis);
printf("%d\n", jumat);
printf("%d\n", sabtu);
printf("%d\n", minggu);
}
18
MODUL 5 QUEUE (ANTRIAN)
Jika pada stack menggunakan prinsip Last In First Out (LIFO), maka pada
antiran prinsip yang digunakan adalah First In First Out (FIFO) atau dengan kata
lain, masuk pertama keluar pertama.
IN OUT
E D C B A
19
Contoh Program 5-1:
#include<stdio.h>
#define MAX 5
#define true 1
#define false 0
int queue[MAX];
int rear = -1;
int bantu = -1, b2 = 0;
void insert()
{
int add;
if (rear == MAX - 1)
{
printf(" Queue overflow ");
}
else
{
printf(" Masukkan Nilai Elemen Queue : ");
scanf("%d", &add);
rear = rear + 1;
queue[rear] = add;
bantu = rear;
}
}
void del()
{
}
void display()
{
int i;
if (bantu == -1)
{
printf(" Kosong");
}
else
{
printf(" NIlai elemen queue adalah : \n\n");
for (i = rear; i >= b2; i--)
{
printf("--> %d ", queue[i]);
printf(" ");
}
}
}
int main()
20
{
int pilihan;
while (1)
{
printf("\n\n\n");
printf("OPERASI QUEUE\n");
printf("[1] Input Queue\n");
printf("[2] Hapus Queue\n");
printf("[3] Cetak Queue\n");
printf("[4] Keluar\n");
printf("Masukan pilihan : "); scanf("%d", &pilihan);
switch (pilihan)
{
case 1:
{
insert(); break;
}
case 2:
{
del(); break;
}
case 3:
{
display(); break;
}
case 4:
{
exit(1); break;
}
default:
{
printf("salah pilih...\n");
}
}
}
return 0;
}
21
MODUL 6 STACK (Tumpukan)
IN OUT
Contoh program :
#include<stdio.h>
#define MAX 5
22
#define true 1
#define false 0
char stack[MAX];
int top;
void init(void);
int full(void);
int empty(void);
char pop(void);
void clear(void);
void push(char info);
void baca(void);
main()
{
char elemen;
int pilih;
init();
do
{
printf("OPERASI STACK\n");
printf("[1] Push\n");
printf("[2] Pop\n");
printf("[3] Clear\n");
printf("[4] Baca\n");
printf("[5] Keluar\n");
printf("Masukan pilihan : "); scanf("%d", &pilih);
switch (pilih)
{
case 1: printf("PUSH : "); scanf("%s", &elemen);
push(elemen); break;
case 2: elemen = pop(); printf("POP %c\n", elemen); break;
case 3: clear(); break;
case 4: baca(); break;
case 5: break;
default: printf("salah pilih...\n");
}
} while (pilih != 5);
}
void init(void)
{
top = 0;
}
char pop(void)
23
{
char info;
if (empty() != true)
{
info = stack[top];
top--;
return(info);
}
else printf("Stack underflow...\n");
}
void clear(void)
{
top = 0;
}
int full(void)
{
if (top == MAX)
{
return(true);
}
else
return(false);
}
int empty(void)
{
if (top == 0) return(true);
else return(false);
}
void baca(void)
{
int i;
printf("isi stack : ");
if (top>0)
{
for (i = 1; i <= top; i++)
printf("%c ", stack[i]);
}
else printf("kosong");
printf("\n");
}
24
MODUL 7 SINGLE LINKED LIST
7.1 Pengertian
Linked List adalah merupakan gabungan beberapa eleme data (variabel)
yang dijadikan satu kelompok atau structure yang dibentuk dengan printah struct
yang kemudian di link atau dihubungkan satu dengan yang lainnya sehingga
membentuk suatu list.
Bentuk umum :
Typedef struct telmlist
{
Infotype
Info;
Address
Next;
} elmtlist;
25
b. Elemen terakhir dikenali, dengan salah satu cara adalah karena Next(Last)
= Nil
c. Nil adalah pengganti nult perubahan ini dituliskan dengan #define Nil Null
6.1 Konsep
00001000 00001004
Field bertipe data Field bertipe
tertentu untuk pointer untuk
menampung menunjuk ke
sebuah node berikutnya
data/ informasi
Pada gambar diatas tampak sebuah data terletak pada sebuah lokasi
momori area. Tampat yang disediakan pada satu area tertentu untuk menyimpan
data dikenal dengan sebutan node/simpul. Setiap node memiliki pointer yang
menunjuk ke simpul berikutnya sehingga terbentuk suatu untaian. Dengan
demekian hanya diperlukan sebuah variable pointer. Susunan beberapa linked list
pada titik akhir akan menunjuk ke NULL.
26
Pembuatan Single Linked List dapat menggunakan 2 metode :
LIFO adalah suatu metode pembuatan Linked List dimana data yang
masuk paling akhir adalah data yang keluar paling awal. Hal ini dapat
dianalogikan (dalam kehidupan sehari-hari) dengan saat anda menumpuk
barang. Jika Linked List di buat dengan LIFO, maka terjadi
penambahan/insert simpul dibelakang, dikenal dengan istilah INSERT.
Contoh program :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct mahasiswa
{
char nim[20];
char namamhs[20];
struct mahasiswa *next;
};
int tambah_data_mhs()
{
struct mahasiswa *tampung;
int j = 0;
char jawab[2];
while (1)
{
27
ujung = (struct mahasiswa*)malloc(sizeof(struct mahasiswa));
fflush(stdin);
printf("\n\n");
printf(" Nama : "); scanf("%s", &ujung->namamhs);
printf("\n");
printf(" NIM : "); scanf("%s", &ujung->nim);
if (j == 0)
{
ujung->next = NULL;
tampung = ujung;
}
else
{
ujung->next = tampung;
tampung = ujung;
}
printf("\n");
printf(" Tambah Data Mahasiswa (Y/T): "); scanf("%s",
&jawab);
if (strcmp(jawab, "Y") == 0)
{
j++; continue;
}
break;
}
return 0;
}
void tampil_data()
{
struct mahasiswa *tampil;
printf("\n\n");
printf(" Data Mahasiswa yang telah diinputkan :\n");
printf("\n");
printf(" NIM | Nama\n\n");
tampil = ujung;
int main()
{
tambah_data_mhs();
tampil_data();
return 0;
}
28
Tugas akhir modul 7
1. Dari contoh program yang ada di atas, tambahkan fungsi untuk hapus
dan ubah data pada program tersebut !
29
MODUL 8 DOUBLE DAN CIRCULAR LINKED LIST
30
Fungsi ini mengubah elemen yang ditunjuk oleh now denga nisi dari
sesuatu
g. Delete Now
Fungsi ini menghapus elemen yang ditunjuk oleh now, Jika yang dihapus
adalah elemen pertama dari linked list (Head). Head akan berpindah ke
elemen berikut.
h. Delete Head
Fungsi ini menghapus elemen yang ditunjuk oleh head. Head berpindah
ke elemen berikutnya.
i. Clear
Fungsi ini menghapus linked list yang sudah ada, Fungsi ini wajib
dilakukan bila anda ingin mengakhiri program yang menggunakan linked
list. Jika anda melakukannya, data-data yang dialokasikan memory
kepada program sebelumnya akan tetap tertinggal di dalam memori.
Contoh Program :
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#include<conio.h>
struct node
{
int data, kunci;
struct node *next;
struct node *prev;
};
//link ini selalu mengarah ke link pertama
struct node *kepala = NULL;
//link ini selalu mengarah ke link akhir
struct node *buntut = NULL;
//list kosong
bool listKosong()
{
return kepala == NULL;
}
int panjangList()
{
int panjang = 0;
struct node *current;
31
for (current = kepala; current != NULL; current->next)
{
panjang++;
}
return panjang;
}
//tmapil list dari kepala ke buntut
void tampilDepan()
{
//mulai dari awal
struct node *tunjuk = kepala;
//tampilkan sampai list terakhir
printf("\n[ ");
printf("\n[ ");
while (tunjuk != NULL)
{
printf("(%d,%d)", tunjuk->kunci, tunjuk->data);
//lanjut ke data selanjutnya
tunjuk = tunjuk->prev;
printf(" ");
}
printf(" ]\n\n\n");
}
if (listKosong())
{
//data menjadi list terakhir (buntut)
buntut = link;
}
else
{
//update data awal prev link
kepala->prev = link;
}
//tunjuk ke link awal lama
32
link->next = kepala;
//link jadi kepala awal
kepala = link;
}
if (listKosong())
{
buntut = link;
}
else
{
//buat data terakhir baru
buntut->next = link;
link->prev = buntut;
}
//link sekarang jadi buntut
buntut = link;
kepala = kepala->next;
//kembali ke link hapus
return tempLink;
}
struct node* deleteKepala()
{
struct node *tempLink = buntut;
33
}
buntut = buntut->prev;
//kembali ke link hapus
return tempLink;
}
bool tambahSesudah(int kunci, int kunciBaru, int data)
{
//mulai dari link awal
struct node *previous = NULL;
struct node *current = kepala;
//jika list kosong
if (kepala == NULL)
{
return false;
}
if (current == buntut)
{
linkBaru->next = NULL;
buntut = linkBaru;
}
else
{
linkBaru->next = current->next;
current->next->prev = linkBaru;
}
linkBaru->prev = current;
current->next = linkBaru;
return true;
}
int main()
{
tambahKepala(1, 90);
tambahKepala(2, 40);
tambahKepala(3, 60);
tambahKepala(4, 70);
34
tambahKepala(5, 80);
tambahKepala(6, 30);
tambahKepala(7, 35);
tambahKepala(8, 75);
printf("\n List Kepala ke Buntut : \n");
tampilDepan();
printf("\n");
printf("\n List Buntut ke Kepala : \n");
tampilBelakang();
35
Daftar Pustaka
C - Array of pointers. (2015, November 2). Retrieved September 9, 2016, from
http://www.tutorialspoint.com/cprogramming/c_pointers.htm
PRANATA, A. (2005). ALGORITMA DAN PEMROGRAMAN. Yogyakarta:
Graha Ilmu.
Quick Sort Program in C. (2015, Oktober 8). Retrieved September 9, 2016, from
http://www.tutorialspoint.com/data_structures_algorithms/quick_sort_pro
gram_in_c.htm
Doubly Linked List Program in C. (2015, Oktober 8). Retrieved September 9,
2016, from
http://www.tutorialspoint.com/data_structures_algorithms/doubly_linked_
list_program_in_c.htm
36