tugas besar pasd

Upload: fuad-pradana

Post on 19-Jul-2015

136 views

Category:

Documents


0 download

TRANSCRIPT

PRAKTIKUM ALGORITMA DAN STRUKTUR DATA

LAPORAN TUGAS BESAR

I Wayan Adi Juliawan Pawan (1008605002) Gede Wisnu Bhaudhayana(1008605013) Kadek Ery Perwira Dinata(1008605024) Komang Yudi Adnyana Suardana(1008605057) Ni Putu Yanita Pratiwi(1008605046) Fuad Adi Pradana(1008605057)

Jurusan Ilmu Komputer Program Studi Teknik Informatika Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Udayana 2011 1

KATA PENGANTAR

Om Swastiastu,

Puja dan puji syukur kami panjatkan kehadapan Ida Sang Hyang Widhi Wasa / Tuhan Yang Maha Esa, atas asung kertha wara nugraha_Nya sehingga kami dapat menyelesaikan tugas paper yang kami buat dengan bahan materi yaitu Program Silsilah Keluarga . Kami menyadari bahwa terdapat banyak kekurangan yang terkandung dalam paper yang kami kerjakan ini, untuk itu kritik dan saran yang konstruktif dari asisten dosen mata kuliah praktikum algoritma dan struktur data (ASD) yang budiman sangat kami harapkan. Semoga pikiran yang baik datang dari segala penjuru.

Om Shantih, Shantih, Shantih Om

Jimbaran, Oktobe 2011

2

DAFTAR ISI

DAFTAR ISI ........................................................................................................... 3 BAB I PENDAHULUAN ....................................................................................... 4 1.1. Latar Belakang............................................................................................. 4 1.2. Tujuan ........................................................................................................... 4 1.3. Manfaat ......................................................................................................... 4 BAB II LANDASAN TEORI ................................................................................. 5 2.1. Linked List.................................................................................................... 5 2.1.1. Representasi Node ..................................................................................... 5 2.1.2. Alokasi Node ............................................................................................. 6 2.1.3. Operasi Pada Linked List .......................................................................... 6 2.2. Pointer.......................................................................................................... 8 2.3. Rekursif Function ......................................................................................... 8 2.4. Operasi File .................................................................................................. 9 BAB III PEMBAHASAN PROGRAM ................................................................ 12 3.1. Manual Program ......................................................................................... 13 3.2. Algoritma Program ..................................................................................... 23 3.3. Kode Program ............................................................................................ 31

3

BAB I PENDAHULUAN1.1. Latar Belakang Tanpa perangkat lunak (software) sebuah komputer sebenarnya merupakan sekumpulan besi yang tidak berguna. Dengan software sebuah komputer dapat digunakan untuk menyimpan, mengolah data (memproses) dan mendapatkan kembali informasi yang telah disimpan sehingga program dapat meringankan pekerjaan manusia. Dewasa ini banyak orang yang kesulitan dalam mengetahui siapa sanak-saudaranya karna mungkin hidup dalam keadaan yang sangat individualis sehingga sulit untuk menentukan sanak-saudara pada bagan silsilah keluarga, dengan software dalam sebuah komputer kita dapat menentukan dengan hanya menginsertkan seseorang kedalam bagan silsilah keluarga sehingga program akan memproses dan menghasilkan output yang mana kita dapat mengetahui dimana posisi saudara-saudara kita dibagan silsilah.

1.2. Tujuan Tujuan dibuat program silsilah keluarga adalah : Untuk mengetahui posisi sanak-saudara dalam bagan silsilah keluarga Untuk mengetahui hubungan atau relasi sanak-saudara dalam silsilah keluarga

1.3. Manfaat Dapat mengetahui sanak-saudara dalam bagan silsilah keluarga Dapat mengetahui relasi orang-orang yang berada dalam bagan silsilah keluarga

4

BAB II LANDASAN TEORI

2.1. Linked List Linked list dalam ilmu komputer merupakan sebuah struktur data yang digunakan untuk menyimpan sejumlah objek data biasanya secara terurut sehingga memungkinkan penambahan, pengurangan, dan pencarian atas elemen data yang tersimpan dalam daftar dilakukan secara lebih efektif. Pada praktiknya sebuah struktur data memiliki elemen yang digunakan untuk saling menyimpan rujukan antara satu dengan yang lainnya sehingga membentuk sebuah daftar abstrak, tiap-tiap elemen yang terdapat pada daftar abstrak ini seringkali disebut sebagai node.

2.1.1. Representasi Node Struktur node pada linked list merupakan suatu simpul(node) yang berisi pointer ke suatu data yang merupakan data dirinya sendiri. Model struktur dari linked list tersebut dalam C adalah sebagai berikut: typedef struct node //deklarasi struct { int nodeValue; struct node *nextNode; }node; Dilanjutkan dengan deklarasi pointer node *pHead = NULL;

5

2.1.2. Alokasi Node Ketika sebuah variabel dideklarasikan, terlebih dahulu harus diinisialisasi. Demikian juga dengan pengalokasian secara dinamis. Sehingga, fungsi untuk mengalokasikan sebuah node baru, menggunakan malloc() untuk mendapatkan memori aktual, yang akan menginisialisasi suatu field data. node *tempNode = (node*)malloc(sizeof(node));

2.1.3. Operasi Pada Linked List Fungsi Insert Node (Head)

Statement kelanjutan dengan deklarasi seperti diatas untuk insert sebagai node awal (head). void insertHead(int nodeValue) { node *tempNode = (node*)malloc(sizeof(node)); if(HeadNode == NULL); { tempNode->point = point; tempNode->nextNode = NULL; startNode = tempNode; } else { tempNode->nodeValue = nodeValue; tempNode->nextNode = headNode; headNode = tempNode; } }

Fungsi Delete Node

void deleteHead() 6

{ node *delNode = headNode; headNode = headNode->nextNode; free(delNode); } atau fungsi Delete Node di tengah void deletePoint(int nodevalue) { node *tempNode1 = NULL, *tempNode2 = NULL, *delNode = NULL; for(tempNode1 = tempNode2 = startNode; tempNode1 != NULL; tempNode2 = tempNode1, tempNode1 = tempNode1->nextNode) { if(tempNode1->point == point && tempNode1 != headNode) { tempNode2->nextNode = tempNode1>nextNode; delNode = tempNode1; tempNode1 = tempNode2; free(delNode); } } if(headNode->nodevalue == nodevalue) { delNode = headNode; headNode = headNode->nextNode; free(delNode); } } 7

2.2. Pointer Pointer adalah variabel yang berisi alamat memori sebagai nilainya, berbeda dengan variabel biasa yang berisi nilai tertentu. Pointer berisi alamat dari variabel yang mempunyai nilai tertentu. Dengan demikian, ada variabel yang secara langsung menunjuk ke suatu nilai tertentu, dan variabel yang secara tidak langsung (merupakan variabel pointer) menunjuk ke nilai. Deklarasi pointer adalah sebagai berikut : int*countPtr,count; Operator alamat (dilambangkan dengan &) adalah operator unary yang mengembalikan alamat dari operatornya. Deklarasinya adalah sebagai berikut : int y = 5 int *yPtr maka pernyataan yPtr = &y; menyatakan bahwa alamat dari variable y ditujukan kepada variabel pointer yPtr.

2.3. Rekursif Function Rekursif merupakan alat/cara untuk memecahkan masalah dalam suatu fungsi atau procedure yang memanggil dirinya sendiri. Perhitungan matematika ( contoh fungsi factorial dan bilangan Fibonacci). Fungsi factorial dari bilangan bulat positif n didefinisikan sebagai berikut: n!= n.(n-1)! , jika n>1 n!= 1 contoh : , jika n=0, 1

8

3!= 3. 2! 3!= 3. 2. 1! 3!= 3. 2. 1 3!= 6

