#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Numbers {
int number;
struct Numbers *next;
} Numbers;
/**
* unshift
* Memasukkan node baru dari depan
*/
void unshift(int value);
/**
* push
* Memasukkan node baru dari belakang
*/
void push(int value);
/**
* before
* Memasukkan node baru sebelum node tertentu
*/
void before(int key,int value);
/**
* before
* Memasukkan node baru sesudah node tertentu
*
*
*/
void after(int key,int value);
void pop();
void shift();
void removeAt(int key);
/**
* HEAD
* Pointer awal untuk semua node
*/
Numbers *HEAD = NULL;
int main() {
push(2);
push(3);
unshift(1);
push(4);
push(7);
after(4, 5);
push(8);
before(7, 6);
push(9);
after(9, 10);
removeAt(5);
pop();
shift();
Numbers *copyHead = HEAD;
while (copyHead != NULL) {
printf("%d\n", copyHead->number);
copyHead = copyHead->next;
}
return 0;
}
void unshift(int value) {
Numbers *newNode = (Numbers*) malloc(sizeof(Numbers));
newNode->number = value;
newNode->next = HEAD;
HEAD = newNode;
}
void push(int value) {
Numbers *newNode = (Numbers*) malloc(sizeof(Numbers));
newNode->number = value;
newNode->next = NULL;
Numbers *currentNode = HEAD;
if (currentNode != NULL) {
// mengiterasi seluruh node hingga bertemu node yang next nya bernilai null
while (currentNode->next != NULL) {
currentNode = currentNode->next;
}
// lalu menambahkannya pada node yang next nya bernilai null
currentNode->next = newNode;
} else {
// jika node masih kosong
HEAD = newNode;
}
}
void before(int key, int value) {
Numbers *newNode = (Numbers*) malloc(sizeof(Numbers));
newNode->number = value;
newNode->next = NULL;
// untuk menampung node yang sekarang diiterasi
Numbers *currentNode = HEAD;
if (currentNode != NULL) {
// untuk menampung node yang terakhir diiterasi
Numbers *lastNode = NULL;
while (currentNode != NULL) {
// jika menemukan key nya...
if (currentNode->number == key) {
// next pada note baru akan berisi alamat node yang sekarang diiterasi
newNode->next = currentNode;
// lalu next pada node yang terakhir diiterasi, diisi dengan node yang baru tadi
lastNode->next = newNode;
// selesai, langsung keluar
return;
}
// jika belum menemukan key nya...
// node yang di terasi sekarang, akan disimpan pada variabel lastNode
lastNode = currentNode;
// lalu node yang akan di terasi, akan disimpan pada variabel currentNode
currentNode = currentNode->next;
}
// jika tidak menemukan key, node baru akan disimpan pada list paling awal
// next pada node baru berisi alamat HEAD
newNode->next = HEAD;
// lalu HEAD akan berisi node baru
HEAD = newNode;
} else {
// jika node masih kosong
HEAD = newNode;
}
}
void after(int key, int value) {
Numbers *newNode = (Numbers*) malloc(sizeof(Numbers));
newNode->number = value;
newNode->next = NULL;
// untuk menampung node yang sekarang diiterasi
Numbers *currentNode = HEAD;
if (currentNode != NULL) {
// menampung node yang akan diiterasi
Numbers *nextNode = currentNode->next;
while (nextNode != NULL) {
// jika menemukan key nya...
if (currentNode->number == key) {
// next pada node yang sekarang diiterasi, diisi dengan node yang baru
currentNode->next = newNode;
// lalu next pada node yang baru, akan diisi dengan node yang akan diterasi
newNode->next = nextNode;
// selesai, langsung keluar
return;
}
// jika belum menemukan key nya...
// next dari node yang di iterasi saat ini akan disimpan pada variabel currentNode
currentNode = currentNode->next;
// currentNode telah berisi node yang akan diiterasi, lalu isi next nya akan disimpan pada variabel nextNode
nextNode = currentNode->next;
// dengan begini, nextNode 1 langkah lebih depan
}
// jika tidak menemukan key nya, node baru akan disimpan pada list paling akhir
currentNode->next = newNode;
} else {
// jika node masih kosong
HEAD = newNode;
}
}
void pop() {
Numbers *currentNode = HEAD;
while (currentNode->next->next != NULL) {
currentNode = currentNode->next;
}
free(currentNode->next);
currentNode->next = NULL;
}
void shift() {
Numbers *currentNode = HEAD;
HEAD = currentNode->next;
free(currentNode);
}
void removeAt(int key) {
Numbers *currentNode = HEAD;
Numbers *lastNode = NULL;
while (currentNode != NULL) {
if (currentNode->number == key) {
if (lastNode != NULL) {
lastNode->next = currentNode->next;
} else {
HEAD = currentNode->next;
}
free(currentNode);
return;
}
lastNode = currentNode;
currentNode = currentNode->next;
}
}
To embed this project on your website, copy the following code and paste it into your website's HTML: