Anda di halaman 1dari 18

Praktikum 09

Linked List (lanj.)


NIM/Nama : 3312001018/Agung Andriansyah
Pengumpulan tugas praktikum:
Simpan laporan praktikum ini dengan nama P09_NIM.docx di folder yang sama dengan
folder tempat kode program. Namai folder dengan P09_NIM, kemudian zip. Upload ke
http://learning-if.polibatam.ac.id.

Setelah mengikuti praktikum ini, mahasiswa diharapkan dapat:


 Menggambarkan konsep linked list pada memory
 Membuat struktur data linked list dalam bahasa C
 Melakukan operasi pada linked list
 Membedakan macam-macam struktur linked list dan operasiny
 Mengaplikasikan linked list pada program

1. Berdasarkan hasil praktikum minggu 8 no. 3, modifikasilah deklarasi struktur linked


list dan fungsi/prosedur untuk dapat menangani linear doubly-linked list. Salin kode
C Anda beserta highlight perbedaan-perbedaannya dengan operasi pada linear singly-
linked list.
typedef struct Node{
struct Node *prev;
int data;
struct Node *next;
}tipe;
typedef struct Node Simpul;

Simpul *P;
Simpul *HEAD;
Simpul *TAIL;

void inisialisasi(){
HEAD == NULL;
}

void buatSimpul(int X)
{
P = (Simpul *) malloc(sizeof(Simpul));
if (P != NULL)
{
P->data = X;
} else
printf("Pembuatan simpul gagal. \n");
}

~1~
void awal()
{
if (HEAD == NULL)
{
HEAD = P;
TAIL = P;
P->next = NULL;
P->prev = NULL;
}
else
printf("Linked List sudah ada");
}

void insertBelakang() {
TAIL
->next = P;
P->prev = TAIL;
TAIL = P; P->next = NULL;
}

void insertDepan()
{
if (HEAD != NULL)
{
P->next = HEAD;
HEAD->prev = P;
HEAD = P;
P->prev = NULL;
}
else
printf("Linked list belum ada");
}

void insertSetelah(int x)
{
Simpul *Q;
Q = HEAD;
do
Q = Q->next;
while (Q->data != x);
P->next = Q->next;
Q->next = P;
P->prev = Q;
}

void insertSebelum(int x)
{
Simpul *Q, *sebelumQ;
if (HEAD->data == x)
insertDepan();

~2~
else
{
Q = HEAD;
do{
sebelumQ = Q;
Q = Q->next;}
while (Q->data != x);
P->next = Q;
sebelumQ->next = P;
P->prev = sebelumQ;
}
}

void deleteDepan()
{
Simpul *Q;
Q = HEAD;
HEAD = Q->next;
free(Q);
HEAD->prev = NULL;
}

void deleteBelakang() {
Simpul *Q;
Q = HEAD;
while(Q->next != TAIL)
Q = Q->next;
free(TAIL);
TAIL = Q;
Q->next = NULL;
TAIL->prev=Q->prev;
}

void deleteSimpul(int x)
{
Simpul *Q, *sebelumQ;
if (HEAD == NULL)
printf("Linked list kosong\n");
else if (HEAD->data == x){
deleteDepan();
} else
{
Q = HEAD;
do {
sebelumQ = Q;
Q = Q->next;
} while (Q->data != x);
sebelumQ->next = Q->next;
Q->prev = sebelumQ;
free(Q);

~3~
}
}
void tampil(){
Simpul *Q, *R;
int pil;
Q=HEAD;
top:
system("cls");
R=HEAD;
printf("DAFTAR LINKED LIST : ");
while (R->next != NULL){
printf("%d, ", R->data);
R = R->next;
};
printf("%d\n", R->data);
printf("Sekarang simpul: ");
printf("%d\n", Q->data);
printf("1.Next\n2.Prev\n3.Menu\nMasukkan Pilihan: ");
scanf("%d", &pil);

switch (pil) {
case 1 :
if (Q->next != NULL){
Q = Q->next;
printf("%d, ", Q->data);
goto top;
break;
}
else
printf("Simpul Tidak ada");
getch();
goto top;
break;
case 2 :
if (Q->prev != NULL){
Q = Q->prev;
printf("%d, ", Q->data);
goto top;
break;
}else
printf("Simpul Tidak ada");
getch();
goto top;
break;
case 3 :
break;
default:
printf("pilihan tidak ada\n");
break;
}

~4~
}