Contoh Implementasi1. 2. 3. 4. 5. 6. else return (n * Faktorial(n-1));} int Faktorial(int n) { if ((n == 0) || (n == 1 )) return (1);

Pada baris 3 dari fungsi diatas, nilai n dicek sama dengan 0 atau 1, jika ya, maka fungsi mengembalikan nilai 1 {baris 4}, jika tidak, fungsi mengembalikan nilai n * Faktorial (n -1) {baris 6}

disinilah letak proses rekursif itu, perhatikan fungsi factorial ini memanggil dirinya sendiri tetapi dengan parameter (n-1)

2.4. Operasi File File adalah sebuah organisasi dari sejumlah record. Masing-masing record bisa terdiri dari satu atau 9

beberapa field. Setiap field terdiri dari satu atau beberapa byte. MEMBUKA FILE Untuk membuka atau mengaktifkan file, fungsi yang digunakan adalah fungsi fopen(). File dapat berupa file biner atau file teks. File biner adalah file yang pola penyimpanan di dalam disk dalam bentuk biner, yaitu seperti bentuk pada memori (RAM) computer. File teks adalah file yang pola penyimpanan datanya dalam bentuk karakter. Penambahan yang perlu dilakukan untuk menentukan mode teks atau biner adalah t untuk file teks dan b untuk file biner. Prototype fungsi fopen() ada di header fungsi stdio.h Bentuk umum : file *fopen(char *namafile, char *mode); Keterangan : namafile adalah nama dari file yang akan dibuka/diaktifkan. mode adalah jenis operasi file yang akan dilakukan terhadap file.

Jenis-jenis operasi file : r : menyarakan file hanya dapat dibaca (file harus sudah ada) w : menyatakan file baru akan dibuat/diciptakan a : untuk membuka file yang sudah ada dan akan dilakukan proses penambahan data (jika file belum ada, otomatis akan dibuat) 10

r+ : untuk membuka file yang sudah ada dan akan dilakukan prosespembacaan dan penulisan. w+ : untuk membuka file dengan tujuan untuk pembacaan atau penulisan. Jika file sudah ada, isinya akan dihapus. a+ : untuk membuka file, dengan operasi yang akan dilakukan berupa perekaman maupun pembacaan. Jika file sudah ada, isinya akan dihapus. Contoh : pf = fopen(COBA.TXT, w);

MENUTUP FILE Untuk menutup file, fungsi yang digunakan adalah fclose(). Prototype fungsi fclose() ada di header file stdio.h Bentuk Umum : int fclose(FILE *pf); atau int fcloseall(void); MELAKSANAKAN PROSES FILE Menulis Karakter Untuk menulis sebuah karakter, bentuk yang digunakan adalah : putc(int ch, file *fp) fp adalah pointer file yang dihasilkan oleh fopen() ch adalah karakter yang akan ditulis.

11

BAB III PEMBAHASAN PROGRAM

Silsilah, silsilah keluarga, bagan silsilah, atau diagram silsilah adalah suatu bagan yang menampilkan hubungan keluarga (silsilah) dalam suatu struktur pohon. Data genealogi ini dapat ditampilkan dalam berbagai format. Salah satu format yang sering digunakan dalam menampilkan silsilah adalah bagan dengan generasi yang lebih tua di bagian atas dan generasi yang lebih muda di bagian bawah. Pada program silsilah keluarga ini mengaplikasikan metode single linked list pada struktur data programnya dimana pada setiap Node memiliki informasi yang berupa nama, jenis kelamin, dan pointer-pointer penunjuk relasi antar node. Dalam program ini setiap pasangan hanya boleh mempunyai dua orang anak. Setiap node dalam program di definisikan sebagai sebuah struct yang berisikan : Nama : bertipe data char [50] Jenis Kelamin : bertipe data char Pointer pasangan Pointer ayah Pointer ibu Pointer anak 1 Pointer anak 2 Pointer next Fungsi-fungsi utama yang ada pada program ini adalah : Insert Update 12

Delete View Export to file

3.1. Manual Program Tampilan pertama program setelah dieksekusi

Gambar 1 Disana terdapat menu pilihan-pilihan,yang mana pada setiap pilihan terdapat fungsinya masing-masing Select berfungsi sebagai tempat untuk menginputkan Berikut penjelasan terhadap pilihan dimana disetiap pilihan mewakili fungsinya masing-masing. 1. Fungsi Insert Berikut yang bisa dilakukan pada fungsi insert : Ketika telah diinputkan 1 maka tampilan yang keluar seperti gambar 2 dan disana kita akan menginputkan nama dan jenis kelamin

Gambar 2 13

Setelah diinputkan maka program akan kembali ketampilan awal menu pilihan, kemudian pada saat menginsetkan orang kedua lengkap dengan nama dan jenis kelamin maka akan muncul tampilan untuk menghubungkan relasi atau menunda dulu untuk menghubungkan relasi seperti pada gambar 3

Gambar 3 Ketika diinputkan dua maka akan kembali ke tampilan menu pilihan tapi ketika diinputkan satu maka tampilan yang keluar akan seperti pada gambar 4 yang diberi tanda merah. Pada gambar 4 diperlihatkan orang yang pertama kita insertkan tadi untuk dihubungkan relasinya dengan orang yang baru diinputkan, untuk menghubungkannya tinggal menginsertkan nama orang yang tersedia dan pada gambar diatas yang tersedia hanya fuad Ketika nama yang ingin dihubungkan telah diinputkan maka akan keluar pilihan-pilihan relasinya dan disini kita akan

menghubungkan dua orang tadi menurut pilihan relasi yang tersedia

Gambar 4

14

Pada saat menghubungkan relasi pastikan jenis kelamin dari orang yang kita insertkan sebelumnya sesuai dengan pilihan relasi pada program, jika relasi yang ingin kita pasangkan tidak sesuai dengan jenis kelaminnya maka akan muncul pesan peringatan pada program. Pada case ini kita memilih relasi nomor tiga yaitu pasangan yang orang bernama fuad yang berjenis kelamin laki-laki (L) akan dipasangkan dengan aura kasih yang berjenis kelamin perempuan (P). Setelah diinputkan maka akan kembali ke menu pilihan.

2. Fungsi Update Berikut yang bisa dilakukan pada fungsi Update : Ketika berada pada tampilan awal kita menginputkan dua yaitu update pada select dan akan muncul tampilan seperti pada gambar 5

Gambar 5 Disana terdapat tiga pilihan yang mempunya fungsi masing-masing sebagai berikut : Update Nama Yaitu fungsi dimana kita dapat merubah nama orang yang telah kita insertkan sebelumnya

Gambar 6

15

Update relasi Yaitu fungsi dimana kita dapat menghubungkan relasi baru pada orang yang telah kita insertkan sebelumnya

Gambar 7 a. Kemudian setelah nama diinputkan sesuai nama orang yang ada pada silsilah keluarga maka tampilannya akan muncul seperti pada gambar 8

Gambar 8 b. Disana terdapat beberapa pilihan update relasi, pada case ini kita memilih update relasi nomor dua yaitu update relasi ibu. Setelah dua diinputkan maka tampilan program akan seperti pada gambar 9

16

Gambar 9 c. Tahap ini adalah menginputkan nama orang dengan relasi baru yang akan dihubungkan. Pastikan dalam memilih orang, jenis kelaminnya harus sesuai dengan relasi yang ingin

dihubungkan. Setelah diinputkan maka akan keluar tampilan seperti pada gambar 10. Disini terlihat pilihan untuk menjadi anak pertama atau kedua

Gambar 10 Back to menu Yaitu berfungsi untuk kembali ke menu awal program

3. Fungsi Delete Berikut yang bisa dilakukan pada fungsi Delete : Ketika berada pada tampilan awal maka kita menginputkan tiga yaitu delete pada select dan akan muncul tampilan seperti pada gambar 11

17

Gambar 11 Disana terdapat tiga pilihan yang mempunya fungsi masing-masing sebagai berikut : Hapus relasi Yaitu fungsi untuk menghapus suatu relasi dari seseorang dalam silsilah keluarga, jika diinputkan satu maka tampilan program akan seperti pada gambar 12

Gambar 12 a. Kemudian kita inputkan nama orang yang akan dihapus relasinya sesuai orang yang ada pada silsilah keluarga, setelah diinputkan maka

tampilan program akan berubah seperti pada gambar 13

Gambar 13 18

b. Pada gambar 13 disana terdapat pilihan-pilihan relasi yang akan dihapus, jika relasi yang akan dihapus tidak ada maka akan muncul pesan peringatan pada program tapi jika jika kita menghapus relasi yang sudah ada maka akan muncul pesan seperti pada gambar 14

Gambar 14 Hapus node Yaitu fungsi untuk menghapus node yang ada pada silsilah keluarga. Jika diinputkan dua maka tampilan program akan seperti pada gambar 15

Gambar 15 a. Pada saat menghapus node kita menginputkan nama yang akan dihapus dari silsilah keluarga, kemudian setelah diinputkan tampilan program akan memberikan pesan yang menandakan bahwa proses pengapusan telah sukses. Back to menu Yaitu berfungsi untuk kembali ke menu awal program

19

4. Fungsi View Berikut yang bisa dilakukan pada fungsi View : Ketika berada pada tampilan awal maka kita menginputkan empat yaitu delete pada select dan akan muncul tampilan seperti pada gambar 16

Gambar 16 Disana terdapat tiga pilihan yang mempunya fungsi masing-masing sebagai berikut : Trace mode Yaitu fungsi untuk melihat relasi-relasi apa saja dan berelasi dengan siapa saja yang terdapat pada node atau orang pada silsilah keluarga, jika diinputkan satu maka tampilan program akan seperti pada gambar 17

Gambar 17 a. Pada tahap ini kita akan memasukan nama orang yang akan ditrace seperti contoh pada gambar 17, kemudian setelah diinputkan akan muncul

tampilan program seperti gambar 18

20

Gambar 18 b. Pada gambar 18 kita telah masuk pada tahap trace dimana disana di perlihatkan relasi yang ada pada node dan dengan siapa dia berelasi, ini merupakan hasil trace dari orang yang namanya telah diinputkan, seperti contoh pada gambar 18 View all Yaitu fungsi untuk melihat relasi-relasi apa saja dan berelasi dengan siapa saja yang terdapat pada semua node atau orang pada silsilah keluarga, jika diinputkan dua maka tampilan program akan seperti pada gambar 19

Gambar 19 a. Pada case ini semua orang yang ada pada silsilah keluarga akan diperlihatkan semua, baik

relasinya dan juga dengan siapa dia berelasi. Back to menu Yaitu berfungsi untuk kembali ke menu awal program 21

5. Export to file Berikut yang bisa dilakukan pada fungsi Export to file : Ketika berada pada tampilan awal maka kita menginputkan lima yaitu Export to file pada select dan akan muncul tampilan seperti pada gambar 20

Gambar 20 Pada tahap ini kita akan mengeksport file silsilah keluarga yang telah kita insertkan tadi dengan cara pertama-tama kita harus membuat nama file yang nantinya sebagai tempat penyimpanan data, seperti contoh pada gambar 20, setelah itu tekan enter dan akan muncul pesan seperti pada gambar 21

Gambar 21

22

3.2. Algoritma Program 1. Fungsi Insert node a. Pertama-tama kita memasukan nama dan jenis kelamin, pertama terjadi pengecekan terhadap jenis kelamin dengan cara memberi kondisi pada character yang diinputkan apabila yang diinputkan tidak sesuai maka akan keluar pesan eror dan akan kembali pada pada saat penginputan nama dan jenis kelamin dengan cara memberi perulangan pada kondisi input yang tidak sesuai, setelah itu akan terjadi pengecekan nama ini dilakukan dengan cara membandingkan string yang baru dengan string yang lama yang ada pada temporari , apabila nama yang inputkan sama dengan yang sebelumnya maka akan keluar pesan eror dan akan kembali pada saat penginputan nama dan jenis kelamin lagi, ini dilakukan dengan cara memberi tanda jika pada saat membandingkan antara kedua string itu keadaannya sama maka kita beri tanda 1 jika tidak 0 kemudian kita beri perulangan ketika tanda sama dengan 1. b. Deklarasi node baru dan pastikan memberikan kondisi NULL pada setiap pointer-pointer penunjuk pada node, jika temporary tidak kosong maka tampilkan dua pilihan yaitu hubungkan relasi dan hubungkan relasi nanti, pada saat hubungkan relasi nanti pointerpointer penunjuk tidak ada yang dihungkan kecuali pinter penyambung antara node. c. Ketika menghubungkan relasi pertama-tama ada pengecekan terhadap nama orang akan dihubungkan relasinya, jika nama orang yang ingin dihubungkan relasinya itu salah maka akan ada pesan peringatan. Pada tahap ini akan muncul lima pilihan relasi yaitu : 1. relasi ayah 2. relasi ibu 3. relasi pasangan 4. relasi anak pertama 5. relasi anak kedua 23

o Pada relasi ayah, orang terakhir diinsertkan (kita anggap saja B) akan diposisikan sebagai ayah dan juga ayah harus berjenis kelamin laki-laki jika tidak akan muncul pesan peringatan, jika pointer node ayah kosong dalam artian jika orang ini(kita anggap saja A) belum punya ayah maka akan langsung dihubungkan jika tidak maka ada pesan peringatan bahwa A telah mempunyai ayah. Jika A tidak mempunyai ayah dan ibu maka A akan langsung direlasikan sebagai anak pertama atau anak kedua dari B. Jika A sudah mempunyai ibu maka B yaitu ayah A akan dipasangkan pada ibu A, sehingga ibu A akan berpasangan dengan B yang sama-sama mempunyai anak A. o Pada relasi ibu, orang terakhir diinsertkan (kita anggap saja B) akan diposisikan sebagai ibu dan juga ibu harus berjenis kelamin perempuan jika tidak akan muncul pesan peringatan, jika pointer node ibu kosong dalam artian jika orang ini(kita anggap saja A) belum punya ibu maka akan langsung dihubungkan jika tidak maka ada pesan peringatan bahwa A telah mempunyai ibu. Jika A tidak mempunyai ibu dan ayah maka A akan langsung direlasikan sebagai anak pertama atau anak kedua dari B. Jika A sudah mempunyai ayah maka B yaitu yang telah menjadi ibu A akan dipasangkan pada ayah A, sehingga ayah A akan berpasangan dengan B yang sama-sama mempunyai anak A. o Pada relasi pasangan jika kedua orang yang ingin dihubungkan relasinya berjenis kelamin berbeda dan juga jika satu sama lain belum mempunyai pasangan maka akan dipasangkan jika tidak maka akan muncul pesan peringatan, jika pasangan ini tidak mempunyai anak maka jika salah satu pasangan yaitu A berjenis kelamin laki-laki akan menjadi ayah dan jika tidak akan menjadi ibu begitu juga sebaliknya untuk pasangan dari A. o Pada relasi anak pertama, yaitu jika A sebagai anak pertama dan B sebagai relasinya, jika jenis kelamin dari B adalah laki-laki maka B akan menjadi ayah dari A dan ayah ini mempunyai anak pertama 24

yaitu A begitu juga sebaliknya jika jenis kelamin dari B adalah perempuan maka B akan menjadi ibu dari A dan ibu ini mempunyai anak pertama yaitu B, jika si B sudah mempunyai anak pertama maka akan muncul pesan peringatan dan tidak bisa dihubungkan. o Pada relasi anak kedua, yaitu jika A sebagai anak kedua dan B sebagai relasinya, jika jenis kelamin dari B adalah laki-laki maka B akan menjadi ayah dari A dan ayah ini mempunyai anak kedua yaitu A begitu juga sebaliknya jika jenis kelamin dari B adalah perempuan maka B akan menjadi ibu dari A dan ibu ini mempunyai anak kedua yaitu B, jika si B sudah mempunyai anak kedua maka akan muncul pesan peringatan dan tidak bisa dihubungkan.

2. Fungsi Delete node a. Jika pada root masih kosong maka proses delete tidak bisa dilakukan dan akan muncul pesan peringatan. b. Jika pada root terdapat node yang telah diinsertkan maka pada tahap ini akan muncul tampilan pilihan hapus yaitu : 1. Hapus relasi 2. Hapus node 3.Kembali ke menu awal c. Hapus relasi, pertama kita menginputkan nama orang yang akan dihapus relasinya, pada saat ini akan dicek apakah nama yang diinputkan tersebut ada atau tidak, jika tidak ada maka akan muncul pesan peringatan tapi jika ada maka sekarang kita akan menghapus relasinya, pada tahap ini muncul tampilan relasi mana saja yang ingin dihapus yaitu : 1. hapus relasi ke ayah 2. hapus relasi ke ibu 3. hapus relasi pasangan 4. hapus relasi anak pertama 25

5. hapus relasi anak kedua o Hapus relasi ke ayah yaitu jika anak pertama sudah mempunyai ayah maka proses delete relasi ke ayah dapat dilakukan jika tidak maka akan muncul pesan peringatan begitu juga sebaliknya untuk anak kedua. Jika ayah telah mempunyai pasangan yaitu ibu dan mempunyai anak pertama maka selain dari relasi pada ayah yang dihapus relasi pada ibu juga akan dihapus begitu juga sebaliknya pada anak kedua. o Hapus relasi ke ibu yaitu jika anak pertama sudah mempunyai ibu maka proses delete relasi ke ibu dapat dilakukan jika tidak maka akan muncul pesan peringatan begitu juga sebaliknya untuk anak kedua. Jika ibu telah mempunyai pasangan yaitu ayah dan mempunyai anak pertama maka selain dari relasi pada ibu yang dihapus relasi pada ayah juga akan dihapus begitu juga sebaliknya pada anak kedua. o Hapus relasi pasangan yaitu jika kedua orang tidak mempunyai pasangan maka delete pasangan dapat dilakukan tapi jika tidak maka akan muncul pesan peringatan. Jika kedua pasangan itu mempunyai anak pertama maka selain relasi pasangan dihapus, relasi anak pertama mereka juga pun dihapus, begitu juga sebaliknya untuk anak kedua. o Hapus relasi anak pertama yaitu jika terdapat anak pertama pada sebuah relasi maka relasi itu dapat dihapus jika tidak maka akan muncul pesan peringatan. Jika orang tua dari anak pertama adalah berjenis kelamin laki-laki maka relasi yang dihapus adalah relasi anak pertama dan ayah dan jika ayah mempunyai pasangan yaitu ibu maka relasi pada ibu juga akan dihapus begitu juga sebaliknya jika berjenis kelamin perempuan maka relasi yang dihapus adalah relasi anak pertama dan ibu dan jika ibu mempunyai pasangan yaitu ayah maka relasi pada ayah juga akan dihapus. o Hapus relasi anak kedua yaitu jika terdapat anak kedua pada sebuah relasi maka relasi itu dapat dihapus jika tidak maka akan 26

muncul pesan peringatan. Jika orang tua dari anak kedua adalah berjenis kelamin laki-laki maka relasi yang dihapus adalah relasi anak kedua dan ayah dan jika ayah mempunyai pasangan yaitu ibu maka relasi pada ibu juga akan dihapus begitu juga sebaliknya jika berjenis kelamin perempuan maka relasi yang dihapus adalah relasi anak kedua dan ibu dan jika ibu mempunyai pasangan yaitu ayah maka relasi pada ayah juga akan dihapus. d. Hapus node, pertama kita inputkan nama orang yang akan kita hapus dalam silsilah keluarga, kemudian disini akan teradi proses pengecekan nama jika inputan salah maka akan keluar pesan peringatan, kemudian lakukan penghapusan dan perbaiki relasi-relasi orang yang berhubungan dengan orang yang dihapus.

3. Fungsi Update: a. Jika pada top/root masih berniai NULL, maka akan muncul peringatan bahwa proses update gagal, karena silsilah keluarga masih kosong. b. Kemudian, jika top/root tidak sama dengan NULL, maka akan muncul 3 pilihan menu, update nama, update relasi, dan pilihan kembali ke menu. c. Jika kita memilih proses update nama o Program akan meminta user menginputkan nama yang akan dirubah, jika nama yang dicari tidak ada dalam silsilah keluarga maka akan muncul pesan peringatan bahwa nama yang dicari tidak ada dalam. o Kemudian User menginputkan nama baru, jika nama baru dimasukkan sudah ada dalam silsilah keluarga maka akan muncul pesan peringatan bahwa nama sudah ada dalam silsilah keluarga o Kemudian nama lama akan diganti dengan nama baru d. Jika kita memilih proses update relasi o Program akan mengecek jumlah orang pada silsilah keluarga, jika hanya terdapat 1 orang, maka program akan menampilkan pesan 27

peringatan bahwa proses update gagal, harus ada 2 orang atau lebih. Baru program akan melanjutkan ke proses berikutnya o Kemudian akan muncul menu plilhan update relasi yaitu update relasi ayah, update relasi ibu, update relasi pasangan, update realasi anak pertama, update relasi anak kedua lalu program akan meminta pilihan dari user o Jika user memilih update relasi ayah Pertama akan dicek apakah relasi ke ayah masi kosong atau tidak, jika bukan NULL maka akan muncul pesan

peringatan bahwa proses update gagal, relasi ke ayah tidak kosong User kemudian memasukkan nama ayah yang akan dihubungkan. apakah nama ayah yang dicari ada atau tidak di dalam silsilah keluarga, jika tidak ada maka akan tampil pesan error bahwa nama yang dicari tidak ada dalam silsilah keluarga Kemudian akan ada pengecekan hubungan keluarga/ hubungan darah, jika terjadi hubungan darah maka proses update gagal karena ada hubungan darah Program akan meminta inputan dari user bagaimana hubungan ke anak dari ayah, apakah menjadi anak pertama atau menjadi anak kedua. Jika si ayah sudah mempunyai dua orang anak, maka akan muncul pesan error bahwa ayah sudah memiliki 2 orang anak Jika hubungan dari ayah adalah sebagai anak pertama atau anak kedua Maka ayah dan anak akan dihubungkan dengan menunjuk pointer pada masing masing node yang bekaitan o Jika user memilih update relasi ibu

28

Pertama akan dicek apakah relasi ke ibu masi kosong atau tidak, jika bukan NULL maka akan muncul pesan

peringatan bahwa proses update gagal, relasi ke ayah tidak kosong User kemudian memasukkan nama ibu yang akan dihubungkan. apakah nama ayah yang dicari ada atau tidak di dalam silsilah keluarga, jika tidak ada maka akan tampil pesan error bahwa nama yang dicari tidak ada dalam silsilah keluarga Kemudian akan ada pengecekan hubungan keluarga/ hubungan darah, jika terjadi hubungan darah maka proses update gagal karena ada hubungan darah Program akan meminta inputan dari user bagaimana hubungan ke anak dari ibu, apakah menjadi anak pertama atau menjadi anak kedua. Jika si ibu sudah mempunyai dua orang anak, maka akan muncul pesan error bahwa ibu sudah memiliki 2 orang anak Jika hubungan dari ibu adalah sebagai anak pertama atau anak kedua Maka ibu dan anak akan dihubungkan dengan menunjuk pointer pada masing masing node yang bekaitan o Jika user memilih update relasi pasangan Jika relasi ke pasangan tidak sama dengan NULL, maka akan muncul pesan error bahwa proses update gagal, karena sudah memiliki pasangan Kemudian program akan meminta nama pasangan yang akan dihubungkan, lalu dicari apakah nama yang dicari ada atau tidak di dalam silsilah keluarga, jika tidak ada maka akan tampil pesan error bahwa nama yang dicari tidak ada dalam silsilah keluarga 29

Kemudian diperikasa jenis kelamin apakah sama atau tidak, jika sama maka akan keluar pesan error bahwa jenis kelamin salah

Lalu diperiksa apakah ada hubungan darah atau tidak, jika ada maka akan tampil pesan error bahwa ada relasi terlarang

Kemudian barulah dipasangkan antara dua orang tersebut

o Jika user memilih update relasi anak pertama Jika relasi ke anak pertama tidak sama dengan NULL, maka akan muncul pesan error bahwa proses update gagal, karena sudah memiliki anak pertama Kemudian program akan meminta nama anak pertama yang akan dihubungkan, lalu dicari apakah nama yang dicari ada atau tidak di dalam silsilah keluarga, jika tidak ada maka akan tampil pesan error bahwa nama yang dicari tidak ada dalam silsilah keluarga Lalu dicek apakah anak pertama tersebut sudah memiliki orang tua atau belum, jika sudah maka akan muncul pesan error bahwa anak sudah memiliki orang tua Barulah kemudian direlasikan ke anak pertama o Jika user memilih update relasi anak kedua Jika relasi ke anak kedua tidak sama dengan NULL, maka akan muncul pesan error bahwa proses update gagal, karena sudah memiliki anak kedua Kemudian program akan meminta nama anak kedua yang akan dihubungkan, lalu dicari apakah nama yang dicari ada atau tidak di dalam silsilah keluarga, jika tidak ada maka akan tampil pesan error bahwa nama yang dicari tidak ada dalam silsilah keluarga Lalu dicek apakah anak kedua tersebut sudah memiliki orang tua atau belum, jika sudah maka akan muncul pesan error bahwa anak sudah memiliki orang tua 30

4. Fungsi View :

Barulah kemudian diupdate relasi ke anak kedua

a. Terdapat dua fungsi utama pada view yaitu : 1. Trace mode 2. View all b. Trace mode yaitu jika kita ingin melihat relasi pada node atau orang pada bagan silsilah keluarga c. View all yaitu jika kita ingin melihat relasi pada semua orang yang terdapat pada silsilah keluarga

5. Fungsi Export file : a. Pertama-tama kita buat nama file untuk menyimpan data-data relasi yang telah kita inputkan atau kita olah pada sebuah file teks dan kemudian menyimpannya, jika kita mempunyai data baru dalam program dan ingin menyimpan pada file teks yang sama maka data yang sebelumnya tersimpan akan hilang dan akan terganti dengan data yang baru

3.3. Kode Program #include #include #include #include

struct tnode {

char nama[50];

31

char jk; struct tnode *pasangan,*ayah,*ibu,*anak1,*anak2,*next;

};

struct t_node{

struct tnode *node; struct t_node *next; };

void insert(struct tnode **top); void update(struct tnode **top); void proses_delete(struct tnode **top); void view(struct tnode *top); void view_nama(struct tnode *top); void dump(struct tnode *top); void rekursif_cek(struct tnode *temp, struct tnode *temp1, struct t_node **head,struct t_node **tail, int *flag); int cek_hubungan_darah(struct tnode **temp,struct tnode **temp1);

32

void inisialisasi(struct t_node **head,struct t_node **tail); void push(struct t_node **head,struct t_node **tail, struct tnode **temp); void pop(struct t_node **head,struct t_node **tail); void keren(); void hantukeren();

int main() { struct tnode *top; top=NULL; int pilih; int flag=0; do { system("cls"); if(flag == 0) { keren(); } 33

printf("\n"); printf("1. Insert\n"); printf("2. Update\n"); printf("3. Delete\n"); printf("4. View\n"); printf("5. Export to file\n"); printf("6. Exit\n\n"); printf(" Select : ");

fflush(stdin); scanf("%d",&pilih); switch(pilih) { case 1: { insert(&top); break; } case 2: { update(&top); break; } 34

case 3: { proses_delete(&top); break; } case 4: { view(top); break; } case 5: { dump(top); break; } case 6: { system("cls"); hantukeren();

break; 35

} default: { printf("Pilihan salah!!!\n\n"); getch(); break; } } flag = 1; } while(pilih!=6); return 0; }

void insert(struct tnode **top) { struct tnode *temp,*temp_1,*temp_2,*node; char nama[50],nama_1[50]; char jk; int flag,pilih; do { 36

system("cls"); flag=0; printf("Masukkan Nama : "); fflush(stdin); scanf("%[^\n]",nama); printf("Masukkan Jenis Kelamin : "); fflush(stdin); scanf("%c",&jk); if(!(jk=='l' || jk=='L' || jk=='p' || jk=='P')) { flag=1; printf("Jenis kelamin salah!\n"); getch(); } else { if(*top!=NULL) { temp=*top; while(temp!=NULL) { if(strcmp(nama,temp->nama)==0) 37

{ flag=1; break; } temp=temp->next; } if(flag==1) { printf("%s sudah ada dalam silsilah keluarga!!\n\n",nama); getch(); } } } } while(flag==1);

node=(struct tnode*)malloc(sizeof(struct tnode)); strcpy(node->nama,nama); if(jk=='l') { node->jk='L';

38

} else if(jk=='p') { node->jk='P'; } else { node->jk=jk; } node->ayah=NULL; node->ibu=NULL; node->anak1=NULL; node->anak2=NULL; node->pasangan=NULL; node->next=NULL;

if(*top==NULL) { *top=node; system("cls"); printf("Proses insert sukses!"); getch(); 39

} else { temp=*top; while(temp!=NULL) { temp=temp->next; } temp_1=node;

do { system("cls"); printf("1. Hubungkan %s ke silsilah keluarga\n",temp_1->nama); printf("2. Jangan hubungkan dulu\n"); printf("Masukkan pilihan : "); fflush(stdin); scanf("%d",&pilih); if(pilih==2) { temp_2=*top;

40

while(temp_2->next!=NULL) { temp_2=temp_2->next; } temp_2->next=temp_1; return; } else if(!(pilih==1 || pilih==2)) { printf("Pilihan salah\n\n"); getch(); } }while(!(pilih==1 || pilih==2));

//cek nama di silsilah keluarga do { system("cls"); view_nama(*top); printf("Masukkan Nama yang akan dihubungkan : "); fflush(stdin);

41

scanf("%[^\n]",nama_1); temp=*top; flag=0; while(temp!=NULL) { if(strcasecmp(temp->nama,nama_1)==0) { flag=1; break; } temp=temp->next; } if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); }

}while(flag==0); // printf("\nPilihan relasi \n");

