#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
struct dclinklist{
struct dclinklist *prev; /** Stores address of previous node **/
int roll_no; /** stores roll number **/
char name[N]; /** stores Name **/
float marks; /** stores Marks **/
struct dclinklist *next; /** stores address of next node **/
};
/** Redefining dclinklist as node **/
typedef struct dclinklist node;
void init(node*); /** Input function **/
void ins_aft(node*); /** Function inserting before **/
node* ins_bef(node*); /** Function inserting after **/
node* del(node*); /** Function deleting a node **/
void search(node*); /** Function for searching node **/
void disp(node*); /** Function for displaying node **/
void rollsrch(node*); /** Function for searching node by roll number **/
void namesrch(node*); /** Function for searching node by name **/
void marksrch(node*); /** Function for searching node by marks **/
/*** Main Function ***/
void main(){
node *head;
char ch; /* Choice inputing varible */
int opt; /* Option inputing variable*/
static int flag=0; /* Unchanged after iniialization */
clrscr();
head=(node*)malloc(sizeof(node));
head->next=NULL; /* NULL is being over written in init function */
head->prev=NULL;
do{
again:
printf("\nInput pilihan\n");
printf("\n1. Inisialisasi node\n");
printf("\n2. Insert sebelum spesifik node\n");
printf("\n3. Insert setelah spesifik node\n");
printf("\n4. Delete node \n");
printf("\n5. Search Node\n");
printf("\n6. Display Semua node\n");
scanf("%d",&opt);
if(flag==0 && opt!=1){
printf("\nHarus Inisialisasi Node terlebih dahulu sebelum input!\n");
goto again;
}
if(flag==1 && opt==1){
printf("\nInisialiasi cuma bisa dilakukan sekali!\n");
printf("\nInput sebuah node sekarang\n");
goto again;
}
if(opt==4 && head->next==head){
printf("\nProses penghapusan tidak boleh dilakukan, jika node hanya terdiri dari 1!\n");
goto again;
}
if(flag==0 && opt==1)
flag=1;
switch(opt){
case 1:
init(head);
break;
case 2:
head=ins_bef(head);
break;
case 3:
ins_aft(head);
break;
case 4:
head=del(head);
break;
case 5:
search(head);
break;
case 6:
disp(head);
break;
default:
break;
}
printf("\nMasih mau melanjutkan proses![y/n]\n");
ch=(char)getche();
}while(ch=='Y' || ch=='y');
printf("\nDone by \"LAB TI Univ-Gunadarma J1\"\n");
printf("\nPress any key to exit\n");
getch();
}
/*** Function for inputing data ***/
void init(node *start){
start->prev=start;
printf("\nMasukkan Roll number\n");
scanf("%d",&start->roll_no);
printf("\nMasukkan nama\n");
fflush(stdin);
gets(start->name);
printf("\nMasukkan Tanda\n");
scanf("%f",&start->marks);
start->next=start;
}
/*** Function for inserting a node after a specified node ***/
void ins_aft(node *start){
int rno; /* Roll number for inserting a node */
int flag=0;
node *newnode; /* New inputed node*/
node *current; /* Node for travelling the linked list*/
newnode=(node*)malloc(sizeof(node));
printf("\nMasukkan setelah Roll Number berapa kamu mau menyisipkan!\n");
scanf("%d",&rno);
init(newnode);
current=start;
while(current->next!=start){
/*** Insertion checking for all nodes except last ***/
if(current->roll_no==rno){
newnode->next=current->next;
current->next->prev=newnode;
current->next=newnode;
newnode->prev=current;
flag=1;
}
current=current->next;
}
if(flag==0 && current->next==start && current->roll_no==rno){
/*** Insertion checking for last node ***/
newnode->next=current->next; /* Start is being copied */
current->next->prev=newnode;
current->next=newnode;
newnode->prev=current;
flag=1;
}
if(flag==0 && current->next==NULL)
printf("\nNo match found\n");
}
/*** Function for inserting a node before a specified node ***/
node* ins_bef(node *start){
int rno; /* Roll number for inserting a node*/
node *newnode; /* New inputed node */
node *current; /* Node for travelling the linked list*/
newnode=(node*)malloc(sizeof(node));
printf("\nMasukkan sebelum Roll Number berapa kamu mau menyisipkan!\n");
scanf("%d",&rno);
init(newnode);
current=start;
if(current->roll_no==rno){
/*** Insertion checking for first node ***/
newnode->next=current;
current->prev=newnode;
while(current->next!=start)
current=current->next;
newnode->prev=current;
current->next=newnode;
start=newnode;
return(start);
}
while(current->next!=start){
/*** Insertion checking for all node except first ***/
if(current->next->roll_no==rno){
newnode->next=current->next;
current->next->prev=newnode;
current->next=newnode;
newnode->prev=current;
return(start);
}
current=current->next;
}
/*If the function does not return from any return statement.There is no match to insert before the input roll number. */
printf("\nMatch not found\n");
return(start);
}
/*** Function for deleting ***/
node* del(node *start){
int rno; /* Roll number for deleting a node*/
node *delnode; /* Node to be deleted */
node *current; /* Node for travelling the linked list*/
printf("\nEnter the roll number whose node you want to delete\n");
scanf("%d",&rno);
current=start;
if(current->roll_no==rno) {
/*** Checking condition for deletion of first node ***/
delnode=current; /* Unnecessary step */
while(current->next!=start)
current=current->next;
current->next=start->next;
start->next->prev=current;
start=start->next;
free(delnode);
return(start);
}
else{
while(current->next->next!=start){
/*** Checking condition for deletion of ***/
/*** all nodes except first and last node ***/
if(current->next->roll_no==rno){
delnode=current->next;
current->next=current->next->next;
current->next->prev=current;
free(delnode);
return(start);
}
current=current->next;
}
if(current->next->next==start && current->next->roll_no==rno){
/*** Checking condition for deletion of last node ***/
delnode=current->next;
free(delnode);
current->next=start;
return(start);
}}
printf("\nMatch not found\n");
return(start);
}
/*** Function for searching ***/
void search(node *start){
int ch; /* Choice inputing variable */
printf("\nPencarian Berdasarkan kriteria\n");
printf("\n1. Roll number\n");
printf("\n2. Nama\n");
printf("\n3. Tanda\n");
scanf("%d",&ch);
switch(ch){
case 1:
rollsrch(start);
break;
case 2:
namesrch(start);
break;
case 3:
marksrch(start);
break;
default:
rollsrch(start);
}}
/*** Function for searching ***/
void rollsrch(node *start){
int rno; /* Roll-number to be searched */
node *current; /* Node for travelling the linked list*/
printf("\nMasukkan Roll Number berapa yang mau dicari!\n");
scanf("%d",&rno);
current=start;
while(current->next!=start){
if(current->roll_no==rno)
printf("\n%d\t%s\t%f\n",current->roll_no,current->name,current->marks);
current=current->next;
}
if(current->next==start && current->roll_no==rno)
printf("\n%d\t%s\t%f\n",current->roll_no,current->name,current->marks);
}
/*** Function for searching ***/
void namesrch(node *start){
char arr[20]; /* Name to be searched*/
node *current; /* Node for travelling the linked list*/
printf("\nInput nama yang mau di cari!\n");
fflush(stdin);
gets(arr);
current=start;
while(current->next!=start){
if(strcmp(current->name,arr)==NULL)
printf("\n%d\t%s\t%f\n",current->roll_no,current->name,current->marks);
current=current->next;
}
if(current->next==start && strcmp(current->name,arr)==NULL)
printf("\n%d\t%s\t%f\n",current->roll_no,current->name,current->marks);
}
/*** Function for searching ***/
void marksrch(node *start){
float marks; /* Marks to be searched */
node *current; /* Node for travelling the linked list*/
printf("\nInput tanda yang mau dicari!\n");
scanf("%f",&marks);
current=start;
while(current->next!=start){
if(current->marks==marks)
printf("\n%d\t%s\t%f\n",current->roll_no,current->name,current->marks);
current=current->next;
}
if(current->next==start && current->marks==marks)
printf("\n%d\t%s\t%f\n",current->roll_no,current->name,current->marks);
}
/*** Function for displaying the linked list ***/
void disp(node *start){
node *current; /* Node for travelling the linked list*/
current=start;
while(current->next!=start) {
printf("\n %d %s %f",current->roll_no,current->name,current->marks);
current=current->next;
}
printf("\n %d %s %f",current->roll_no,current->name,current->marks);
}
kalo mau lihat output programnya klik disini.
Tidak ada komentar:
Posting Komentar