Single Link List
#include<stdio.h>
#include<stdlib.h>
struct data{
int angka;
struct data*next;
}*head,*tail;
void pushDepan(int angka){
struct data *newNode=(struct data *) malloc(sizeof(struct data));// pesen tempat memorinya sebesar memori yang dibutuhkan
newNode->angka=angka;//isi datanya
newNode->next=NULL;//NULL kan pointer ke nextnya
if(!head){//jika blom ada data sebelumnya
head=tail=newNode;
}else{//jika sudah ada data sebelumnya
newNode->next=head;
head=newNode;
}
}
void pushBelakang(int angka){
struct data *newNode=(struct data *) malloc(sizeof(struct data));
newNode->angka=angka;
newNode->next=NULL;
if(!head){
head=tail=newNode;
}else{ //beda sama push depan cuma di sini
tail->next=newNode; //arahin pointer next si tail ke data baru
tail=newNode; // pindahin tail nya ke data baru
}
}
void pushTengah(int angka){
struct data *newNode=(struct data *) malloc(sizeof(struct data));
newNode->angka=angka;
newNode->next=NULL;
if(!head){//kalo data pertama
head=tail=newNode;
}else if(newNode->angka<head->angka){//kalo data pertama
newNode->next=head;
head=newNode;
}else if(newNode->angka>=tail->angka){//kalo data terakhir
tail->next=newNode;
tail=newNode;
}else{//kalo data tengah
struct data *curr=head,*prevcurr;
while(curr->angka<=newNode->angka){ // cari posisi prev data dan next data dimana data mau di selipin
//= klo ada = di tail, ga = klo ada = di head doang
prevcurr=curr;
curr=curr->next;
}
prevcurr->next=newNode; //selipin datanya
newNode->next=curr;
}
}
void popDepan(){
struct data *curr=head;
if(curr){//cek dlu ada ga datanya
head=head->next;// geser headnya
free(curr);// bebasin alokasi memorinya biar memori bisa di pakai sama yang lain
}
}
void popBelakang(){
struct data *curr=tail,*prevcurr=head;
if(curr){
if(head==tail){//cek apakah dy data terakhir?
head=tail=NULL;
}else{//kalo bukan data terakhir
while(prevcurr->next!=curr){//cari dulu data sebelumnya
prevcurr=prevcurr->next;
}
tail=prevcurr;//pindahin tail ke data sebelumnya
tail->next=NULL;//ini yang tadi bikin break, jangan lupa ditambahi
//ini biar pointer next data terakhirnya ga nunjuk ke mana mana, makanya harus di NULLin dlu
}
free(curr);
}
}
void popAll(){
struct data *curr=head;
while(curr){//hapus selama masih ada data
popDepan();
curr=head;
}
}
void popSelection(int dataHapus){
struct data *curr=head,*prevcurr;
if(curr){//cek dlu datanya ada apa ngga? kalo ada baru hapus
while(curr->angka!=dataHapus && curr!=tail){//cari dulu data yang mau di hapus
prevcurr=curr;
curr=curr->next;
}
if(curr->angka==dataHapus){// kalo data yang mau dihapusnya ada di list, baru hapus datanya
if(curr==head){// cek dlu apakah data yang mau dihapus posisinya di paling depan?
head=head->next;
}else if(curr==tail){// atau di paling belakang?
tail=prevcurr;
tail->next=NULL;
}else{//atau di tengah2?
prevcurr->next=curr->next;
}
free(curr);
}
}
}
void view(){
struct data *curr=head;
while(curr){
printf("%d ",curr->angka);
curr=curr->next;
}
}
int main(){
pushTengah(5);pushTengah(50);pushTengah(15);
pushTengah(10);pushTengah(100);pushTengah(150);
pushTengah(5);pushTengah(150);pushTengah(50);
popSelection(500);
popSelection(5);
popSelection(150);
popSelection(50);
popSelection(5);
popSelection(150);
popSelection(15);
popSelection(10);
popSelection(100);
popSelection(50);
//popBelakang();
//popAll();
view();
getchar();
return 0;
}