42

printf("1. %s merupakan ayah dari %s \n",temp_1->nama,temp->nama); printf("2. %s merupakan ibu dari %s \n",temp_1>nama,temp->nama); printf("3. %s merupakan pasangan dari %s \n",temp_1->nama,temp->nama); printf("4. %s merupakan anak pertama dari %s \n",temp_1->nama,temp->nama); printf("5. %s merupakan anak kedua dari %s \n",temp_1->nama,temp->nama); printf("Masukkan Pilihan : "); scanf("%d",&pilih); switch(pilih) { case 1: { if(temp_1->jk=='L') { if(temp->ayah==NULL) { if(temp->ibu==NULL) { do { 43

printf("\n\n1. %s merupakan anak pertama dari %s\n",temp->nama,temp_1>nama); printf("2. %s merupakan anak kedua dari %s\n",temp->nama,temp_1->nama); printf("Masukkan pilihan : "); fflush(stdin); scanf("%d",&pilih); switch(pilih) { case 1: { temp_1>anak1=temp; temp>ayah=temp_1; system("cls"); printf("Proses insert sukses!"); getch(); break; } case 2:

44

{ temp_1>anak2=temp; temp>ayah=temp_1; system("cls"); printf("Proses insert sukses!"); getch(); break; } default: {

printf("Masukkan salah!\n\n"); getch(); break; } } } while(pilih!=1 && pilih!=2); } else 45

{ if(temp->ibu->anak1==temp) { temp_1->anak1=temp; temp->ayah=temp_1; temp_1->pasangan=temp>ibu; temp->ibu>pasangan=temp_1; if(temp->ibu>anak2!=NULL) { temp_1->anak2=temp>ibu->anak2; temp->ibu->anak2>ayah=temp_1; } } else if(temp->ibu>anak2==temp) { temp_1->anak2=temp; temp->ayah=temp_1;

46

temp_1->pasangan=temp>ibu; temp->ibu>pasangan=temp_1; if(temp->ibu>anak1!=NULL) { temp_1->anak1=temp>ibu->anak1; temp->ibu->anak1>ayah=temp_1; } } }

//masukkan node ke graf silsilah keluarga temp_2=*top; while(temp_2->next!=NULL) { temp_2=temp_2->next; } temp_2->next=temp_1;

47

system("cls"); printf("Proses insert sukses!"); getch(); } else { printf("Proses insert gagal, %s sudah memiliki ayah !", temp->nama); free(node); getch(); } } else { printf("Proses insert gagal, jenis kelamin dari %s salah",temp_1->nama); free(node); getch(); } break; } case 2: 48

{ if(temp_1->jk=='P') { if(temp->ibu==NULL) { if(temp->ayah==NULL) { do { printf("1. %s merupakan anak pertama dari %s\n",temp->nama,temp_1->nama); printf("2. %s merupakan anak kedua dari %s\n",temp->nama,temp_1->nama); printf("Masukkan pilihan : "); fflush(stdin); scanf("%d",&pilih); switch(pilih) { case 1: { temp_1>anak1=temp;

49

temp>ibu=temp_1; break; } case 2: { temp_1>anak2=temp; temp>ibu=temp_1; break; } default: {

printf("Masukkan salah!\n\n"); getch(); break; } } } while(pilih!=1 && pilih!=2); } 50

else { if(temp->ayah->anak1==temp) { temp_1->anak1=temp; temp->ibu=temp_1; temp_1->pasangan=temp>ayah; temp->ayah>pasangan=temp_1; if(temp->ayah>anak2!=NULL) { temp_1->anak2=temp>ayah->anak2; temp->ayah->anak2>ibu=temp_1; }

} else if(temp->ayah>anak2==temp) { temp_1->anak2=temp; 51

temp->ibu=temp_1; temp_1->pasangan=temp>ayah; temp->ayah>pasangan=temp_1; if(temp->ayah>anak1!=NULL) { temp_1->anak1=temp>ayah->anak1; temp->ayah->anak1>ibu=temp_1; } } }

//masukkan node ke graf silsilah keluarga temp_2=*top; while(temp_2->next!=NULL) { temp_2=temp_2->next; } temp_2->next=temp_1; 52

system("cls"); printf("Proses insert sukses!"); getch(); } else { printf("Proses insert gagal, %s sudah memiliki ibu !", temp->nama); free(node); getch(); }

} else { printf("Proses insert gagal, jenis kelamin dari %s salah",temp_1->nama); free(node); getch(); }

53

break; } case 3: { if(temp_1->jk=='L' || temp_1->jk=='P') { if(temp_1->jk!=temp->jk) { if(temp->pasangan==NULL) { temp->pasangan=temp_1; temp_1->pasangan=temp; if(temp->anak1!=NULL) { if(temp->jk=='l' || temp->jk=='L') { temp->anak1>ibu=temp_1; temp_1->anak1=temp>anak1; } else 54

{ temp->anak1>ayah=temp_1; temp_1->anak1=temp>anak1; } } if(temp->anak2!=NULL) { if(temp->jk=='l' || temp->jk=='L') { temp->anak2>ibu=temp_1; temp_1->anak2=temp>anak2; } else { temp->anak2>ayah=temp_1; temp_1->anak2=temp>anak2; }

55

}

//masukkan node ke graf silsilah keluarga temp_2=*top; while(temp_2->next!=NULL) { temp_2=temp_2->next; } temp_2->next=temp_1; system("cls"); printf("Proses insert sukses!"); getch(); } else { printf("Proses insert gagal, %s sudah memiliki pasangan!!! \n\n",temp->nama); free(node); getch(); }

56

} else { printf("Proses insert gagal, jenis kelamin dari %s dan %s sama!\n\n",temp_1>nama,temp->nama); free(node); getch(); } } else { printf("Proses insert gagal, jenis kelamin dari %s salah\n\n",temp_1->nama); free(node); getch(); } break; } case 4: { if(temp->anak1==NULL) { 57

if(temp->jk=='L') { temp->anak1=temp_1; temp_1->ayah=temp; if(temp->pasangan!=NULL) { temp->pasangan>anak1=temp_1; temp_1->ibu=temp->pasangan; }

} else { temp->anak1=temp_1; temp_1->ibu=temp; if(temp->pasangan!=NULL) { temp->pasangan>anak1=temp_1; temp_1->ayah=temp>pasangan; 58

} }

//masukkan node ke graf silsilah keluarga temp_2=*top; while(temp_2->next!=NULL) { temp_2=temp_2->next; } temp_2->next=temp_1; system("cls"); printf("Proses insert sukses!"); getch(); } else { printf("Proses insert gagal, %s sudah memiliki anak pertama ! ",temp->nama); getch(); } break; } 59

case 5: { if(temp->anak2==NULL) {

if(temp->jk=='L') { temp->anak2=temp_1; temp_1->ayah=temp; if(temp->pasangan!=NULL) { temp->pasangan>anak2=temp_1; temp_1->ibu=temp->pasangan; }

} else { temp->anak2=temp_1; temp_1->ibu=temp; if(temp->pasangan!=NULL)

60

{ temp->pasangan>anak2=temp_1; temp_1->ayah=temp>pasangan; } } //masukkan node ke graf silsilah keluarga temp_2=*top; while(temp_2->next!=NULL) { temp_2=temp_2->next; } temp_2->next=temp_1; system("cls"); printf("Proses insert sukses!"); getch(); } else { printf("Proses insert gagal, %s sudah memiliki anak kedua ! ",temp->nama);

61

getch(); } break; } default: { printf("Pilihan salah\n\n"); getch(); break; } } } }

void proses_delete(struct tnode **top) { struct tnode *temp,*temp1; char nama[50]; int pilih,flag; if(*top==NULL) { 62

system("cls"); printf("Proses delete gagal, silsilah keluarga masih kosong!\n\n"); getch(); return; } do { system("cls"); printf("Proses delete : \n"); printf("1. Hapus relasi\n"); printf("2. Hapus node\n"); printf("3. Back to main menu\n"); printf("Masukkan Pilihan :"); fflush(stdin); scanf("%d",&pilih); switch(pilih) { case 1: { do {

63

system("cls"); view_nama(*top); printf("Masukkan Nama yang akan dihapus relasinya : "); fflush(stdin); scanf("%[^\n]",nama); temp=*top; flag=0; while(temp!=NULL) { if(strcasecmp(temp>nama,nama)==0) { flag=1; break; } temp=temp->next; } if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n");

64

//tampilkan nama yang ada di linked list } }while(flag==0);

do { system("cls"); printf("Perhatikan! jika menghapus relasi, maka relasi yang dihapus tidak hanya 1 saja, tetapi SELURUH relasi yang berkaitan dengan relasi yang dihapus\n"); printf("1. Hapus relasi ke ayah dari %s \n",temp->nama); printf("2. Hapus relasi ke ibu dari %s \n",temp->nama); printf("3. Hapus relasi ke pasangan dari %s \n",temp->nama); printf("4. Hapus relasi ke anak pertama dari %s \n",temp->nama); printf("5. Hapus relasi ke anak kedua dari %s \n",temp->nama); printf("6. Back to menu\n"); printf("Masukkan Pilihan : "); fflush(stdin); 65

scanf("%d",&pilih); switch(pilih) { case 1: { if(temp->ayah!=NULL) { temp1=temp->ayah; if(temp1->anak1==temp) { temp->ayah=NULL; temp1->anak1=NULL; } else if(temp1>anak2==temp) { temp1->anak2>ayah=NULL; temp1->anak2=NULL; }

if(temp1>pasangan!=NULL) 66

{ if(temp1->pasangan>anak1==temp) { temp1>pasangan->anak1->ibu=NULL; temp1>pasangan->anak1=NULL; } if(temp1->pasangan>anak2==temp) { temp1>pasangan->anak2->ibu=NULL; temp1>pasangan->anak2=NULL; } } //tampilkan pesan sukses system("cls"); printf("Proses delete relasi sukses!"); getch(); } 67

else { printf("\nRelasi ke ayah dari %s sudah kosong!",temp->nama); } break; } case 2: { if(temp->ibu!=NULL) { temp1=temp->ibu; if(temp1->anak1==temp) { temp->ibu=NULL; temp1->anak1=NULL; } else if(temp1>anak2==temp) { temp1->anak2>ibu=NULL; temp1->anak2=NULL; 68

} if(temp1>pasangan!=NULL) { if(temp1->pasangan>anak1==temp) { temp1>pasangan->anak1->ayah=NULL; temp1>pasangan->anak1=NULL; } if(temp1->pasangan>anak2==temp) { temp1>pasangan->anak2->ayah=NULL; temp1>pasangan->anak2=NULL; } } //tampilkan pesan sukses system("cls");

69

printf("Proses delete relasi sukses!"); getch(); } else { printf("\nRelasi ke ibu dari %s sudah tidak ada! \n",temp->nama); } break; } case 3: { if(temp->pasangan!=NULL) { temp1=temp->pasangan;

if(temp->anak1!=NULL) { temp->anak1>ayah=NULL; temp->anak1=NULL;

70

temp1->anak1>ibu=NULL; temp1->anak1=NULL; } if(temp->anak2!=NULL) { temp->anak2>ayah=NULL; temp->anak2=NULL; temp1->anak2>ibu=NULL; temp1->anak2=NULL; } temp->pasangan=NULL; temp1->pasangan=NULL; system("cls"); printf("Proses delete relasi sukses!"); getch(); } else { printf("\nRelasi ke pasangan dari %s sudah kosong!",temp->nama); 71

getch(); }

break; } case 4: { if(temp->anak1!=NULL) { if(temp->jk=='L') { temp->anak1>ayah=NULL; temp->anak1=NULL; if(temp>pasangan!=NULL) { temp->pasangan>anak1->ibu=NULL; temp->pasangan>anak1=NULL; } }

72

else { temp->anak1>ibu=NULL; temp->anak1=NULL; if(temp>pasangan!=NULL) { temp->pasangan>anak1->ayah=NULL; temp->pasangan>anak1=NULL; } } system("cls"); printf("Proses delete relasi sukses!"); getch(); } else { printf("\nRelasi ke anak pertama dari %s sudah kosong!",temp->nama); getch(); 73

}

break; } case 5: { if(temp->anak2!=NULL) { temp->anak2->ayah=NULL; temp->anak2=NULL; if(temp>pasangan!=NULL) { temp->pasangan>anak2->ibu=NULL; temp->pasangan>anak2=NULL; } system("cls"); printf("Proses delete relasi sukses!"); getch(); }

74

else { printf("\nRelasi ke anak kedua dari %s sudah kosong!",temp->nama); getch(); } break; } case 6: { return; break; } default: { printf("Pilihan salah!\n\n"); getch(); break; } } } while(pilih!=6); 75

break; } case 2: { do { system("cls"); view_nama(*top); printf("Masukkan Nama yang akan dihapus : "); fflush(stdin); scanf("%[^\n]",nama); temp=*top; flag=0; while(temp!=NULL) { if(strcasecmp(temp>nama,nama)==0) { flag=1; break; } temp=temp->next; 76

} if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); } }while(flag==0);

//proses delete node dan perbaiki pointer yang nunjuk node yang akan dihapus //lewatin pointer yang kena delete

if(temp==*top) { if(temp->next==NULL) { *top=NULL; free(temp); return; } else { 77

*top=temp->next; } } else if(temp->next==NULL) { temp1=*top; while(temp1->next!=temp) { temp1=temp1->next; } temp1->next=NULL; } else { temp1=*top; while(temp1->next!=temp) { temp1=temp1->next; } temp1->next=temp->next; } // perbaiki pointer 78

if(temp->ayah!=NULL) { if(temp->ayah->anak1==temp) { temp->ayah->anak1=NULL; } else if(temp->ayah->anak2==temp) { temp->ayah->anak2=NULL; } } if(temp->ibu!=NULL) { if(temp->ibu->anak1==temp) { temp->ibu->anak1=NULL; } else if(temp->ibu->anak2==temp) { temp->ibu->anak2=NULL; } 79

} if(temp->pasangan!=NULL) { temp->pasangan->pasangan=NULL; } if(temp->anak1!=NULL) { if(temp->anak1->ayah==temp) { temp->anak1->ayah=NULL; } else if(temp->anak1->ibu==temp) { temp->anak1->ibu=NULL; } } if(temp->anak2!=NULL) { if(temp->anak2->ayah==temp) { temp->anak2->ayah=NULL; } 80

else if(temp->anak2->ibu==temp) { temp->anak2->ibu=NULL; } } free(temp); system("cls"); printf("Proses delete sukses!"); getch(); break; } case 3: { break; } default: { printf("Pilihan salah\n\n"); getch(); break; } } 81

}while(pilih!=3);

}

void update(struct tnode **top) { struct tnode *temp,*temp1; int pilih,flag; char nama[50],nama1[50]; if(*top==NULL) { system("cls"); printf("Proses update gagal, silsilah keluarga masih kosong!\n"); getch(); return; } do { system("cls"); printf("Proses Update\n");

82

printf("1. Update Nama \n"); printf("2. Update relasi\n"); printf("3. Back to menu\n"); printf("Masukkan pilihan : "); fflush(stdin); scanf("%d",&pilih); switch(pilih) { case 1: { do { system("cls"); printf("Masukkan nama yang akan dirubah : "); fflush(stdin); scanf("%[^\n]",nama); temp=*top; flag=0; while(temp!=NULL) { if(strcasecmp(temp>nama,nama)==0) 83

{ flag=1; break; } temp=temp->next; } if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); //tampilkan nama yang ada di linked list }

}while(flag==0);

printf("Masukkan Nama baru : "); fflush(stdin); scanf("%[^\n]",nama1); system("cls"); if(strcasecmp(nama1,nama)==0) 84

{ printf("Nothing to update\n\n"); getch(); break; } temp1=*top; flag=0; while(temp1!=NULL) { if(temp1!=temp) { if(strcasecmp(temp1>nama,nama1)==0) { flag=1; break; } } temp1=temp1->next; } if(flag==1) {

85

printf("Proses update nama gagal, %s sudah ada dalam silsilah keluarga, silahkan gunakan nama yang berbeda(unik)",nama1); } else { strcpy(temp->nama,nama1); printf("Nama %s telah diganti menjadi %s\n\n",nama,nama1); } getch(); break; } case 2: { system("cls"); if((*top)->next==NULL) { system("cls"); printf("Proses update relasi gagal, minimal harus ada 2 orang dalam silsilah keluarga!"); getch(); break;

86

} do { system("cls"); view_nama(*top); printf("Masukkan nama yang akan diupdate relasinya : "); fflush(stdin); scanf("%[^\n]",nama); temp=*top; flag=0; while(temp!=NULL) { if(strcasecmp(temp>nama,nama)==0) { flag=1; break; } temp=temp->next; } if(flag==0) { 87

printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); //tampilkan nama yang ada di linked list } }while(flag==0);

do { system("cls"); printf("1. Update relasi ayah dari %s \n",temp->nama); printf("2. Update relasi ibu dari %s \n",temp->nama); printf("3. Update relasi pasangan dari %s \n",temp->nama); printf("4. Update relasi anak pertama dari %s \n",temp->nama); printf("5. Update relasi anak kedua dari %s \n",temp->nama); printf("6. Back to menu\n"); printf("Masukkan pilihan : "); fflush(stdin);

88

scanf("%d",&pilih); switch(pilih) { case 1: { if(temp->ayah==NULL) { //proses cari nama ayah do { system("cls"); view_nama(*top); printf("Masukkan nama ayah dari %s : ",temp->nama); fflush(stdin);

scanf("%[^\n]",nama1); system("cls"); temp1=*top; flag=0; while(temp1!=NULL) {

89

if(strcasecmp(temp1->nama,nama1)==0) { flag=1; break; } temp1=temp1>next; } if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); //tampilkan nama yang ada di linked list } else if(temp1==temp) { printf("Error, Nama anak dan ayah sama!"); flag=0; getch(); 90

} }while(flag==0);

if(cek_hubungan_darah(&temp,&temp1)==1) { system("cls"); printf("Proses update error, ada hubungan/relasi terlarang!"); getch(); return; } if(temp1->anak1==NULL || temp1->anak2==NULL) { do { system("cls"); printf("1. Jadikan %s sebagai anak pertama dari %s \n",temp->nama, temp1->nama); printf("2. Jadikan %s sebagai anak kedua dari %s \n",temp->nama, temp1->nama);

91

printf("3. Kembali ke pilihan menu relasi\n");

printf("Masukkan pilihan : "); fflush(stdin);

scanf("%d",&pilih); switch(pilih) { case 1: {

if(temp1->anak1==NULL) {

temp->anak1=temp;

temp->ayah=temp1;

if(temp1->pasangan!=NULL) {

temp1->pasangan->anak1=temp;

temp->ibu=temp1->pasangan; 92

}

//sukses

printf("Proses update sukses");

getch();

return; } else {

printf("Proses update gagal, %s sudah memiliki anak pertama",temp1->nama);

getch(); } break; } case 2: {

if(temp1->anak2==NULL) { 93

temp->anak2=temp;

temp->ayah=temp1;

if(temp1->pasangan!=NULL) {

temp1->pasangan->anak2=temp;

temp->ibu=temp1->pasangan; }

//sukses

printf("Proses update sukses");

getch();

return; } else {

printf("Proses update gagal, %s sudah memiliki anak kedua",temp1->nama); 94

getch(); } break;

} case 3: { break; } default: {

printf("Pilihan salah!\n");

getch(); break; } } }while(pilih!=3);

} else 95

{ printf("Proses update gagal, %s sudah memiliki dua orang anak",temp1>nama); getch(); } } else { printf("Proses update gagal, relasi ke ayah harus kosong. silahkan menghapus relasi ke ayah terlebih dahulu pada menu delete"); getch(); } break; } case 2: { if(temp->ibu==NULL) { //proses cari nama ayah do {

96

system("cls"); view_nama(*top); printf("Masukkan nama ibu dari %s : ",temp->nama); fflush(stdin);

scanf("%[^\n]",nama1); temp1=*top; flag=0; while(temp1!=NULL) {

if(strcasecmp(temp1->nama,nama1)==0) { flag=1; break; } temp1=temp1>next; } if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); 97

getch(); //tampilkan nama yang ada di linked list } else if(temp1==temp) { printf("Error, Nama anak dan ibu sama!"); flag=0; getch(); } }while(flag==0);

if(cek_hubungan_darah(&temp,&temp1)==1) { system("cls"); printf("Proses update error, ada hubungan/relasi terlarang!"); getch(); return; }

98

if(temp1->anak1==NULL || temp1->anak2==NULL) { do { system("cls"); printf("1. Jadikan %s sebagai anak pertama dari %s \n",temp->nama, temp1->nama); printf("2. Jadikan %s sebagai anak kedua dari %s \n",temp->nama, temp1->nama); printf("3. Kembali ke pilihan menu relasi\n");

printf("Masukkan pilihan : "); fflush(stdin);

scanf("%d",&pilih); switch(pilih) { case 1: {

if(temp1->anak1==NULL) 99

{

temp->anak1=temp;

temp->ibu=temp1;

if(temp1->pasangan!=NULL) {

temp1->pasangan->anak1=temp;

temp->ayah=temp1->pasangan; }

//sukses

printf("Proses update sukses");

getch();

return; } else {

100

printf("Proses update gagal, %s sudah memiliki anak pertama",temp1->nama);

getch(); } break; } case 2: {

if(temp1->anak2==NULL) {

temp->anak2=temp;

temp->ibu=temp1;

if(temp1->pasangan!=NULL) {

temp1->pasangan->anak2=temp;

temp->ayah=temp1->pasangan; } 101

//sukses

printf("Proses update sukses");

getch();

return; } else {

printf("Proses update gagal, %s sudah memiliki anak kedua",temp1->nama);

getch(); } break; } case 3: { break; } default:

102

{

printf("Pilihan salah!\n");

getch(); break; } } }while(pilih!=3); } else { printf("Proses update gagal, %s sudah memiliki dua orang anak",temp1>nama); getch(); }

} else { printf("Proses update gagal, %s sudah memiliki ibu",temp->nama); getch(); 103

} break; } case 3: { // if(temp->pasangan==NULL) { do { system("cls"); view_nama(*top); printf("Masukkan nama pasangan dari %s : ",temp->nama); fflush(stdin);

scanf("%[^\n]",nama1); system("cls"); temp1=*top; flag=0; while(temp1!=NULL) {

104

if(strcasecmp(temp1->nama,nama1)==0) { flag=1; break; } temp1=temp1>next; } if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); //tampilkan nama yang ada di linked list } else if(temp1==temp) { printf("Error, Nama pasangan sama!"); flag=0; getch(); 105

} }while(flag==0);

if(cek_hubungan_darah(&temp,&temp1)==1) { system("cls"); printf("Proses update error, ada hubungan/relasi terlarang!"); getch(); return; }

flag=0;

if(temp1>pasangan==NULL) { if(temp>anak1!=temp1->anak1) { if(temp>anak1!=NULL) { 106

if(temp1>anak1!=NULL) { flag=1; } } } if(flag==0)// lanjut ke cek anak ke 2 { if(temp>anak1!=temp1->anak1) { if(temp>anak1!=NULL) {

if(temp1->anak1!=NULL) {

flag=1; } } } 107

} if(flag==0) { //jika anak anak dari 2 pasangan itu sudah sesuai temp>pasangan=temp1; temp1>pasangan=temp; if(temp>jk=='L') { //kalo si temp itu laki laki if(temp>anak1!=NULL) {

if(temp1->anak1==NULL) {

temp->anak1->ibu=temp1;

temp1->anak1=temp->anak1; } 108

} else {

if(temp1->anak1!=NULL) {

temp->anak1=temp1->anak1;

temp1->anak1->ayah=temp; } } if(temp>anak2!=NULL) {

if(temp1->anak2==NULL) {

temp->anak2->ibu=temp1;

temp1->anak2=temp->anak2; } }

