Thursday, April 5, 2012

Program C Linked List Berisi Tipe Data String

Program untuk menyimpan data mahasiswa:

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

// Definisi struct mahasiswa untuk menyimpan data mahasiswa
struct mahasiswa {
char nim[20];
char nama[50];
char alamat[100];
float ipk;
struct mahasiswa *next;
};

typedef struct mahasiswa mahasiswa;
/*===================== DEKLARASI FUNGSI =============================*/

/* =============== Fungsi Helper & Linked List ===================== */

// fungsi untuk mengalokasikan data mahasiswa ke dalam memori dinamis
mahasiswa *alokasiNodeBaru(void);
// fungsi untuk menambah node dalam linked list
void tambahNode(mahasiswa **head, mahasiswa *pPre, mahasiswa *pNew);
// fungsi untuk menghapus node dalam linked list
void hapusNode(mahasiswa **head, mahasiswa *pPre, mahasiswa *pCur);
// fungsi untuk menghapus semua node dalam linked list
void hapusSemuaNode(mahasiswa *head);

/* =============== Fungsi CRUD untuk data mahasiswa =============== */

// fungsi untuk menambah data mahasiswa di awal linked list
void tambahAwal(mahasiswa **head);
// fungsi untuk menambah data mahasiswa di tengah linked list
void tambahTengah(mahasiswa **head);
// fungsi untuk mencetak semua data mahasiswa
void cetakSemuaData(mahasiswa *head);
// fungsi untuk menghapus data mahasiswa
void hapusData(mahasiswa **head);
// fungsi untuk mencari data mahasiswa berdasarkan nim
void searchData(mahasiswa **head);



int main()
{
mahasiswa *head;
char pilih;

head = NULL;
do{
system("cls");
printf ("Masukkan Pilihan\n");
printf ("1. Tambahkan data di awal\n");
printf ("2. Tambah data di tengah list\n");
printf ("3. Hapus data\n");
printf ("4. Cetak isi list\n");
printf ("5. Search data\n");
printf ("Masukkan pilihan (tekan Q untuk keluar) : "); pilih=getche();

if (pilih == '1')tambahAwal(&head);
else if (pilih == '2')tambahTengah(&head);
else if (pilih == '3')hapusData(&head);
else if (pilih == '4')cetakSemuaData(head);
else if (pilih == '5')searchData(&head);

pilih=getch();

}while (pilih != 'q' || pilih !='Q'); hapusSemuaNode(head);
}


/*========================= IMPLEMENTASI FUNGSI ==================== */

// fungsi untuk mengalokasikan data mahasiswa ke dalam memori dinamis
mahasiswa *alokasiNodeBaru(void){
mahasiswa *ptr;
ptr = (mahasiswa *)malloc(sizeof(mahasiswa));
return(ptr);
}


// fungsi untuk menambah node dalam linked list
void tambahNode(mahasiswa **head, mahasiswa *pPre, mahasiswa *pNew){
if (pPre == NULL){
//tambah node di awal atau ke dalam linked list kosong
pNew -> next = *head;
*head = pNew;

} else {
//tambah node di tengah atau akhir linked list
pNew -> next = pPre -> next;
pPre -> next = pNew;
}
}

// fungsi untuk menghapus node dalam linked list
void hapusNode(mahasiswa **head, mahasiswa *pPre, mahasiswa *pCur)
{
// hapus node di awal linked list
if (pPre == NULL) {
*head = pCur -> next;
// hapus node di tengah atau akhir linked list
}else{
pPre -> next = pCur -> next;
}
free(pCur);
}

// fungsi untuk menghapus semua node dalam linked list
void hapusSemuaNode(mahasiswa *head){
mahasiswa *pTemp;
while(head != NULL){
pTemp = head;
head = head->next;
free(pTemp);
}
}

// fungsi untuk mencetak semua data mahasiswa
void cetakSemuaData(mahasiswa *head){
mahasiswa *pWalker;
system("cls");
pWalker = head;
int i = 1;
while (pWalker != NULL){
printf("Data mahasiswa ke- %d \n", i);
printf("NIM : %s \n", pWalker->nim);
printf("Nama : %s \n", pWalker->nama);
printf("Alamat : %s \n", pWalker->alamat);
printf("IPK : %.2f \n\n", pWalker->ipk);
pWalker = pWalker -> next;
i++;
}
printf("----***----");
}

// fungsi untuk menambah data mahasiswa di awal linked list
void tambahAwal(mahasiswa **head){
mahasiswa *pNew = alokasiNodeBaru();

if (pNew != NULL){ fflush(stdin);
printf("Masukkan NIM ? "); scanf("%[^\n]",&pNew->nim); fflush(stdin);
printf("Masukkan Nama ? "); scanf("%[^\n]",&pNew->nama); fflush(stdin);
printf("Masukkan Alamat ? "); scanf("%[^\n]",&pNew->alamat); fflush(stdin);
printf("Masukkan IPK ? "); scanf("%f", &pNew->ipk);fflush(stdin);
pNew->next = NULL;
tambahNode(head, NULL, pNew);
}
else{
printf("Alokasi memori gagal");
}
}

//fungsi untuk menambah data mahasiswa di tengah / akhir list
void tambahTengah(mahasiswa **head){
char carinim[20];
mahasiswa *pSearch, *pTemp;
cetakSemuaData(*head);
printf("\n\nmasukkan nim data sebelum data sisipan: ");scanf("%s",carinim);
pSearch=*head;
while(pSearch!=NULL && strcmp(pSearch->nim,carinim)!=0){
pSearch=pSearch->next;
}

pTemp=alokasiNodeBaru();

if (pSearch == NULL)
{
printf("\nNode tidak ditemukan");
getch();
}
else if (pTemp == NULL)
{
printf ("Alokasi memori gagal");
getch();
}
else{fflush(stdin);
printf("Masukkan NIM ? "); scanf("%[^\n]",&pTemp->nim); fflush(stdin);
printf("Masukkan Nama ? "); scanf("%[^\n]",&pTemp->nama); fflush(stdin);
printf("Masukkan Alamat ? "); scanf("%[^\n]",&pTemp->alamat); fflush(stdin);
printf("Masukkan IPK ? "); scanf("%f", &pTemp->ipk);fflush(stdin);
pTemp->next = NULL;
tambahNode(head,pSearch,pTemp);
}


}

//fungsi untuk mencari data mahasiswa berdasarkan nim
void searchData(mahasiswa **head){
int counter=1;
char nimcari[20];
mahasiswa *pCur;
pCur=*head;
fflush(stdin);
printf("\nmasukkan nim mahasiswa yang ingin dicari: "); scanf("%s",nimcari);
fflush(stdin);
while(pCur!=NULL && strcmp(pCur->nim,nimcari)!=0){
counter++;
pCur=pCur->next;
}

if(pCur==NULL)printf("\ndata tidak ditemukan\n");
else {cetakSemuaData(*head);
printf("\ndata mahasiswa dengan nim %s ada pada node ke-%d\n",nimcari,counter);}

}

//fungsi untuk hapus data mahasiswa
void hapusData(mahasiswa **head){
mahasiswa *pCur, *pPre;
char nim[20];
pPre=NULL;
pCur=*head;
cetakSemuaData(*head);
printf("\nmasukkan nim mahasiswa yang ingin dihapus:");scanf("%s",nim);
while(pCur!=NULL && strcmp(pCur->nim,nim)!=0){
pPre=pCur;
pCur=pCur->next;
}
if(pCur==NULL)printf("\ndata tidak ditemukan\n");
else hapusNode(head,pPre,pCur);

}

0 comments:

Post a Comment