Selasa, 13 Maret 2012

Coding Linked List - Penghapusan posisi yang di inginkan

#include<stdio.h>
#include<conio.h>

struct node{
char info;
struct node *next;
};

typedef struct node node;

struct linkedList{
node *H,*T;
};
typedef struct linkedList ll;

ll inisialisasi(ll L) {
L.H=NULL;
L.T=NULL;
return L;
}

node* buatNode(char infoBaru){
node *nodeBaru;
//memory allocation
nodeBaru=(node *)malloc(sizeof(node));

nodeBaru->info=infoBaru;
nodeBaru->next=NULL;
return nodeBaru;
}

ll sisipDepan(ll L, char infoBaru) {
node *nodeBaru;

//panggil fungsi malloc
nodeBaru=buatNode(infoBaru);

//kasus 1 LL masih kosong
if(L.H==NULL){
L.H=nodeBaru;
L.T=L.H;
}

//kasus 2 LL sudah ada isinya
else{
nodeBaru->next=L.H;
L.H=nodeBaru;
}
return L;
}

ll sisipBelakang(ll L, char infoBaru) {
node *nodeBaru;

//panggil fungsi malloc
nodeBaru=buatNode(infoBaru);

//kasus 1 LL masih kosong
if(L.H==NULL){
L.H=nodeBaru;
L.T=L.H;
}

//kasus 2 LL sudah ada isinya
else{
L.T->next=nodeBaru;
L.T=nodeBaru;
}
return L;
}

ll sisipUrut(ll L, char infoBaru)
{
node *nodeBaru, *p1, *p2;

if(L.H==NULL || infoBaru<=L.H->info)
L=sisipDepan(L, infoBaru);
else if(infoBaru>=L.T->info)
L=sisipBelakang(L, infoBaru);
else
{
nodeBaru=buatNode(infoBaru);
p1=p2=L.H;

while(infoBaru > p1->info)
{
p2=p1;
p1=p1->next;
}
nodeBaru->next=p1;
p2->next=nodeBaru;
}

return L;
}


ll hapusDepan (ll L){
node *pb;
if (L.H != NULL) {//cek apakah LL tidak kosong
pb=L.H; //tempatkan pb di head
L.H=L.H->next;//pindahkan posisi head
if(L.H ==L.T)
L.T=NULL;
free(pb);
}
return L;
}

ll hapusBelakang(ll L){
node *pb, *pb2;
if(L.H !=NULL){//cek apakah ll ada
if(L.H==L.T) //node cuma satu
L= hapusDepan(L);
else{
pb= pb2=L.H;
while(pb !=L.T){
pb2=pb;
pb=pb->next;
}
L.T=pb2;
L.T->next=NULL;
free(pb);
}
}
return L;
}



ll hapustengah(ll L,int posisi)
{
int banyakdata,poshapus;
node *p1,*p2;
if(L.H==NULL)
{
printf("Linked list kosong\n");
}
else
{
banyakdata=1;
p1=L.H;
while(p1->next!=NULL)
{
p1=p1->next;
banyakdata++;
}
if((posisi<1)||(posisi>banyakdata))
printf("Posisi di luar jangkauan\n");
else
if(posisi==1)// hapus awal
L=hapusDepan(L);
else
if(posisi==banyakdata) // hapus akhir
L=hapusBelakang(L);
else // hapus tengah
{
p1=p2=L.H;
poshapus=1;
while(poshapus<(posisi-1))
{
p1=p1->next;
poshapus++;
}
p2=p1->next;
p1->next=p2->next;
free(p2);
}
}
return L;
}


void cetak(ll L){
node *P;
P=L.H;
while(P!=NULL){
printf("%c, ",P->info);
P=P->next;
}
}

main() {
ll L1;
int n;
L1=inisialisasi(L1);


L1=sisipUrut(L1, 'B');
L1=sisipUrut(L1, 'A');
L1=sisipUrut(L1, 'D');
L1=sisipUrut(L1, 'C');

printf ("Masukkan posisi yang akan dihapus ;");
scanf ("%d",&n);

L1=hapustengah(L1,n);
cetak(L1);
getch();
}

0 komentar:

Posting Komentar