Anda di halaman 1dari 21

Nama : I Wayan Pio Pratama

Nim : 1829101040

Linked List Mahasiswa

Soal 1

Terdapat banyak sekali kemungkinan dalam pembentukan struktur data dari mahasiswa dengan
menggunakan linked list, karenanya dalam hal ini akan ditunjukan salah satunya saja. Hal pertama
yang perlu dilakukan adalah mengenali atribut-atribut yang dimiliki oleh seorang mahasiswa.

1. Nim
2. Nama
3. Fakultas
4. Jurusan
5. Ipk
6. Matakuliah

Masih banyak atribut yang mungkin dimiliki oleh mahasiswa namun untuk menyederhanakan
permasalahan, hanya digunakan enam yang mendasar saja. Data-data tersebut dapat dibentuk
dalam psudocode yang dalam hal ini adalah psudo-C sebagai berikut :

struct siswa {
char *nim;
char *nama;
char *fakultas;
char *jurusan;
float ipk;
struct matkul *mk;
struct matkul *mk_head;
struct siswa *next;
struct siswa *prev;
};
Note : pemilihan tipe data atribute mungkin berbeda-beda namun pada dasarnya tipe data diatas
dapat digunakan dalam banyak kasus, seperti misalnya di beberapa tempat mungkin saja nim
hanya terbentuk dari angka akan tetapi nim sebenarnya bukanlah bilangan, karena kita tidak akan
melakukan operasi matematika terhadapnya

Pada kode diatas juga terlihat bahwa adanya suatu atribut bertipe matkul yang mana matkul juga
merupakan suatu struktur data bentukan yang dibentuk dari beberapa atribut sebagai berikut.

1. ID matakuliah
2. Nama matkuliah
3. Sks
4. Nilai

Sehingga jika dituliskan dalam bentuk kode menjadi seperti dibawah ini.

struct matkul {
char *id_matkul;
char *nama_matkul;
int sks;
char nilai;
struct matkul *next;
};

Atribute next disini juga berfungsi sama seperti pada siswa dimana berfungsi untuk mengikat node
node siswa satu sama lain dalam struktur data linked list.

Keseluruhan kode.

struct matkul {
char *id_matkul;
char *nama_matkul;
int sks;
char nilai;
struct matkul *next;
};

struct siswa {
char *nim;
char *nama;
char *fakultas;
char *jurusan;
float ipk;
struct matkul *mk;
struct matkul *mk_head;
struct siswa *next;
struct siswa *prev;
};

Kemungkinan lain adalah dengan memandang fakultas dan jurusan sebagai tipe data bentukan lain
seperti misalnya.

struct fakultas {
char *id_fakultas;
char *nama_fakultas;
char *alamat;
char *no_telp;
};

struct jurusan {
char *id_jurusan;
char *nama_jurusan;
char *alamat;
char *no_telp;
struct fakultas *fakultas;
struct jurusan *next;
struct jurusan *prev;
};

Kedua struktur memungkinkan digunakan untuk menggantikan tipe data char pada fakultas dan
jurusan dalam struktur siswa yang kita buat sebelumnya. Hal seperti ini mengingatkan kita akan
pemerograman berorientasi objek yang memandang entitas-entitas objek. Kembali karena alasan
kesederhanaan maka kita tetap focus pada struktur yang sebelumnya telah dibuat.

Selanjutnya tinggal membentuk untaian dari struktur data siswa dan matakuliah yang sudah kita
miliki, dalam hal ini juga terdapat banyak sekali kemungkinan seperti munggunakan single linked
list, double linked list, circular linked list, ataupun berbagai kreasi yang mungkin dibentuk
tergantung pada kebutuhan dari sistem yang akan di develop. Sekali lagi dalam jawaban ini hanya
disajikan salah satunya yakni menggunakan double linked list dan single linked list. Berikut
gambaran list yang akan terbentuk.

Jadi setiap siswa saling berkaitan dengan metode double linked list sedangkan masing-masing
siswa juga memiliki matakuliah yang saling berkaitan dengan single linked list.

Note : dalam kasus ini sebenarnya pemilihan jenis list bertipe single linked list sudah cukup
namun dalam jawaban digunakan double linked list guna memberikan mobilitas yang lebih
tinggi dalam kasus yang lebih umum. Selain itu menunjukan bahwa dapat dibentuk berbagai
jenis list untuk menyelesaikan suatu permesalahan.

Adapan psudo-C dapat dibentuk dengan adalah sebagai berikut.

siswa *siswa1=NULL;
siswa *siswaX=NULL;
struct matkul *mkX=NULL;

//siswa 1
siswaX=(struct siswa*)malloc(sizeof(struct siswa));
siswa1=siswaX;
siswaX->prev=NULL;
siswaX->nim="1208605033";
siswaX->nama="I Wayan Pio Pratama";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
siswaX->ipk=hitungIPK(siswaX);
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;

