Linked List Circular adalah sebuah linked list yang simpul terakhirnya
(Last Node) menunjuk ke simpul pertama (First Node).
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <conio.h>
typedef int typeint;
typedef struct tNode *address;
typedef struct tNode
{
typeint value;
address Next;
}Node;
typedef struct{
address First;
}List;
void CreateEmpty(List *L)
{
(*L).First=NULL;
}
bool isEmpty(List L)
{
if(L.First==NULL)
return true;
else
return false;
}
bool isOneElement(List L)
{
if(L.First->Next==L.First)
return true;
else
return false;
}
address alokasi(typeint x){
address P=(Node*)malloc(sizeof(Node));
if(P!=NULL){
P->value=x;
P->Next=NULL;
}
return P;
}
void dealokasi(address P){
free(P);
}
address FindLast(List L)
{
address P=L.First;
if(!isEmpty(L)){
while(P->Next!=(L).First){
P=P->Next;
}
}
return P;
}
void InsertFirst(List *L, address P)
{
if(isEmpty(*L)){
(*L).First=P;
P->Next=(*L).First;
}else{
address Last=FindLast(*L);
P->Next=(*L).First;
(*L).First=P;
Last->Next=(*L).First;
}}
void InsertValueFirst(List *L, typeint x)
{
address P=alokasi(x);
InsertFirst(L,P);
printf("Berhasil memasukkan data!");
}
void DelFirst(List *L){
if(!isEmpty(*L)){
address P=(*L).First;
address Last=FindLast(*L);
if((*L).First==Last){
(*L).First=NULL;
}else{
(*L).First=(*L).First->Next;
Last->Next=(*L).First;
}
dealokasi(P);
}else{
printf("List Empty!");
}
}
void ShowList(List L){
address P;
P=L.First;
if(!isEmpty(L)){
do{
printf("%d ", P->value);
P=P->Next;
}while(P!=L.First);
}else{
printf("List Empty!");
}
}
void InsertLast(List *L, typeint x)
{
address P;
address Ptr=alokasi(x);
P=(*L).First;
if(!isEmpty(*L)){
address Last=FindLast(*L);
Ptr->Next=Last->Next;
Last->Next=Ptr;
printf("Berhasil memasukkan data!");
}else{
InsertFirst(L, Ptr);
printf("Berhasil memasukkan data!");
}
}
void DelLast(List *L)
{
address P, DelNode;
address Last=FindLast(*L);
P=(*L).First;
if(!isEmpty(*L)){
if((*L).First==Last){
DelFirst(L);
}else{
while(P->Next!=Last){
P=P->Next;
}
P->Next=Last->Next;
dealokasi(Last);
}
}else{
printf("List Empty!");
}
}
void InsertAfter(List *L, typeint a, typeint after){
address P;
address Ptr=alokasi(a);
bool found=false;
P=(*L).First;
if(!isEmpty(*L)){
do{
if(P->value==after){
found=true;
break;
}
P=P->Next;
}while(P!=(*L).First);
if(found){
Ptr->Next=P->Next;
P->Next=Ptr;
printf("Berhasil memasukan data ea");
}else{
printf("Data %d tidak di temukan ea", after);
}
}else{
InsertFirst(L, Ptr);
printf("Berhasil memasukan data ea");
}
}
void DelAfter(List *L, typeint after){
address P,Q;
bool found=false;
P=(*L).First;
if(!isEmpty(*L)){
do{
if(P->value==after){
found = true;
break;
}
P=P->Next;
}while(P!=(*L).First);
if(found){
Q=P->Next;
if(Q!=NULL){
P->Next=Q->Next;
Q->Next=NULL;
free(Q);
printf("Del After Berhasil ea");
}else{
printf("tidak ada data setelah %d",after);
}
}else{
printf("Data %d tidak di temukan",after);
}
}else{
printf("List empty");
}
}
int main(){
List L;
typeint a, after;
CreateEmpty(&L);
do{
system("cls");
puts("Menu");
puts("1. insert first");
puts("2. Delete First");
puts("3. Insert Last");
puts("4. Delete Last");
puts("5. Insert After");
puts("6. Delete After");
puts("7. Show List");
puts("Exc");
puts("Pilihan : ");
switch(getch()){
case '1' : printf("Input Number of Integer : ");scanf("%d",&a);
InsertValueFirst(&L,a);
break;
case '2' : DelFirst(&L);
break;
case '3' : printf("Input Number of Integer : ");scanf("%d",&a);
InsertLast(&L,a);
break;
case '4' : DelLast(&L);
break;
case '5' : if(!isEmpty(L)){
printf("input Number of Integer : ");scanf("%d",&a);
printf("Insert setelah angka : ");scanf("%d",&after);
InsertAfter(&L,a,after);
}break;
case '6' : if(!isEmpty(L)){
printf("Delete setelah angka : ");scanf("%d",&after);
DelAfter(&L,after);
}else{
printf("data kosong");
}break;
case '7' : ShowList(L);
break;
}
}
while(getch()!=27);
getch();
return 0;
}
Next
« Prev Post
« Prev Post
Previous
Next Post »
Next Post »
0 Komentar untuk "Script List Linier atau Lined List Circular"