Modul 6 : Struct - IvanSholana/Algoritma-dan-Struktur-Data GitHub Wiki
Struct merupakan user defined data type sehingga tidak termasuk ke dalam tipe data bawaan (built-in). Struct memungkinkan kita untuk membuat sebuah data yang terdiri dari beberapa data dan tipe data sekaligus sehingga data tersebut menjadi lebih kompleks. Keanggotaan data di dalam struct dapat disebut fields atau atribute yang mana telah dijelaskan sebelumnya dapat memiliki tipe data yang berbeda-beda.
Terdapat beberapa cara untuk mendeklarasikan struct, yaitu:
- Tanpa Typedef
struct Nama_Struct
{
tipe_data nama_atribute/variabel1;
tipe_data nama_atribute/variabel2;
};
// Deklarasi variabel struct
int main(){
struct nama_struct nama_variabel;
}
Contoh :
struct mahasiswa
{
char NamaLengkap[100];
int Umur;
char Gender;
float Nilai;
};
// Deklarasi variabel struct
int main(){
struct mahasiswa mahasiswa1;
}
- Dengan Typedef
Typedef sendiri digunakan untuk membuat alias dari struct yang dibuat. Dengan menggunakan typedef
maka tidak perlu menuliskan struct kembali ketika ingin mendeklarasikan variabel struct.
typedef struct{
tipe_data atribute/variabel1;
tipe_data atribute/variabel2;
}nama_struct;
int main(){
nama_struct nama_variabel;
}
Contoh:
typedef struct
{
char NamaLengkap[100];
int Umur;
char Gender;
float Nilai;
}mahasiswa;
// Deklarasi variabel struct
int main(){
mahasiswa mahasiswa1;
mahasiswa mahasiswa2;
}
Untuk memberikan nilai terhadap atribute struct dapat dilakukan dengan beberapa cara seperti contoh berikut ini:
#include <stdio.h>
#include <string.h>
typedef struct
{
char NamaLengkap[100];
int Umur;
char Gender;
float Nilai;
} mahasiswa;
// Deklarasi variabel struct
int main()
{
mahasiswa mahasiswa1;
mahasiswa mahasiswa2 = {"Himawari Uzumaki", 10, "P", 100}; // Dideklarasikan secara langsung
// Dideklarasikan secara terpisah
strcpy(mahasiswa1.NamaLengkap, "Rudi Tabuti"); // Untuk string dan char memerlukan bantuan strcpy()
mahasiswa1.Umur = 21;
mahasiswa1.Gender = 'P';
mahasiswa1.Nilai = 100;
}
Dalam kode di atas seluruh nilai diberikan secara langsung. Kita juga dapat memberikan nilai dengan menggunakan inputan scanf()
seperti biasanya.
#include <stdio.h>
#include <string.h>
typedef struct
{
char NamaLengkap[100];
int Umur;
char Gender;
float Nilai;
} mahasiswa;
// Deklarasi variabel struct
int main()
{
mahasiswa mahasiswa1;
mahasiswa mahasiswa2 = {"Himawari Uzumaki", 10, "P", 100};
printf("Tuliskan nama anda : ");
scanf("%s", mahasiswa1.NamaLengkap);
printf("Tuliskan umur anda : ");
scanf("%d", &mahasiswa1.Umur);
getchar();
printf("Tuliskan gender anda : ");
scanf("%c", &mahasiswa1.Gender);
printf("Tuliskan nilai anda : ");
scanf("%f", &mahasiswa1.Nilai);
}
Untuk mengakses nilai atribute pada struct maka dapat dilakukan dengan memanggil atribute yang diinginkan pada struct dengan menggunakan tanda (.)
. Adapun contoh dari pemanggilan nilai atribute adalah sebagai berikut:
printf("Nama : %s\n", mahasiswa1.NamaLengkap);
printf("Umur : %d\n", mahasiswa1.Umur);
printf("Gender : %c\n", mahasiswa1.Gender);
printf("Nilai : %.2f\n", mahasiswa1.Nilai);
Pada kode program di atas untuk memanggil nilai atribute cukup gunakan nama_struct.nama_atribute
. Namun, jika variabel struct adalah pointer maka pengaksesannya bukan menggunakan dot/titik tetapi arrow/panah (->).
printf("Nama : %s\n", mahasiswa1->NamaLengkap);
printf("Umur : %d\n", mahasiswa1->Umur);
printf("Gender : %c\n", mahasiswa1->Gender);
printf("Nilai : %.2f\n", mahasiswa1->Nilai)
Selain menggunakannya pada int main, kita juga dapat melakukan pengolahan struct di dalam sebuah fungsi atau prosedur. Adapun untuk melakukan hal tersebut sama dengan melakukannya dengan menggunakan variabel. Adapun dalam mealkukan pass struct juga terdiri dari Pass by Value
dan Pass by Reference
Dengan menggunakan pass by value maka kita perlu mengembalikan nilainya kembali menggunakan return value. Seperti fungsi biasanya, tipe data dari fungsi harus disesuaikan dengan nilai yang direturnkan yaitu struct itu sendiri. Contoh :
#include <stdio.h>
#include <stdlib.h>
struct mahasiswa
{
char NamaLengkap[100];
int Umur;
char Gender;
float Nilai;
};
struct mahasiswa InputData2(struct mahasiswa DataMahasiswa)
{
printf("Input Nama : ");
scanf("%[^\n]", DataMahasiswa.NamaLengkap);
printf("Umur : ");
scanf("%d", &DataMahasiswa.Umur);
getchar();
printf("Gender : ");
scanf("%c", &DataMahasiswa.Gender);
printf("Nilai : ");
scanf("%f", &DataMahasiswa.Nilai);
return DataMahasiswa;
}
int main(){
struct mahasiswa mahasiswa1;
mahasiswa1 = InputData2(mahasiswa1);
}
Jika ingin menggunakan pass by reference maka perlu dikirimkan alamat memori dari struct dan akan ditangkap oleh parameter pointer.
struct mahasiswa
{
char NamaLengkap[100];
int Umur;
char Gender;
float Nilai;
};
void InputData(struct mahasiswa *DataMahasiswa)
{
printf("Input Nama : ");
scanf("%[^\n]", DataMahasiswa->NamaLengkap);
printf("Umur : ");
scanf("%d", &DataMahasiswa->Umur);
getchar();
printf("Gender : ");
scanf("%c", &DataMahasiswa->Gender);
printf("Nilai : ");
scanf("%f", &DataMahasiswa->Nilai);
}
int main(){
struct mahasiswa mahasiswa1 = InputData(&mahasiswa1);
}
Dapat dilihat bahwa pada kode di atas untuk mengakses nilai atrubute dari parameter *DataMahasiswa
yang merupakan pointer menggunakan arrow operator (->)
.
Selain mendeklarasikan sebagai sebuah variabel, kita juga dapat mendekalrasikan array dengan tipe data struct yang kita buat sendiri. Dengan begitu struct tidak hanya dapat menyimpan satu jenis tipe data saja tetapi berbagai jenis tipe data sesuai dengan apa yang kita deklarasikan di dalam struct. Adapun implementasi dari array of struct dapat dilihat pada contoh berikut:
#include <stdio.h>
#include <string.h>
struct mahasiswa
{
char NamaLengkap[50];
int NIM;
};
int main()
{
struct mahasiswa mahasiswa1[3] =
{
{"ivan sholana", 1203210030},
{"Annisa Sri Mulyana", 1203210031}};
strcpy(mahasiswa1[2].NamaLengkap, "Ruri Ambarwati");
mahasiswa1[2].NIM = 1203210032;
for (int a = 0; a < 3; a++)
{
printf("Nama Lengkap \t: %s\n", mahasiswa1[a].NamaLengkap);
printf("NIM \t\t: %d\n\n", mahasiswa1[a].NIM);
}
}
Self referential structure merupakan konsep dimana atribute structure merupakan pointer yang mana atribute pointer ini nantinya akan menunjuk sebuah variabel yang memiliki tipe data struct yang sama. Contoh :
typedef struct LinkedList2 // Jika menggunakan typedef maka perlu dituliskan nama structnya
{
int a;
struct LinkedList2 *next; // variabel pointer dengan tipe data yang sama dengan structnya
} LinkedList2;
int main()
{
LinkedList2 data_3, data_4;
data_3.a = 3;
data_3.next = &data_4; // mereferensikan memori variabel data_4
data_4.a = 4;
data_4.next = &data_3; // mereferensikan memori variabel data_3
printf("data_1 : %d %d\n", data_3.a, data_3.next->a); // mengakses nilai a pada variabel data_4 melalui variabel data_3
printf("data_2 : %d %d\n", data_4.a, data_4.next->a); // mengakses nilai a pada variabel data_3 melalui variabel data_4
}
Pada contoh di atas, pada bagian typedef perlu dituliskan nama dari strucnya karena jika tidak maka atribute di dalam struct yang memiliki tipe data sama dengan struct tersebut akan error, karena nama dari struct belum dikenali. Implementasi dari self referential structure ini adalah linked-list
yang akan dibahas pada materi selanjutnya.