//set matkul untuk siswa 1


mkX->id_matkul="CS01";
mkX->nama_matkul="Introduction of computer science";
mkX->sks=2;
mkX->nilai='A';

mkX->next=(struct matkul*)malloc(sizeof(struct matkul));


mkX=mkX->next;
mkX->id_matkul="CS02";
mkX->nama_matkul="Data structured";
mkX->sks=3;
mkX->nilai='A';
mkX->next=NULL;
siswaX->ipk=hitungIPK(siswaX);

//siswa 2
siswaX->next=(struct siswa*)malloc(sizeof(struct siswa));
siswaX->next->prev=siswaX;
siswaX=siswaX->next;
siswaX->nim="1208605034";
siswaX->nama="Ni Komang Rai Mirayanti";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;

//set matkul untuk siswa 2


mkX->id_matkul="CS01";
mkX->nama_matkul="Introduction of computer science";
mkX->sks=2;
mkX->nilai='A';

mkX->next=(struct matkul*)malloc(sizeof(struct matkul));


mkX=mkX->next;
mkX->id_matkul="CS02";
mkX->nama_matkul="Data structured";
mkX->sks=3;
mkX->nilai='B';
mkX->next=NULL;

siswaX->ipk=hitungIPK(siswaX);
Terdapat fungsi hitung IPK pada kode diatas yang akan ditunjukan pada jawaban soal 2.

Soal 2

IPK seorang mahasiswa dapat dihitung dengan cara mengalikan sks dengan bobot nilai siswa
dibagi jumlah sks yang diambil oleh mahasiswa tersebut.

𝐼𝑃𝐾
𝑏𝑜𝑏𝑜𝑡 𝑛𝑖𝑙𝑎𝑖 𝑚𝑘1 ∗ 𝑠𝑘𝑠 𝑚𝑘1 + 𝑏𝑜𝑏𝑜𝑡 𝑛𝑖𝑙𝑎𝑖 𝑚𝑘2 ∗ 𝑠𝑘𝑠 𝑚𝑘2 + ⋯ + 𝑏𝑜𝑏𝑜𝑡 𝑛𝑖𝑙𝑎𝑖 𝑚𝑘𝑁 ∗ 𝑠𝑘𝑠 𝑚𝑘𝑁
=
𝑠𝑘𝑠 𝑚𝑘1 + 𝑠𝑘𝑠 𝑚𝑘2 + ⋯ + 𝑠𝑘𝑠 𝑚𝑘𝑁

Setelah itu dengan memanfaatkan linked list yang sudah terbentuk pada soal 1 dapat dibuat kode
untuk menghitung ipk dari mahasiswa dengan cara berikut.

//input merupakan siswa yang akan dihitung ipk nya


float hitungIPK(struct siswa *siswaX)
{
int bobot;
float rerata=-1;
float sum=0;
int jumlah_sks=0;

while(siswaX->mk!=NULL)
{
bobot=cariBobot(siswaX->mk->nilai);

sum=sum+siswaX->mk->sks*bobot;
jumlah_sks=jumlah_sks+siswaX->mk->sks;

siswaX->mk=siswaX->mk->next;
}

//pembagi gak boleh nol dong


if(jumlah_sks>0)
{
rerata = (sum/jumlah_sks);
}

//jika return -1 artinya perhitungan invalid karena siswa


tidak memiliki matkul
return rerata;
}

Fungsi diatas menerima parameter berupa data bertipe bentukan siswa, yang mana siswa tersebut
menggenggam untaian dari matakuliah, sks, dan nilai-nilainya, sehingga dapat digunakan dalam
penghitungan ipk.

Dalam kode diatas terdapat fungsi cariBobot yang merupakan pemberian bobot angka kedalam
nilai mahasiswa yang berformat char (‘A’, ‘B’, ‘C’, ‘D’, ‘E’).

1. A = 4
2. B = 3
3. C = 2
4. D = 1
5. E = 0

Adapun fungsi bobot tersebut dapat dituliskan dalam bentuk kode sebagai berikut.

//input yang diterima berupa karakter nilai (‘A’, ‘B’, ‘C’, ‘D’,
‘E’)
int cariBobot(char nilai)
{
int bobot=0;
if(nilai=='A')
{
bobot=4;
}
else if(nilai=='B')
{
bobot=3;
}
else if(nilai=='C')
{
bobot=2;
}
else if(nilai=='D')
{
bobot=1;
}
return bobot;
}

Sedangkan untuk pencarian nilai berdasarkan siswa tertentu dan matakuliah tertentu dapat
diselesaikan sebagai berikut.

Note : dalam kasus ini pencarian mahasiswa tertentu dan matakuliah tertentu dibatasi hanya
dengan nim dan id matakuliah saja.

