Anda di halaman 1dari 42

i

MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA


Tim Penyusun : Sabrina Nurindra Putri
Asmarita Dewi

Modul ini dicetak untuk panduan praktikum.


Dicetak Maret 2020 oleh Laboratorium Informatika FT UMJ

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

Telah disetujui dan disahkan sebagai


Modul kuliah 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.

Wassalamu’alaikum wr. wb.


Jakarta,
Laboratorium Informatika FT-UMJ,

Tim Penyusun

iv
DAFTAR ISI

COVER MODUL .........................................................................................................i

MODUL PRAKTIKUM STRUKTUR DATA ................................................................. ii

LEMBAR PENGESAHAN ......................................................................................... iii

KATA PENGANTAR ................................................................................................. iv

DAFTAR ISI ...............................................................................................................v

MODUL 1 FUNGSI MASUKKAN DAN KELUARAN .................................................. 1

1.1 Typecasting .................................................................................................. 1

1.2 Fungsi Keluaaran PUTS Dan PUTCHAR ........................................................ 1

1.3 Fungsi Masukkan GETCHAR ....................................................................... 2

1.4 Array ................................................................................................................ 2

Tugas Akhir Modul 1 .............................................................................................. 5

MODUL 2 SELECTION SORT DAN QUICK SORT .................................................. 6

2.1. Selection Sort ................................................................................................. 6

2.2. Quick Sort .................................................................................................... 8

Tugas Akhir Modul 2 ............................................................................................ 11

MODUL 3 POINTER ............................................................................................... 12

3.1 Pengertian Pointer ...................................................................................... 12

3.2 Operator Pointer ......................................................................................... 12

3.3 NULL Pointers ............................................................................................ 12

3.4 Array Dalam Pointer ................................................................................... 13

3.5 Pointer ke Pointer ....................................................................................... 14

3.6 Return Pointer Dari Fungsi ......................................................................... 15

v
Tugas Akhir Modul 3 ............................................................................................ 15

MODUL 4 TIPE DATA TINGKAT LANJUT .............................................................. 16

4.1 Struktur ...................................................................................................... 16

4.2 Typedef ...................................................................................................... 16

4.3 Union.......................................................................................................... 17

4.4 Melewatkan Struktur ke Fungsi .................................................................. 17

4.5 Enumerasi .................................................................................................. 17

Tugas Akhir Modul 4 ............................................................................................ 18

MODUL 5 QUEUE (ANTRIAN) ............................................................................... 19

5.1 Pengertian Antrian (Queue) ........................................................................ 19

5.2 Macam – macam operasi Queue .................................................................. 19

Tugas Akhir Modul 5 ............................................................................................ 21

MODUL 6 STACK (Tumpukan) ............................................................................... 22

6.1 Pengertian Stack (Tumpukan) ....................................................................... 22

6.2 Macam – macam Operasi Stack .................................................................... 22

Tugas Akhir Modul 6 ............................................................................................ 24

MODUL 7 SINGLE LINKED LIST ............................................................................ 25

7.1 Pengertian ..................................................................................................... 25

Tugas akhir modul 7 ............................................................................................ 29

MODUL 8 DOUBLE DAN CIRCULAR LINKED LIST............................................... 30

8.1 Double Linked List ......................................................................................... 30

8.2 Circular Linked List ........................................................................................ 30

Tugas akhir modul 8 ............................................................................................ 35

Daftar Pustaka ........................................................................................................ 36

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

1.2 Fungsi Keluaaran PUTS Dan PUTCHAR


putchar() = untuk menampilkan sebuah karakter ke layar secara tidak terformat
dan

tidak diakhiri dengan pindah baris.

puts() = berasal dari kata putstring digunakan untuk menampilkan string ke


layar secara tidak terformat.

Contoh program 1-2:


#include<stdio.h>
int main()
{
char a[10]="FT-UMJ";

putchar('s');
putchar('a');

putchar('y');
putchar('a');

1
puts(" kuliah di ");
puts(a);

return 0;
}

1.3 Fungsi Masukkan GETCHAR


Adapun fungsi-fungsi yang dimiliki oleh C untuk memasukkan data secara
tidak terformat adalah :