109

else {

if(temp1->anak2!=NULL) {

temp->anak2=temp1->anak2;

temp1->anak2->ayah=temp; } } } else // kalo temp itu cewek (jadi ibu anaknya) { if(temp>anak1!=NULL) {

if(temp1->anak1==NULL) {

temp->anak1->ayah=temp1;

temp1->anak1=temp->anak1; 110

} } else {

if(temp1->anak1!=NULL) {

temp->anak1=temp1->anak1;

temp1->anak1->ibu=temp; } } if(temp>anak2!=NULL) {

if(temp1->anak2==NULL) {

temp->anak2->ayah=temp1;

temp1->anak2=temp->anak2; }

111

} else {

if(temp1->anak2!=NULL) {

temp->anak2=temp1->anak2;

temp1->anak2->ibu=temp; } } } printf("Proses update sukses"); getch(); return; } else { printf("Proses update error, anak anak dari %s dan %s tidak sama!",temp->nama,temp1->nama);; getch(); 112

} } else { printf("Proses update gagal, %s sudah memiliki pasangan",temp1->nama); getch(); } } else { system("cls"); printf("Proses update gagal, %s sudah memiliki pasangan\n",temp->nama); getch(); } break; } case 4: { if(temp->anak1==NULL) { //proses cari nama 113

do { system("cls"); view_nama(*top); printf("Masukkan nama anak pertama dari %s : ",temp->nama); fflush(stdin);

scanf("%[^\n]",nama1); system("cls"); temp1=*top; flag=0; while(temp1!=NULL) {

if(strcasecmp(temp1->nama,nama1)==0) { flag=1; break; } temp1=temp1>next; }

114

if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); //tampilkan nama yang ada di linked list } else if(temp1==temp) { printf("Error, Nama ayah/ibu dan anak pertama sama!"); flag=0; getch(); } }while(flag==0);

if(cek_hubungan_darah(&temp,&temp1)==1) { system("cls"); printf("Proses update error, ada hubungan/relasi terlarang!"); getch(); 115

return; }

if(temp->jk=='L') { if(temp1>ayah==NULL) { //kalo orang tuanya laki2 temp>anak1=temp1; temp1>ayah=temp; if(temp>pasangan!=NULL) { temp>pasangan->anak1=temp1; temp1>ibu=temp->pasangan; } printf("Proses update sukses"); getch(); 116

return; } else { printf("Proses update gagal, %s sudah memiliki ayah!",temp1->nama); getch(); } } else { if(temp1>ibu==NULL) { //kalo orang tuanya perempuan temp>anak1=temp1; temp1>ibu=temp; if(temp>pasangan!=NULL) {

117

temp>pasangan->anak1=temp1; temp1>ayah=temp->pasangan; } printf("Proses update sukses"); getch(); return; } else { printf("Proses update gagal, %s sudah memiliki ibu!",temp1->nama); getch(); } } } else { printf("Proses update gagal, %s sudah memiliki anak pertama!",temp->nama); getch(); } 118