//siswaX merupakan siswa pertama dalam list, yang pada akhirnya


akan melompat-lompat //sampai penghujung list
char cariNilaiIterative(struct siswa *siswaX,char *nim, char
*id_mk)
{
char nilai='-';

while(siswaX!=NULL && nilai=='-')


{
if(siswaX->nim==nim)
{
siswaX->mk=siswaX->mk_head;
while(siswaX->mk!=NULL && nilai=='-')
{
if(siswaX->mk->id_matkul==id_mk)
{
nilai=siswaX->mk->nilai;
}
siswaX->mk=siswaX->mk->next;
}
}
siswaX=siswaX->next;
}

return nilai;
}

Kode diatas menunjukan bahwa pencarian dilakukan dari head of list (siswa ke 1) sampai
ditemukannya data atau sampai diujung list maka perulangan akan selesai. Jika ternyata data tidak
ditemukan maka akan di return karakter ‘-’. Input parameter yang digunakan adalah siswa pertama
dalam list, nim mahasiswa yang akan dicari, dan id matakuliah yang dicari.

Penalaran Lanjut

Permasalahan pada soal nomor 2 juga dapat diselesaikan dengan cara selain iterative yakni dengan
memanfaatkan fungsi rekursif sebagai berikut.

float hitungIPK(struct siswa *siswaX, float sum, int jumlah_sks)


{
int bobot;

if(siswaX->mk==NULL)
{
if(jumlah_sks>0)
{
sum=sum/jumlah_sks;
}
else
{
sum=-1;
}
return sum;
}
else
{
bobot=cariBobot(siswaX->mk->nilai);
sum=sum+siswaX->mk->sks*bobot;
jumlah_sks=jumlah_sks+siswaX->mk->sks;

siswaX->mk=siswaX->mk->next;
hitungIPK(siswaX, sum, jumlah_sks);
}
}

char cariNilai(struct siswa *siswaX,char *nim, char *id_mk)


{
char nilai;

if(siswaX->nim==nim && siswaX->mk->id_matkul==id_mk)


{
//data ditemukan eureka!!
return siswaX->mk->nilai;
}
else if(siswaX==NULL)
{
//data tidak ditemukan dan kita harus menyerah sampai
disini
return '-';
}
else if(siswaX->mk==NULL)
{
//bukan berarti jika mk tidak ditemukan di seorang
//siswa lantas data tersebut tidak ada
//keep going lah
return '-';
}
else
{
siswaX->mk=siswaX->mk->next;
nilai=cariNilai(siswaX, nim, id_mk);
if(nilai!='-')
{
return nilai;
}
siswaX=siswaX->next;
siswaX->mk=siswaX->mk_head;
nilai=cariNilai(siswaX, nim, id_mk);
}
}

Lampiran

Berikut keseluruhan kode C yang dapat digunakan :

#include <stdio.h>
struct matkul {
char *id_matkul;
char *nama_matkul;
unsigned int sks;
char nilai;
struct matkul *next;
};

struct siswa {
char *nim;
char *nama;
char *fakultas;
char *jurusan;
float ipk;
struct matkul *mk;
struct matkul *mk_head;
struct siswa *next;
struct siswa *prev;
};

int cariBobot(char nilai)


{
int bobot=0;
if(nilai=='A')
{
bobot=4;
}
else if(nilai=='B')
{
bobot=3;
}
else if(nilai=='C')
{
bobot=2;
}
else if(nilai=='D')
{
bobot=1;
}
return bobot;
}

float hitungIPK(struct siswa *siswaX, float sum, int jumlah_sks)


{
int bobot;

if(siswaX->mk==NULL)
{
if(jumlah_sks>0)
{
sum=sum/jumlah_sks;
}
else
{
sum=-1;
}
return sum;
}
else
{
bobot=cariBobot(siswaX->mk->nilai);
sum=sum+siswaX->mk->sks*bobot;
jumlah_sks=jumlah_sks+siswaX->mk->sks;

siswaX->mk=siswaX->mk->next;
hitungIPK(siswaX, sum, jumlah_sks);
}
}

float hitungIPKIterative(struct siswa *siswaX)


{
int bobot;
float rerata=-1;
float sum=0;
int jumlah_sks=0;

while(siswaX->mk!=NULL)
{
bobot=cariBobot(siswaX->mk->nilai);

sum=sum+siswaX->mk->sks*bobot;
jumlah_sks=jumlah_sks+siswaX->mk->sks;

siswaX->mk=siswaX->mk->next;
}

//pembagi gak boleh nol dong


if(jumlah_sks>0)
{
rerata = (sum/jumlah_sks);
}
//jika return -1 artinya perhitungan invalid karena siswa
tidak memiliki matkul
return rerata;
}