getchar() = tanpa argumen, langsung memberikan hasil, dan harus menekan


tombol enter.

Contoh Program 1-3:


#include<stdio.h>
int main()
{
char *nama1[20], kar;
int a;

puts("masukkan nama anda : "); scanf("%s", &nama1);


printf("masukkan angka yang anda suka : "); scanf("%d", &a);
getchar();

puts("\n\nHai "); puts(nama1);


puts("Selamat belajar bahasa C");
printf("\n\nAnda menyukai angka %d", a);
getchar();
puts("Terimakasih");
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];

tipeData : menyatakan tipe data yang akan digunakan


namaVariabel : menyatakan jumlah maksimum elemen array
Array dapat digambarkan sebagai kotak-kotak kecil yang didalam setiap
kotak tersebut berisi elemen-elemen atau nilai-nilai array dengan index atau
nomor kotak dimulai dari nol.
Pendeklarasian array(larik) dapat dilakukan dengan menyebutkan jumlah
elemennya dalam tanda "[ ]". Misalnya : int X[5]; Pendeklarasian juga dapat
dilakukan dengan langsung memberi nilai atau isi dalam array tersebut. Misal : int
X[5]={1, 2, 3, 4};. Contoh lainnya seperti int x[0]=1, x[1]=2, x[2]=3, x[3]=4;
Suatu array juga dapat dideklarasikan tanpa indeks yang menyatakan
ukurannya. Contoh membuat larik atau array yang tidak berukuran yaitu int x[
]={9, 8, 7};Untuk melakukan pengaksesan terhadap suatu array, ini dapat
dilakukan dengan menggunakan indeksnya yang dimulai dari nol(0).
Contoh program 1-4:

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

1.4.3 Array Berdimensi Dua


Array berdimensi dua lebih mewakili kepada bentuk tabel atau matrik
dimana indeks pertama sebagai baris dan indeks ke dua sebagai kolom.
Syntax :
tipeData namaVariabel[indeks1] [indeks2]

tipeData : menunjukkan tipe data array yang digunakan


indeks1 : menyatakan jumlah baris
indeks2 : menyatakan jumlah kolom
Contoh program 1-6:
1. #include<stdio.h>
2. main() {
3. int i, j;
4. float x[3][4] = {1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3};
5. for (i=0; i<3; i++) {
6. for (j=0; j<4; j++) {
7. printf(“%f\t”, x[i][j]);
8. }
9. printf(“\n”);
10. }
11.
Contoh }
program 6-2;

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

Contoh program 1-8:

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

2.1. Selection Sort


Selection Sort adalah mencari elemen yang tepat untuk diletakkan di
posisi yang telah diketahui, dan meletakkannya di posisi tersebut setelah data
tersebut ditemukan,
Selection Sort Membandingkan elemen yang sekarang dengan elemen yang
berikutnya sampai dengan elemen yang terakhir. Jika ditemukan elemen lain yang
lebih kecil dari elemen sekarang maka dicatat posisinya dan kemudian ditukar.

Prosesnya adalah dengan melakukan beberapa kali pass untuk melakukan


penyeleksian elemen struktur data. Untuk Sorting ascending (menaik),
elemen yang paling kecil di antara elemen-elemen yang belum urut, disimpan
indeksnya, kemudian dilakukan pertukaran nilai elemen dengan indeks yang
disimpan tersebut dengan elemen yang paling depan yang belum urut.

Sebaliknya, untuk menurun (Sorting descending), elemen yang paling


besar yang disimpan indeksnya kemudian dilakukan pertukaran data pada index
tersebut.
Selection Sort diakui karena kesederhanaan algoritmanya dan performanya lebih
bagus daripada algoritma lain yang lebih rumit dalam situasi tertentu.

Algoritma ini bekerja sebagai berikut:


a.Mencari nilai minimum (jika ascending) atau maksimum (jika descending)
dalam sebuah list.
b. Menukarkan nilai ini dengan elemen pertama list.
c. Mengulangi langkah di atas untuk sisa list dengan dimulai pada posisi kedua.

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.

Semua elemen di posisi ke 7 sampai dengan ke 12 (57,99,55,45,40 dan 50) aka


