Soal No. 1 Berikut ini adalah program sirkular linked list terurut, lengkapilah bagian titik-titik dengan jawaban yang anda anggap benar. #include <stdio.h> #include <stdlib.h> // enable malloc() and free() // definisi tipe boolean #include "boolean.h"; #define Nil NULL // definisi Nil /* Deklarasi infotype */ typedef int infotype; /* Stack dengan representasi berkait dengan pointer */ typedef struct SimpulList * alamat; typedef...(c)... SimpulList { /* lengkapi komentar poin (d) dan (e) */ infotype Info; // deklarasi Info sebagai nilai dari sebuah simpul list alamat Next; // deklarasi Next sbg alamat ref slnjt sebuah simpul list Simpul; typedef struct { alamat HEAD; ListSirkuler; /* Selektor */ #define Next(P) (P)->Next #define Info(P) (P)->Info #define First(L) (L).HEAD alamat Alokasi(infotype X) { alamat P = (alamat) malloc(sizeof(simpul)); if (P!= Nil) { Info(P) = X; Next(P) = Nil; return P; void Dealokasi(alamat P) { free(p); void BuatListKosong(ListSirkuler* L) { First(*L) = Nil; // ciri list kosong boolean CekKosong(ListSirkuler L) { return First(L) == Nil; void TambahTerurut(ListSirkuler* L, alamat P) { alamat T = First(*L); // set pointer iterasi awal menunjuk elemen Head /* kasus tambah elemen pada list kosong */ if (CekKosong(*L)) { First(*L) = P; // set simpul yang ditambahkan sebagai elemen head Next(*L) = P; // referensi simpul selanjutnya adalah diri sendiri Halaman 1 / 5
/* kasus tambah elemen tepat sebelum head */ /* nilai elemen P lebih kecil atau sama dengan elemen Head */ else if (Info(P) <= Info(First(*L))) { while (Next(T)!= First(*L)) { T = Next(T); // pointer maju satu node Next(T) = P; // tambah elemen P dalam List Next(P) = First(*L); // set referensi simpul slnjtnya dari simpul P First(*L) = P; // elemen Head sekarang adalah elemen P /* kasus tambah elemen, dimanapun setelah head */ else { while (Next(T)!= First(*L) && Info(Next(T)) < Info(P)) { T = Next(T); // pointer maju satu node Next(P) = Next(T); //set referensi simpul slnjtnya dari simpul P Next(T) = P; // tambah elemen P dalam List int main() { // untuk simulasi input struktur data int urutaninput[5] = {12, 56, 2, 11, 2; int i; alamat P; ListSirkuler L; BuatListKosong(&L); // buat list baru // tambah elemen list sirkuler terurut for (i = 0; i < 5; i++) { P = Alokasi(urutanInput[i]); if (P!= Nil) { TambahTerurut(&L, P); // tambah elemen printf("\nsetelah tambah elemen ke-%d", i+1); PrintInfo(L); return 0; Halaman 2 / 5
Soal No. 2 Lengkapilah kode program berikut agar menjadi program yang diinginkan dengan menerapkan konsep double linked list. Program ini akan menyimpan angka lebih besar dari 0 dalam double linked list, dengan menggunakan skema: - Jika angka > 0 dan angka adalah genap, maka dimasukkan di bagian depan List - Jika angka > 0 dan angka adalah ganjil, maka dimasukkan setelah First dari suatu List - Jika angka = 0, maka ada penghapusan data di bagian depan dari List - Jika angka < 0, maka akan keluar peringatan bahwa Input yang dimasukkan adalah salah #include <stdio.h> #include <stdlib.h> #include "boolean.h" #define Nil NULL typedef int infotype; typedef struct TElmtList *address; typedef struct TElmtList { infotype info; address prev; address next; ElmtList; typedef struct { address first; address last; List; #define Info(P) (P)->info #define Prev(P) (P)->prev #define Next(P) (P)->next #define First(L) (L).first #define Last(L) (L).last void CreateEmpty(List *L) /* Diasumsikan fungsi ini sudah berjalan dan siap digunakan, dengan I.S. Sembarang F.S. Terbentuk List L Kosong dengan First dan Last adalah Nil*/ boolean IsEmpty(List L) /* Diasumsikan fungsi ini sudah berjalan dan siap digunakan, dengan tujuan akan mengirimkan nilai True jika List kosong, dan nilai False jika sebaliknya.*/ void Dealokasi(address P) /* Diasumsikan fungsi ini sudah berjalan dan siap digunakan, dengan tujuan menghapus atau mengembalikan memori yang digunakan sebelumnya untuk menyimpan ElmtList*/ Halaman 3 / 5
address Alokasi(infotype X) { /*I.S. Diberikan nilai X yang akan dimasukkan ke dalam ElmtList F.S. terbentuk ElmtList yang mana nilai X sebagai info-nya dan Nil sebagai next serta prev*/ address NodeBaru; NodeBaru = (ElmtList*) malloc (sizeof(elmtlist)); Info(NodeBaru) = X; Next(NodeBaru) = Nil; Prev(NodeBaru) = Nil; void InsertFirst (List *L, address *P) { /*I.S. List mungkin kosong dan diberikan ElmtList yang siap dimasukkan ke List F.S. ElmtList baru masuk ke dalam list pada posisi depan*/ if (IsEmpty(*L)) { Last(*L) = *P; else { Prev(First(*L)) = *P; Next(*P) = First(*L); First(*L) = *P; void InsertAfterFirst(List *L, address *P) { /* I.S. List mungkin kosong dan diberikan ElmtList yang siap dimasukkan ke List F.S. Jika List kosong maka akan dilakukan operasi InsertFirst sedangkan jika tidak Maka ElmtList baru akan diletakkan pada setelahnya data pertama (first)*/ if (IsEmpty(*L)) { InsertFirst(L,P); else { Next(*P) = Next(First(*L)); Prev(*P) = First(*L); if (Last(*L) == First(*L)) { Last(*L) = *P; else { Prev(Next(First(*L))) = *P; Next(First(*L)) = *P; Halaman 4 / 5
void DeleteFirst(List *L) { /* I.S. List tidak mungkin kosong F.S. Hapus ElmtList pada bagian paling depan/awal, dan lakukan proses ealokasi*/ address Hapus; if (!IsEmpty(*L)) { Hapus = First(*L); if (First(*L) == Last(*L)) { Last(*L) = Nil; else { Prev(Next(First(*L))) = Nil; First(*L) = Next(First(*L)); Next(Hapus) = Nil; Dealokasi(Hapus); void InsertAngka(List *L, infotype X) { /* I.S. List mungkin kosong dan diberikan nilai X yang akan dimasukkan dalam List F.S. ElmtList baru yang berisi nilai X dapat masuk ke List sesuai dengan skema yang telah dijabarkan sebelumnya.*/ address NodeBaru; NodeBaru = Alokasi(X); if (X > 0) { if (X % 2 == 0) { InsertFirst(L, &NodeBaru); else { InsertAfterFirst(L, &NodeBaru); else if (X == 0) { DeleteFirst(L); else { printf("inputan angka yang anda masukkan salah. \n"); Halaman 5 / 5