break; } case 5: { if(temp->anak2==NULL) { //proses cari nama do { system("cls"); view_nama(*top); printf("Masukkan nama anak pertama dari %s : ",temp->nama); fflush(stdin);

scanf("%[^\n]",nama1); system("cls"); temp1=*top; flag=0; while(temp1!=NULL) {

if(strcasecmp(temp1->nama,nama1)==0) 119

{ flag=1; break; } temp1=temp1>next; } if(flag==0) { printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); //tampilkan nama yang ada di linked list } else if(temp1==temp) { printf("Error, Nama ayah/ibu dan anak pertama sama!"); flag=0; getch(); } }while(flag==0); 120

if(cek_hubungan_darah(&temp,&temp1)==1) { system("cls"); printf("Proses update error, ada hubungan/relasi terlarang!"); getch(); return; }

if(temp->jk=='L') { if(temp1>ayah==NULL) { //kalo orang tuanya laki2 temp>anak2=temp1; temp1>ayah=temp; if(temp>pasangan!=NULL) {

121

temp>pasangan->anak2=temp1; temp1>ibu=temp->pasangan; } printf("Proses update sukses"); getch(); return; } else { printf("Proses update gagal. %s sudah memiliki ayah!",temp1->nama); getch(); } } else { if(temp1>ibu==NULL) { //kalo orang tuanya perempuan 122

temp>anak2=temp1; temp1>ibu=temp; if(temp>pasangan!=NULL) { temp>pasangan->anak2=temp1; temp1>ayah=temp->pasangan; } printf("Proses update sukses"); getch(); return; } else { printf("Proses update gagal, %s sudah memiliki ibu!",temp1->nama); getch(); } }

123

} else { printf("Proses update gagal, %s sudah memiliki anak pertama!",temp->nama); getch(); } break; } case 6: { break; } default: { printf("Pilihan salah !"); getch(); break; } }

}while(pilih!=6);