int main(){
int x,y;
int pil;
inisialisasi();

printf("PROGRAM DOUBLY LINKED LIST\n");


printf("++++++++++++++++++++++++++\n");
printf("Masukkan Simpul Awal : \n");
scanf("%d", &x);
buatSimpul(x);
awal();
mulai:
system("cls");
printf("MENU OPERASI DOUBLY LINKED LIST\n");
printf("+++++++++++++++++++++++++++++++\n");
printf("1. Insert Depan\n");
printf("2. Insert Setelah X\n");
printf("3. Insert Sebelum X\n");
printf("4. Insert Belakang\n");
printf("5. Delete Depan\n");
printf("6. Delete Simpul X\n");
printf("7. Delete Belakang\n");
printf("8. Tampil Daftar Linked List\n");
printf("9. Keluar\n");
printf("+++++++++++++++++++++++++++++++\n");
printf("Masukkan Pilihan Anda : ");
scanf("%d", &pil);

switch(pil){
case 1 :
printf("\nMasukkan Simpul Depan: ");
scanf ("%d", &x);
buatSimpul(x);
insertDepan();
goto mulai;
break;
case 2 :
printf("\nMasukkan Simpul Tengah: ");
scanf ("%d", &x);
buatSimpul(x);
printf("\nSetelah Simpul: ");
scanf ("%d", &y);
insertSetelah(y);
goto mulai;
break;
case 3 :
printf("\nMasukkan Simpul Tengah: ");
scanf ("%d", &x);

~5~
buatSimpul(x);
printf("\nSebelum Simpul: ");
scanf ("%d", &y);
insertSebelum(y);
goto mulai;
break;
case 4 :
printf("\nMasukkan Simpul Belakang: ");
scanf ("%d", &x);
buatSimpul(x);
insertBelakang();
goto mulai;
break;
case 5 :
printf("\nHapus Depan\n");
deleteDepan();
goto mulai;
break;
case 6 :
printf("\nHapus Simpul: ");
scanf ("%d", &x);
deleteSimpul(x);
goto mulai;
break;
case 7 :
printf("\nHapus Belakang\n");
deleteBelakang();
goto mulai;
break;
case 8 :
tampil();
goto mulai;
break;
case 9 :
break;
default:
printf("pilihan tidak ada\n");
goto mulai;
}

Buatlah rangkuman mengenai apa saja perbedaan antara program minggu ini dengan
program pada minggu 8.
Pada program minggu 8 hanya menggunakan satu pointer yaitu pointer next,
sedangkan pada minggu ini menggunakan 2 pointer yaitu terdapat pointer prev

~6~
2. Buatlah sebuah program yang meniru cara kerja program pembuat slide. Dengan
mengasumsikan 1 halaman slide adalah 1 simpul doubly-linked list, buatlah deklarasi
struktur simpul linked list yang dapat memuat data 1 halaman slide yang berisi: no,
judul, isi. Salin deklarasi struktur yang Anda buat di sini.
typedef struct Node Simpul;
typedef struct {
int no;
char title[50];
char isi [500];
}slide;
typedef struct Node{
struct Node *prev;
slide data;
struct Node *next;
}Node;

Program dapat menampilkan menu pilihan:


a. Tambah slide: menambah halaman slide dengan mengisikan judul dan isi slide.
Nomor slide dibuat otomatis mengikuti nomor terakhir slide yang telah dibuat.
Nomor pertama adalah nomor 1.
b. Hapus slide: menghapus slide dengan memasukkan nomor slide yang hendak
dihapus. Perlu dibuat prosedur untuk meng-update nomor slide lain setelah slide
tertentu terhapus.
c. Tampil slide: menampilkan slide, halaman per halaman, dengan menekan Enter
atau tombol lain untuk menampilkan slide selanjutnya sampai habis slide yang
ada. (Petunjuk: Anda dapat menggunakan fungsi system(“cls”); untuk
menghapus/membersihkan layar dari tampilan. Jangan lupa include <stdlib.h>)
Salin kode C Anda di sini.
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef struct Node Simpul;


typedef struct {
int no;
char title[50];
char isi [500];
}slide;
typedef struct Node{
struct Node *prev;
slide data;
struct Node *next;
}Node;

Simpul *P;
Simpul *HEAD;
Simpul *TAIL;

void inisialisasi(){
HEAD = NULL;

~7~
}

void buatSimpul(slide x){


P = (Simpul *) malloc(sizeof(Simpul));
if (P!=NULL){
P->data.no = x.no;
strcpy(P->data.title,x.title);
strcpy(P->data.isi,x.isi);
}
else
printf ("Pembuatan Simpul Gagal. \n");
}

void awal(){
if (HEAD == NULL){
HEAD = P;
TAIL = P;
P->next = NULL;
P->prev = NULL;
}
else
printf("Linked List sudah ada. \n");
}

void insertBelakang(){
TAIL->next = P;
P->prev = TAIL;
TAIL = P;
P->next = NULL;
}

void insertDepan (){


if (HEAD != NULL)
{
P->next = HEAD;
HEAD ->prev = P;
HEAD = P;
P->prev = NULL;
}
else
printf("Linked list belum ada. \n");
}

void insertSetelah (slide x){


Simpul *Q;
Q = HEAD;
while (Q->data.no !=x.no){
Q=Q->next;}
P->next = Q->next;
Q->next = P;

~8~
P->prev = Q;
}

insertSebelum (slide x)
{
Simpul *Q, *sebelumQ;
if (HEAD->data.no == x.no)
insertDepan();
else
{
Q=HEAD;
do{
sebelumQ = Q;
Q=Q->next;
}
while (Q->data.no !=x.no);
P->next = Q;
sebelumQ->next = P;
P->prev = sebelumQ;
}
}

void deleteDepan(){
Simpul *Q;
Q=HEAD;
HEAD=Q->next;
free(Q);
HEAD->prev = NULL;
}

void deleteBelakang()
{
Simpul *Q;
Q=HEAD;
while(Q->next != TAIL)
Q=Q->next;
free(TAIL);
TAIL=Q;
Q->next = NULL;
TAIL->prev = Q->prev;
}

void deleteSimpul(slide x)
{
Simpul *Q, *sebelumQ;
if (HEAD == NULL)
printf("Linked list kosong\n");
else if (HEAD->data.no == x.no){
deleteDepan();
} else

~9~
{
Q = HEAD;
do {
sebelumQ = Q;
Q = Q->next;
} while (Q->data.no != x.no);
sebelumQ->next = Q->next;
Q->prev = sebelumQ;
free(Q);
}
}

void tampil(){
Simpul *Q, *R;
int pil;
Q=HEAD;
top:
system("cls");
R=HEAD;

printf("Slide %d\n", Q->data.no);


printf("%s\n", Q->data.title);
printf("%s\n", Q->data.isi);
printf("Next(1), Close(2)\nMasukkan Pilihan Anda (1/2): ");
scanf("%d", &pil);

switch (pil) {
case 1 :
if (Q->next != NULL){
Q = Q->next;
printf("%d\n", Q->data);
goto top;
break;
}
else
printf("Simpul Tidak Ada");
getch();
goto top;
break;
case 2 :
break;
default:
printf("Pilihan Tidak Ada\n");
break;
}
}

int main(){
int pil;
slide x, y;

~ 10 ~
inisialisasi();
x.no = 1;
printf("Program Slide \n");
printf("------------------- \n");
printf("Slide ke-%d \n", x.no);
printf("Masukkan Judul : ");
scanf ("%s", &x.title);
printf("Masukkan Isi Slide : ");
scanf ("%s", &x.isi);
buatSimpul(x);
awal();
mulai:
system("cls");
printf("MENU OPERASI PROGRAM SLIDE\n");
printf("++++++++++++++++++++++++++\n");
printf("1. Tambah Slide\n");
printf("2. Hapus Slide\n");
printf("3. Tampil Slide\n");
printf("4. Keluar\n");
printf("++++++++++++++++++++++++++\n");
printf("Masukkan Pilihan Anda : ");
scanf("%d", &pil);
switch(pil){
case 1 :
printf("\nTambah Slide \n");
x.no++;
printf("Slide ke-%d \n", x.no);
printf("Masukkan Judul : ");
scanf ("%s", &x.title);
printf("Masukkan Isi Slide : ");
scanf ("%s", &x.isi);
buatSimpul(x);
insertBelakang();
goto mulai;
break;
case 2 :
printf("\nHapus Slide\n");
printf("Masukkan Nomor Slide : ");
scanf ("%d", &x.no);
x.no--;
deleteSimpul(x);
goto mulai;
break;
case 3 :
tampil();
goto mulai;
break;
}
}

~ 11 ~
Tampilkan dan jelaskan hasil running program di sini.

Langkah awal kita membuat slide pertama

Setelahnya kita akan masuk ke menu untuk program slide

Selanjutnya kita memilih menu 1 untuk membuat slide berikutnya

Jika kita memilih menu 3 maka akan ditampilkan slidenya

~ 12 ~
Jika kita memilih next maka akan menampilkan slide berikutnya

EKSTRA NILAI
Buat prosedur tampil slide yang dapat menampilkan slide tidak hanya ke arah belakang
(menampilkan slide berikutnya), tetapi juga dapat menampilkan slide sebelumnya dengan
menekan tombol yang berbeda.
Salin kode C Anda di sini.
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef struct Node Simpul;


typedef struct {
int no;
char title[50];
char isi [500];
}slide;
typedef struct Node{
struct Node *prev;
slide data;
struct Node *next;
}Node;

Simpul *P;
Simpul *HEAD;
Simpul *TAIL;

void inisialisasi(){
HEAD = NULL;
}

void buatSimpul(slide x){


P = (Simpul *) malloc(sizeof(Simpul));
if (P!=NULL){
P->data.no = x.no;
strcpy(P->data.title,x.title);
strcpy(P->data.isi,x.isi);
}
else
printf ("Pembuatan Simpul Gagal. \n");
}

~ 13 ~
void awal(){
if (HEAD == NULL){
HEAD = P;
TAIL = P;
P->next = NULL;
P->prev = NULL;
}
else
printf("Linked List sudah ada. \n");
}

void insertBelakang(){
TAIL->next = P;
P->prev = TAIL;
TAIL = P;
P->next = NULL;
}

void insertDepan (){


if (HEAD != NULL)
{
P->next = HEAD;
HEAD ->prev = P;
HEAD = P;
P->prev = NULL;
}
else
printf("Linked list belum ada. \n");
}

void insertSetelah (slide x){


Simpul *Q;
Q = HEAD;
while (Q->data.no !=x.no){
Q=Q->next;}
P->next = Q->next;
Q->next = P;
P->prev = Q;
}

insertSebelum (slide x)
{
Simpul *Q, *sebelumQ;
if (HEAD->data.no == x.no)
insertDepan();
else
{
Q=HEAD;
do{

~ 14 ~
sebelumQ = Q;
Q=Q->next;
}
while (Q->data.no !=x.no);
P->next = Q;
sebelumQ->next = P;
P->prev = sebelumQ;
}
}

void deleteDepan(){
Simpul *Q;
Q=HEAD;
HEAD=Q->next;
free(Q);
HEAD->prev = NULL;
}

void deleteBelakang()
{
Simpul *Q;
Q=HEAD;
while(Q->next != TAIL)
Q=Q->next;
free(TAIL);
TAIL=Q;
Q->next = NULL;
TAIL->prev = Q->prev;
}

void deleteSimpul(slide x)
{
Simpul *Q, *sebelumQ;
if (HEAD == NULL)
printf("Linked list kosong\n");
else if (HEAD->data.title == x.title){
deleteDepan();
} else
{
Q = HEAD;
do {
sebelumQ = Q;
Q = Q->next;
} while (Q->data.title != x.title);
sebelumQ->next = Q->next;
Q->prev = sebelumQ;
free(Q);
}
}

~ 15 ~
void tampil(){
Simpul *Q, *R;
int pil;
Q=HEAD;
top:
system("cls");
R=HEAD;

printf("Slide %d\n", Q->data.no);


printf("%s\n", Q->data.title);
printf("%s\n", Q->data.isi);
printf("Next(1), Previous(2), Close(3)\nMasukkan Pilihan Anda (1/2/3) : ");
scanf("%d", &pil);

switch (pil) {
case 1 :
if (Q->next != NULL){
Q = Q->next;
printf("%d\n", Q->data);
goto top;
break;
}
else
printf("Simpul Tidak Ada");
getch();
goto top;
break;
case 2 :
if (Q->prev != NULL){
Q = Q->prev;
printf("%d\n", Q->data);
goto top;
break;
}else
printf("Simpul Tidak Ada");
getch();
goto top;
break;
case 3 :
break;
default:
printf("Pilihan Tidak Ada\n");
break;
}
}

int main(){
int pil;
slide x, y;
inisialisasi();

~ 16 ~
x.no = 1;
printf("Program Slide \n");
printf("------------------- \n");
printf("Slide ke-%d \n", x.no);
printf("Masukkan Judul : ");
scanf ("%s", &x.title);
printf("Masukkan Isi Slide : ");
scanf ("%s", &x.isi);
buatSimpul(x);
awal();
mulai:
system("cls");
printf("MENU OPERASI PROGRAM SLIDE\n");
printf("++++++++++++++++++++++++++\n");
printf("1. Tambah Slide\n");
printf("2. Hapus Slide\n");
printf("3. Tampil Slide\n");
printf("4. Keluar\n");
printf("++++++++++++++++++++++++++\n");
printf("Masukkan Pilihan Anda : ");
scanf("%d", &pil);
switch(pil){
case 1 :
printf("\nTambah Slide \n");
x.no++;
printf("Slide ke-%d \n", x.no);
printf("Masukkan Judul : ");
scanf ("%s", &x.title);
printf("Masukkan Isi Slide : ");
scanf ("%s", &x.isi);
buatSimpul(x);
insertBelakang();
goto mulai;
break;
case 2 :
printf("\nDelete Simpul\n");
printf("Masukkan Nomor Slide : ");
scanf ("%d", &x.no);
x.no--;
deleteSimpul(x);
goto mulai;
break;
case 3 :
tampil();
goto mulai;
break;
}
}

~ 17 ~
Tampil dan jelaskan hasil running program di sini.

Jika kita memilih next maka akan menampilkan slide selanjutnya, jika kita memilih previous
maka akan menampilkan silde sebelumnya, dan jika kita memilih close maka slide akan
berhenti ditampilkan.

~ 18 ~

Anda mungkin juga menyukai