lebih besar atau sama dengan nilai 33 yang dipilih.

Dengan demikian, data tersebut akan terpecah menjadi 2 partisi, sebagai berikut :

(10 25 18 7 5) 33 (57 99 55 45 40 50)

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 (57 99 55 45 40 50)

Untuk mengurutkan masing-masing partisi, maka proses tersebut diulangi kembali


dan tiap-tiap partisi dipecah-pecah kembali lebih lanjut. Kurung yang menutupi
partisi menunjukkan data yang belum urut dan perlu diurutkan kembali. Sedang
data yang tidak berada diantara tanda kurung merupakan data yang sudah diurut.
Iterasi selanjutya sampai didapatkan data yang telah urut semuanya adalah sebagai
berikut ini.

5 ( 7) 10 (18 25) 33 (57 99 55 45 40 50)

5 7 10 18 (25) 33 (57 99 55 45 40 50)

5 7 10 18 25 33 (50 40 55 45) 57 (99)

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 (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

Contoh program 2-2 :


#include <stdio.h>
#include <stdbool.h>
#define MAX 50
int data[MAX], jumlah;
void input()
{
printf(" Masukkan banyak data : "); scanf("%d", &jumlah);
for (int i = 0; i<jumlah; i++)
{
printf(" Data [%d] : ", i); scanf("%d", &data[i]);
}
}
void printline(int count)
{
int i;
for (i = 0; i <count - 1; i++) {
printf("=");
}

printf("=\n");
}

void display() {
int i;
printf(" [");
for (i = 0; i<jumlah; i++) {
printf("%d ", data[i]);
}
printf("]\n");
}

void tukar(int num1, int num2) {


int temp = data[num1];
data[num1] = data[num2];
data[num2] = temp;
}

int partisi(int kiri, int kanan, int pivot) {


int pointerKiri = kiri - 1;
int pointerKanan = kanan;

while (true) {

while (data[++pointerKiri] < pivot) {

while (pointerKanan > 0 && data[--pointerKanan] > pivot) {

if (pointerKiri >= pointerKanan) {


break;

10
}
else {
printf(" Tukar Isi :%d,%d\n",
data[pointerKiri], data[pointerKanan]);
tukar(pointerKiri, pointerKanan);
}

printf(" Tukar Pivot :%d,%d\n", data[pointerKiri], data[kanan]);


tukar(pointerKiri, kanan);
printf(" Update Array: ");
display();
return pointerKiri;
}
void quickSort(int kiri, int kanan) {
if (kanan - kiri <= 0) {
return;
}
else {
int pivot = data[kanan];
int partitionPoint = partisi(kiri, kanan, pivot);
quickSort(kiri, partitionPoint - 1);
quickSort(partitionPoint + 1, kanan);
}
}
main() {
printf("Input Array: \n\n");
input();
display();
printline(50);
quickSort(0, jumlah - 1);
printf(" Data terurut: ");
display();
printline(50);
}

Tugas Akhir Modul 2

a. Buatlah rangkuman modul 3!


b. Carilah contoh program pengurutan selain yang di atas !

11
MODUL 3 POINTER

3.1 Pengertian Pointer


Pointer adalah suatu nilai yang mengidentifikasi keberadaan atau alamat
suatu variabel, objek, atau fungsi di dalam memory komputer.

3.2 Operator Pointer


Terdapat dua macam operator dalam bahasa C, yaitu :
a. Operator dereference (&), digunakan untuk mendapatkan alamat memory
dari operandnya. Disebut juga dengan operator alamat.
b. Operator reference (*), digunakan untuk mendapatkan nilai operand.
Disebut juga value pointed by.

Syntax :
Tipe_data *namaVariabelPointer;

Contoh program 3-1:


#include<stdio.h>
#include<conio.h>
int main()
{
int x, y, *z;
x = 80;
y = x;
z = &y;
printf(" Nilai x = %d \n", x);
printf(" Nilai y = %d \n", y);
printf(" Alamat Variabel Y = %x \n",z);
getch();
return 0;
}

3.3 NULL Pointers


Ini merupakan praktik yang baik untuk menetapkan nilai NULL ke
variabel pointer dalam kasus tidak memiliki alamat yang tepat untuk ditugaskan.
Hal ini dilakukan pada saat deklarasi variabel. Sebuah pointer yang ditugaskan

12
NULL disebut pointer nol. NULL pointer adalah konstan dengan nilai nol
didefinisikan dalam beberapa perpustakaan standar.

Contoh program 3-2:


#include<stdio.h>

int main()
{
int *P=NULL;
printf(" Nilai P = %x \n", P);

return 0;
}

3.4 Array Dalam Pointer


Ada banyak cara ketika kita ingin mendeklarasikan pointer dalam bentuk
array, dimana dapat disimpan dalam tipe int, char, atau tipe data lainya. Dalam
penerapanya, tiap elemen array dari pointer mengandung nilai dari array pinter
tersebut.

Contoh program 3-3:


#include <stdio.h>

const int MAX = 5;

int main() {

int data[] = { 10, 30, 200,45,231 };


int i, *p[MAX];

for (i = 0; i < MAX; i++)


{
p[i] = &data[i];
}
for (i = 0; i < MAX; i++)
{
printf("Isi data [%d] = %d\n", i, *p[i]);
}

return 0;
}

Contoh program 3-4:


#include <stdio.h>

const int MAX = 4;

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

3.5 Pointer ke Pointer


Pointer ke pointer adalah bentuk beberapa tipuan, atau rantai pointer.
Biasanya, pointer berisi alamat dari variabel. Ketika kita mendefinisikan pointer
ke pointer, pointer pertama berisi alamat pointer kedua, yang menunjuk ke lokasi
pointer berisi nilai sebenarnya seperti yang ditunjukkan di bawah ini .

Sebuah variabel yang merupakan pointer ke pointer harus dideklarasikan


seperti itu . Hal ini dilakukan dengan menempatkan tanda bintang tambahan di
depan namanya .
Contoh program 3-5:
#include <stdio.h>

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
}

3.6 Return Pointer Dari Fungsi


Dalam bahasa C juga memungkinkan untuk mendapatkan nilai return
pointer dari fungsi. Untuk melakukannya , kita harus mendeklarasikan fungsi
pengembalian pointer.
Poin kedua yang perlu diingat bahwa, itu bukan ide baik untuk mengembalikan
alamat dari variabel lokal di luar fungsi, sehingga harus mendefinisikan variabel
lokal sebagai variabel statis.

Contoh program 3-6:


#include <stdio.h>

int * angkaGenap() {

static int r[100];


int i;

for (i = 0; i < 100; i += 2)


{
printf("%d\n", i);
}
return r;
}
int main()
{
int *p;
int i;
p = angkaGenap();

for (i = 0; i < 100; i += 2) {


printf("Genap %d : %d\n", i, *(p + i));
}
return 0;
}

Tugas Akhir Modul 3


a. Buatlah program pertukaran nilai dari dua variabel A & B dengan pointer .
b. Buatlah program pertukaran alamat dari 3 variabel A => B,B => C,C => A .

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;

printf("Jari-jari lingkaran = ");


scanf("%f", &lingkaran.jariJari);
lingkaran.keliling=2*3.1416*lingkaran.jariJari;
lingkaran.luas=3.1416*lingkaran.jariJari*lingkaran.jariJari;
printf("Keliling Lingkaran = %f \n", lingkaran.keliling);
printf("Luas Lingkaran = %f\n", lingkaran.luas);
}

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;

printf(" Panjang sisi persegi = "); scanf("%f", &sisi);


persegi.luas = sisi * sisi;
printf(" Luas persegi = %0.f\n", persegi.luas);
persegi.keliling = 4 * sisi;
printf(" Keliling persegi = %0.f\n", persegi.keliling);
return 0;
}

4.4 Melewatkan Struktur ke Fungsi


Pengiriman struktur ke suatu fungsi dapat dilakukan untuk tiap-tiap
elemen atau seluruh strukturnya. Fungsi yang mendapat kiriman dapat juga
mengirimkan hasil baliknya yang juga berupa suatu struktur. Struktur dapat
dilewatkan sebagai argumen fungsi dalam banyak cara.

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

Tugas Akhir Modul 4

1. Buatlah rangkuman modul 5 dengan tulis tangan di buku laporan


2. Buatlah program kalkulator menggunakan struct atau union

18
MODUL 5 QUEUE (ANTRIAN)

5.1 Pengertian Antrian (Queue)


Antrian (queue) adalah suatu kumpulan data yang mana penambahan
elemen hanya bisa dilakukan pada suatu ujung (disebut dengan tail/rear atau ujung
belakang), dan penghapusan (pengambilan elemen) dilakukan lewat ujung lain
(disebut dengan head/front atau ujung depan).

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

5.2 Macam – macam operasi Queue


Ada beberapa macam operasi pada queue, antara lain:

a. Create, membuat abtrian atau queue


b. Add, menambahi dat pada antrian
c. Remove, mengeluarkan data pada antrian
d. IsEmpty, mengecek apakah antrian kosong atau tidak.

Pada contoh program dibawah ini tidak ada operasi create,dikarenakan


pembuatakn stack menggunakan pointer, dan penggunaan stack diumpamakan
memakai memori yang kecil.

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()
{

printf("Queue yang di hapus : --> %d \n", queue[rear - bantu]);


bantu = bantu - 1;
b2 = b2 + 1;

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

Tugas Akhir Modul 5


1. Buatlah contoh program antrian (QUEUE) yang lain selain dimodul!

21
MODUL 6 STACK (Tumpukan)

6.1 Pengertian Stack (Tumpukan)


Tumpukan atau stack dapat diartikan suatu kumpulan data seolah olah ada
data yang diletakan diatas yang lain. Dalam Stack menambah (menyisipkan) data
dan mengeluarkan data melalu ujung yang sama atau disebut sebagau ujung atas
tumpukan(top). Cara ini disebut dengan metode Last In First Out (LIFO).

IN OUT

6.2 Macam – macam Operasi Stack


Ada beberapa macam pada stack, antara lain.
1. Create, yaitu membuat stack baru
2. Push, yaitu memasukkan data ke dalam stack
3. Pop, mengambil data pada stack
4. Top, melihat data yang ada pada ujung stack
5. IsEmpty, mengecek apakah stack kosong atu tidak.

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

void push(char info)


{
if (full() != true)
{
top++;
stack[top] = info;
}
else printf("Stack overflow...\n");
}

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

Tugas Akhir Modul 6


1. Buatlah program menggunakan stack untuk memeriksa kelengkapan pasangan
kurung buka(,{. , [ dan kurung tutup ), }, ]
(jadi pasangan kurungnya harus tepat)

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;

Infotype : sebuah tipe terdefenisi yang menyimpan informasi sebuah elem


list.
Next : address dari elemen berikutnya (suksesor)
Jika L adalah list, dan P adalah addres, maka alamat elemen pertama list L
dapat diacu dengan notasi : first (L)

Sebelum digunakan hams dideklarasikan terlebih dahulu


#define first(L) (L)
Elemen yang duacu oleh P dapat dikonsultasi informasi dengan notasi :
Info(P) deklarasi #define info (P) (P) -> info
Next (P) deklarasi #define next (P) (P) -> next
Beberapa defenisi :

a. a.1.1.1.1.1.List l adalah list kosong, jika first (L)=Nil

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

Aku Belajar Komputer NULL

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 :

a. Last In First Out (LIFO)

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.

b. First In First Out (FIFO)


FIFO adalah suatu metode pembuatan Linked List dimana data
yang masuk paling awal adalah data yang keluar paling awal juga. Hal ini
dapat dianaloikan , misalkan saat kelompok orang dating (ENQUEUE)
mengantri hendak membeli tiket diloket, jika Linked List dibuat dengan
metode FIFO maka akan terjadi penambahan / insert simpul didepan.

Contoh program :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct mahasiswa
{
char nim[20];
char namamhs[20];
struct mahasiswa *next;
};

struct mahasiswa *ujung;

int tambah_data_mhs()
{
struct mahasiswa *tampung;
int j = 0;
char jawab[2];

printf(" Link List LIFO ( Last In First Out) ");


printf("\n");
printf(" ________________________________________");

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

else if (strcmp(jawab, "T") == 0)

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;

while (tampil != NULL)


{
printf(" %s\t %s\t \n", tampil->nim, tampil-
>namamhs);
tampil = tampil->next;
}
}

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

8.1 Double Linked List


Double Linked List adalah Linked List yang mempunyai 3 bagian pertama
adalah informasi yang apa adanya, dan kedua serta ketiga adalah sebagai
penunjuk Linked List sebelahnya (kiri dan kanan). Salah satu kelebihan Double
Linked List adalah pointer tidak hanya bergerak satu arah saja, melainkan maju
dan mundur, atau kanan serta kiri sehingga pencarian data pada Double Linked
List lebih luas.

8.2 Circular Linked List


Merupakan double linked list yang simpul terakhirnya menunjuk kesimpul
awalnya menunjuk ke simpul akhir sehingga membentuk suatu lingkaran.

Operasi-Operasi yang ada pada Double Linked List


a. Insert
Istilah insert berarti menambahkan sebuah simpul baru ke dalam suatu
linked list
b. IsEmpty
Fungsi ini menentukan apakah linked list kosong atau tidak
c. Find First
Fungsi ini mencari elemn pertama Linked List
d. Find Next
Fungsi ini mencari elemen sesudah elemen yang ditunjuk now
e. Retrieve
Fungsi ini mengambil elemen yang ditunjuk oleh now. Elemen tersebut
lalu dikembalikan oleh fungsi.
f. Update

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;

struct node *current = 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[ ");

while (tunjuk != NULL)


{
printf("(%d,%d)", tunjuk->kunci, tunjuk->data);
tunjuk = tunjuk->next; printf(" ");
}
printf(" ]\n\n");
}

//tampil list dari belakang ke depan


void tampilBelakang()
{
struct node *tunjuk = buntut;

printf("\n[ ");
while (tunjuk != NULL)
{
printf("(%d,%d)", tunjuk->kunci, tunjuk->data);
//lanjut ke data selanjutnya
tunjuk = tunjuk->prev;
printf(" ");
}
printf(" ]\n\n\n");
}

//tambah data link pada lokasi awal ( kepala )


void tambahKepala(int kunci, int data)
{
//buat link
struct node *link = (struct node*)malloc(sizeof(struct node));
link->kunci = kunci;
link->data = data;

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

void tambahBuntut(int kunci, int data)


{
struct node *link = (struct node*)malloc(sizeof(struct node));
link->kunci = kunci;
link->data = data;

if (listKosong())
{
buntut = link;
}
else
{
//buat data terakhir baru
buntut->next = link;
link->prev = buntut;
}
//link sekarang jadi buntut
buntut = link;

struct node* deleteBuntut()


{
struct node *tempLink = kepala;

//jika cuman satu link


if (kepala->next == NULL)
{
buntut = NULL;
}
else
{
kepala->next->prev = NULL;
}

kepala = kepala->next;
//kembali ke link hapus
return tempLink;
}
struct node* deleteKepala()
{
struct node *tempLink = buntut;

//jika cuman satu link


if (kepala->next == NULL)
{
kepala = NULL;
}
else
{
buntut->prev->next = NULL;

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

while (current->kunci != kunci)


{
//jika node terakhir
if (current->next == NULL)
{
return false;
}
else
{
previous = current;
//pindah ke link next
current = current->next;
}
}
//buat link

struct node *linkBaru = (struct node*)malloc(sizeof(struct node));


linkBaru->kunci = kunci;
linkBaru->data = data;

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

printf("\n List setelah di hapus data awal (kepala) : \n");


deleteKepala();
tampilDepan();

printf("\n List setelah di hapus data akhir (buntut) : \n");


deleteBuntut();
tampilDepan();

printf("\n Tambah list setelah kunci 4 : \n");


tambahSesudah(4, 9, 12);
tampilDepan();
getch();
return 0;
}

Tugas akhir modul 8


1. Buatlah program manajemen tiket bus menggunakan Double Linked List dengan
menu :
a. Tambah data di awal list.
b. Tambah data di akhir list
c. Ubah data.
d. Hapus data di awal list.
e. Hapus data di akhir list.
f. Tampil data secara forward .

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

Anda mungkin juga menyukai