124

break; } case 3: { break; } default: { printf("Pilihan salah\n\n"); getch(); break; } } }while(pilih!=3); }

void view(struct tnode *top) { struct tnode *temp; int pilih,flag; 125

char nama[50]; if(top==NULL) { system("cls"); printf("Proses View gagal, silsilah keluarga masih kosong\n\n"); getch(); return; } do { system("cls"); printf("Proses View \n"); printf("1. Trace mode \n"); printf("2. View All\n"); printf("3. Back to Menu\n"); printf("Masukkan pilihan : "); fflush(stdin); scanf("%d",&pilih); switch(pilih) { case 1:

126

{ do { system("cls"); view_nama(top); printf("Masukkan nama yang akan ditrace : "); fflush(stdin); scanf("%[^\n]",nama); temp=top; flag=0; while(temp!=NULL) { if(strcasecmp(temp>nama,nama)==0) { flag=1; break; } temp=temp->next; } if(flag==0) { 127

printf("Nama yang dicari tidak ada dalam silsilah keluarga!!!\n\n"); getch(); //tampilkan nama yang ada di linked list } }while(flag==0); system("cls"); printf("Hasil trace dari %s\n\n",temp>nama); printf("Nama %s\n",temp->nama); printf("Jenis Kelamin %c\n",temp->jk); printf("Nama ayah if(temp->ayah!=NULL) { printf("%s",temp->ayah->nama); } printf("\n"); printf("Nama ibu if(temp->ibu!=NULL) { printf("%s",temp->ibu->nama); 128 : "); : "); : :

} printf("\n"); printf("Nama pasangan if(temp->pasangan!=NULL) { printf("%s",temp->pasangan->nama); } printf("\n"); printf("Nama anak pertama if(temp->anak1!=NULL) { printf("%s",temp->anak1->nama); } printf("\n"); printf("Nama anak kedua if(temp->anak2!=NULL) { printf("%s",temp->anak2->nama); } printf("\n\n"); getch(); break; 129 : "); : "); : ");

} case 2: { temp=top; system("cls"); printf("Silsilah keluarga\n\n"); while(temp!=NULL) { printf("Nama %s\n",temp->nama); printf("Jenis Kelamin %c\n",temp->jk); printf("Nama ayah if(temp->ayah!=NULL) { printf("%s",temp->ayah->nama); } printf("\n"); printf("Nama ibu if(temp->ibu!=NULL) { printf("%s",temp->ibu->nama); } 130 : "); : "); : :

printf("\n"); printf("Nama pasangan if(temp->pasangan!=NULL) { printf("%s",temp->pasangan>nama); } printf("\n"); printf("Nama anak pertama if(temp->anak1!=NULL) { printf("%s",temp->anak1->nama); } printf("\n"); printf("Nama anak kedua if(temp->anak2!=NULL) { printf("%s",temp->anak2->nama); } printf("\n\n"); temp=temp->next; } : "); : "); : ");

131

getch(); break; } case 3: { break; } default: { printf("Pilihan salah \n\n"); getch(); break; } }

}while(pilih !=3);

}

void view_nama(struct tnode *top) {

132

printf("Nama yang ada pada silsilah keluarga dan jenis kelamin\n\n"); while(top!=NULL) { printf("Nama printf("Jenis Kelamin top=top->next; } } : %s \n",top->nama); : %c \n\n",top->jk);

void dump(struct tnode *top) { FILE *PF; struct tnode *temp; char namafile[50]; system("cls"); if(top==NULL) { printf("Proses dump gagal, data masih kosong!\n\n"); getch(); return; } 133

temp=top; printf("Masukkan nama file hasil export : "); fflush(stdin); scanf("%[^\n]",namafile); PF=fopen(namafile,"w"); while(temp!=NULL) { fprintf(PF,"Nama >nama); fprintf(PF,"Jenis Kelamin >jk); fprintf(PF,"Nama ayah if(temp->ayah!=NULL) { fprintf(PF,"%s",temp->ayah->nama); } fprintf(PF,"\n"); fprintf(PF,"Nama ibu if(temp->ibu!=NULL) { fprintf(PF,"%s",temp->ibu->nama); } fprintf(PF,"\n"); 134 : "); : "); : %c\n",temp: %s\n",temp-

fprintf(PF,"Nama pasangan if(temp->pasangan!=NULL) {

: ");

fprintf(PF,"%s",temp->pasangan->nama); } fprintf(PF,"\n"); fprintf(PF,"Nama anak pertama if(temp->anak1!=NULL) { fprintf(PF,"%s",temp->anak1->nama); } fprintf(PF,"\n"); fprintf(PF,"Nama anak kedua if(temp->anak2!=NULL) { fprintf(PF,"%s",temp->anak2->nama); } fprintf(PF,"\n\n"); : "); : ");

temp=temp->next; } fclose(PF); 135

system("cls"); printf("Proses dump berhasil!"); getch(); }

void rekursif_cek(struct tnode *temp, struct tnode *temp1, struct t_node **head,struct t_node **tail, int *flag) { struct t_node *help; if(temp==NULL) { return; } if(temp==temp1) { *flag=1; return; } help=*head; while(help!=NULL) { if(help->node==temp) 136

{ return; } help=help->next; } push(head,tail,&temp); rekursif_cek(temp->ayah,temp1,head,tail,flag); rekursif_cek(temp->ibu,temp1,head,tail,flag); rekursif_cek(temp->pasangan,temp1,head,tail,flag); rekursif_cek(temp->anak1,temp1,head,tail,flag); rekursif_cek(temp->anak2,temp1,head,tail,flag); pop(head,tail); }

int cek_hubungan_darah(struct tnode **temp,struct tnode **temp1) { struct t_node *head,*tail; int flag; flag=0; inisialisasi(&head,&tail); rekursif_cek(*temp,*temp1,&head,&tail,&flag);

137

return flag; }

void inisialisasi(struct t_node **head,struct t_node **tail) { *head=NULL; *tail=NULL; }

void push(struct t_node **head,struct t_node **tail, struct tnode **temp) { struct t_node *baru; baru=(struct t_node *)malloc(sizeof(struct t_node)); baru->node=*temp; baru->next=NULL; if(*head==NULL) { *head=baru; *tail=baru; } 138

else { (*tail)->next=baru; *tail=baru; } }

void pop(struct t_node **head,struct t_node **tail) { struct t_node *temp; temp=*head; if((*head==*tail)&&(*head!=NULL)) { free(*head); *head=NULL; *tail=NULL; return; } while(temp->next!=*tail) { temp=temp->next; } 139

free(*tail); *tail=temp; (*tail)->next=NULL; }

void keren() { char a[]={"\tFamily Tree Program by Kelompok III \n"}; int i; double j; for(i=0;a[i]!='\0';i++){ printf("%c",a[i]); for(j=0;j