char cariNilaiIterative(struct siswa *siswaX,char *nim, char


*id_mk)
{
char nilai='-';

while(siswaX!=NULL && nilai=='-')


{
if(siswaX->nim==nim)
{
siswaX->mk=siswaX->mk_head;
while(siswaX->mk!=NULL && nilai=='-')
{
if(siswaX->mk->id_matkul==id_mk)
{
nilai=siswaX->mk->nilai;
}
siswaX->mk=siswaX->mk->next;
}
}
siswaX=siswaX->next;
}

return nilai;
}
char cariNilai(struct siswa *siswaX,char *nim, char *id_mk)
{
char nilai;

if(siswaX->nim==nim && siswaX->mk->id_matkul==id_mk)


{
//data ditemukan eureka!!
return siswaX->mk->nilai;
}
else if(siswaX==NULL)
{
//data tidak ditemukan dan kita harus menyerah sampai
disini
return '-';
}
else if(siswaX->mk==NULL)
{
//bukan berarti jika mk tidak ditemukan di seorang
//siswa lantas data tersebut tidak ada
//keep going lah
return '-';
}
else
{
siswaX->mk=siswaX->mk->next;
nilai=cariNilai(siswaX, nim, id_mk);
if(nilai!='-')
{
return nilai;
}
siswaX=siswaX->next;
siswaX->mk=siswaX->mk_head;
nilai=cariNilai(siswaX, nim, id_mk);
}
}

int main()
{
struct siswa *siswa1=NULL;
struct siswa *siswaX=NULL;
struct matkul *mkX=NULL;

//siswa 1
siswaX=(struct siswa*)malloc(sizeof(struct siswa));
siswa1=siswaX;
siswaX->prev=NULL;
siswaX->nim="1208605033";
siswaX->nama="I Wayan Pio Pratama";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;

//set matkul untuk siswa 1


mkX->id_matkul="CS01";
mkX->nama_matkul="Introduction of computer science";
mkX->sks=2;
mkX->nilai='A';

mkX->next=(struct matkul*)malloc(sizeof(struct matkul));


mkX=mkX->next;
mkX->id_matkul="CS02";
mkX->nama_matkul="Data structured";
mkX->sks=3;
mkX->nilai='A';
mkX->next=NULL;

siswaX->ipk=hitungIPKIterative(siswaX);

//siswa 2
siswaX->next=(struct siswa*)malloc(sizeof(struct siswa));
siswaX->next->prev=siswaX;
siswaX=siswaX->next;
siswaX->nim="1208605034";
siswaX->nama="Ni Komang Rai Mirayanti";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;

//set matkul untuk siswa 2


mkX->id_matkul="CS01";
mkX->nama_matkul="Introduction of computer science";
mkX->sks=2;
mkX->nilai='A';

mkX->next=(struct matkul*)malloc(sizeof(struct matkul));


mkX=mkX->next;
mkX->id_matkul="CS02";
mkX->nama_matkul="Data structured";
mkX->sks=3;
mkX->nilai='B';
mkX->next=NULL;

siswaX->ipk=hitungIPKIterative(siswaX);

//siswa 3
siswaX->next=(struct siswa*)malloc(sizeof(struct siswa));
siswaX->next->prev=siswaX;
siswaX=siswaX->next;
siswaX->nim="1208605035";
siswaX->nama="Mr. X";
siswaX->fakultas="MIPA";
siswaX->jurusan="Ilmu Komputer";
mkX=(struct matkul*)malloc(sizeof(struct matkul));
siswaX->mk=mkX;
siswaX->mk_head=mkX;
siswaX->next=NULL;

//set matkul untuk siswa 3


mkX->id_matkul="CS01";
mkX->nama_matkul="Introduction of computer science";
mkX->sks=2;
mkX->nilai='B';

mkX->next=(struct matkul*)malloc(sizeof(struct matkul));


mkX=mkX->next;
mkX->id_matkul="CS02";
mkX->nama_matkul="Data structured";
mkX->sks=3;
mkX->nilai='C';
mkX->next=NULL;
siswaX->ipk=hitungIPKIterative(siswaX);

//printf("%.2f",siswa1->next->next->ipk);

printf("IPK Rekursif= %.2f\n",hitungIPK(siswa1, 0, 0));


siswa1->mk=siswa1->mk_head;
printf("Nilai Iterative =
%c\n",cariNilaiIterative(siswa1,"1208605035", "CS01"));
siswa1->mk=siswa1->mk_head;
printf("Nilai Rekursif =
%c\n",cariNilai(siswa1,"1208605035", "CS01"));
siswa1->mk=siswa1->mk_head;
printf("IPK Iterative = %.2f\n",hitungIPKIterative(siswa1));
siswa1->mk=siswa1->mk_head;

free(siswa1);
free(siswaX);
free(mkX);
return 0;
}

Berikut hasil yang diperoleh.

Anda mungkin juga menyukai