๐ Daftar Isi
Pada program single linked list kali ini, akan diberikan fungsi tambahan yaitu fungsi untuk menghitung jumlah node dalam sebuah linked list. Fungsi yang digunakan adalah sebagai berikut.
//menghitung jumlah node
ptrnode count(ptrnode head)
{
int count = 0;
struct node *p;
p = head;
while (p != NULL)
{
p = p->next;
count++;
}
printf("Jumlah node adalah : %d\n", count);
}
Source Code
Berikut ini source code lengkapnya
#include <stdio.h>
#include <stdlib.h>
//Deklarasi pointer dengan tipe data struct node
struct node
{
int value;
struct node *next;
};
typedef struct node *ptrnode;
//fungsi untuk membuat simpul baru
ptrnode createNode(int nilai)
{
ptrnode p;
p = (ptrnode)malloc(sizeof(struct node));
p->value = nilai;
p->next = NULL;
return(p);
}
//fungsi untuk menambahkan simpul di paling ujung kiri (paling awal)
ptrnode insert_head(ptrnode head, int nilai)
{
//head = (ptrnode)malloc(sizeof(struct node));
ptrnode new_node = createNode(nilai);
new_node->next = head;
head = new_node;
return(head);
}
//fungsi untuk menambahkan simpul di paling ujung kanan (paling akhir)
ptrnode insert_tail(ptrnode head, int nilai)
{
//iterasi mencari node terakhir
ptrnode tail = head;
while(tail->next != NULL)
tail = tail->next;
//buat simpul baru
ptrnode new_node = createNode(nilai);
tail->next = new_node;
return(head);
}
//fungsi menambahkan simpul setelah simpul tertentu
ptrnode insert_after(ptrnode head, int nilai, int prev_nilai)
{
//mencari simpul sebelumnya, mulai dari simpul pertama
ptrnode cursor = head;
while (cursor->value != prev_nilai)
cursor = cursor->next;
ptrnode new_node = createNode(nilai);
new_node->next = cursor->next;
cursor->next = new_node;
return(head);
}
//fungsi menambahkan simpul sebelum simpul tertentu
ptrnode insert_before(ptrnode head, int nilai, int next_nilai)
{
if (head->value == next_nilai)
head = insert_head(head, nilai);
else
{
ptrnode cursor, prevcursor;
cursor = head;
do
{
prevcursor = cursor;
cursor = cursor->next;
}
while (cursor->value != next_nilai);
ptrnode new_node = createNode(nilai);
new_node->next = cursor;
prevcursor->next = new_node;
}
return(head);
}
//menghapus simpul paling kiri
ptrnode remove_first(ptrnode head)
{
if (head==NULL)
return;
ptrnode first = head;
head = head->next;
first->next = NULL;
free(first);
return(head);
}
//meghapus simpul paling kanan
ptrnode remove_last(ptrnode head)
{
if (head == NULL)
return;
ptrnode tail = head;
ptrnode prevtail = NULL;
while (tail->next != NULL)
{
prevtail = tail;
tail = tail->next;
}
prevtail->next = NULL;
free(tail);
return(head);
}
//menghapus node diantara dua node
ptrnode remove_middle(ptrnode head, int nilai)
{
ptrnode cursor = head;
while (cursor != NULL)
{
if(cursor->next->value == nilai)
break; //keluar dari iterasi
cursor = cursor->next;
}
if (cursor != NULL)
{
ptrnode tmp = cursor->next;
cursor->next = tmp->next;
tmp->next = NULL;
free(tmp);
}
return(head);
}
//menghapus/free linked list
ptrnode dispose(ptrnode head)
{
if(head == NULL)
return;
while(head != NULL)
{
ptrnode tmp = head;
head = head->next;
tmp->next = NULL;
free(tmp);
}
printf("Semua node (simpul) telah dihapus\n");
return(head);
}
//menghitung jumlah node
ptrnode count(ptrnode head)
{
int count = 0;
struct node *p;
p = head;
while (p != NULL)
{
p = p->next;
count++;
}
printf("Jumlah node adalah : %d\n", count);
}
void tampilnilai(ptrnode head)
{
int i=1;
ptrnode n = head;
printf("Daftar Nilai linked list :\n");
while (n != NULL)
{
printf("Node ke %d : %d \n", i, n->value);
n = n->next;
i++;
};
printf("\n");
}
ptrnode insert_ascending(ptrnode head, int nilai)
{
struct node *ptr;
struct node *temp = (struct node *)malloc(sizeof(struct node));
temp->value = nilai;
temp->next = NULL;
if(head == NULL)
{
//akan dijalankan jika linked list kosong
head = temp;
}
else if (temp->value <= head->value)
{
//akan dijalankan jika nilai baru kurang dari head
temp->next = head;
head = temp;
}
else
{
//iterasi setiap elemen di liinked list
//untuk mencari nilai node yang yang nilainya kurang dari nilai
ptr = head;
while(ptr->next != NULL && ptr->next->value < temp->value)
{
ptr = ptr->next;
}
//ptr menjadi node dimana nilainya lebih kecil dari nilai
temp->next = ptr->next;
ptr->next = temp;
}
return(head);
}
//reverse urutan nilai
ptrnode reverse(ptrnode head)
{
struct node *current, *prev, *next;
current = head;
prev = NULL;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
head = prev;
}
main()
{
int pilih, val, val1;
ptrnode head = NULL;
//head = (ptrnode)malloc(sizeof(struct node));
//head->value = 10;
//head->next = NULL;
while(1)
{
printf("===============LINKED LIST===============\n");
printf(" 1. Insert nilai di urutan awal\n");
printf(" 2. Insert nilai urutan belakang\n");
printf(" 3. Insert nilai secara ascending\n");
printf(" 4. Insert nilai setelah nilai tertentu\n");
printf(" 5. Insert nilai sebelum nilai tertentu\n");
printf(" 6. Hapus nilai di urutan awal\n");
printf(" 7. Hapus nilai di urutan akhir\n");
printf(" 8. Hapus nilai tertentu\n");
printf(" 9. Tampil nilai\n");
printf("10. Tampil nilai secara reversed\n");
printf("11. Jumlah Node\n");
printf("12. Free Linked List\n");
printf("13. Keluar\n");
printf("Pilihan Anda = "); scanf("%d", &pilih);
switch (pilih)
{
case 1 :
{
printf("Masukkan nilai = ");scanf("%d", &val);
head = insert_head(head, val);
system("cls");
break;
}
case 2 :
{
printf("Masukkan nilai = ");scanf("%d", &val);
head = insert_tail(head, val);
system("cls");
break;
}
case 3 :
{
printf("Masukkan nilai = ");scanf("%d", &val);
head = insert_ascending(head, val);
system("cls");
break;
}
case 4 :
{
printf("Masukkan nilai = ");scanf("%d", &val);
printf("Ingin memasukkan nilai tersebut setelah = "); scanf("%d", &val1);
head = insert_after(head, val, val1);
system("cls");
break;
}
case 5 :
{
printf("Masukkan nilai = ");scanf("%d", &val);
printf("Ingin memasukkan nilai tersebut sebelum = "); scanf("%d", &val1);
head = insert_before(head, val, val1);
system("cls");
break;
}
case 6 :
{
head = remove_first(head);
system("cls");
break;
}
case 7 :
{
head = remove_last(head);
system("cls");
break;
}
case 8 :
{
printf("Masukkan nilai yang ingin di hapus = ");scanf("%d", &val);
head = remove_middle(head, val);
system("cls");
break;
}
case 9 :
{
system("cls");
tampilnilai(head);
//system("cls");
break;
}
case 10 :
{
system("cls");
head = reverse(head);
break;
}
case 11 :
{
system("cls");
head = count(head);
break;
}
case 12 :
{
system("cls");
head = dispose(head);
exit(1);
}
case 13 :
{
exit(1);
}
default :
{
printf("Pilihan tersebut belum tersedia");
break;
}
}
}
return 0;
}
Output
Diinputkan sebanyak lima buah nilai
Menggunakan menu nomor 11 (fungsi count) diperoleh hasil sebagai berikut
Materi Lengkap
Silakan baca juga beberapa artikel menarik kami tentang Single Linked List, daftar lengkapnya adalah sebagai berikut.