Daftar Tertaut di C: Bagaimana Menerapkan Daftar Tertaut di C?



Blognya di Daftar Tertaut di C memperkenalkan Anda ke struktur data Daftar Tertaut di C dan membantu Anda memahami penerapan daftar tertaut secara detail dengan contoh.

Setelah array, struktur data terpopuler kedua adalah Linked List. Daftar tertaut adalah struktur data linier, terbuat dari rangkaian node di mana setiap node berisi nilai dan penunjuk ke node berikutnya dalam rantai tersebut. Dalam artikel ini, mari kita lihat cara menerapkan daftar tertaut di C.

Apa itu Daftar Tertaut di C?

Daftar Tertaut adalah struktur data linier. Setiap daftar tertaut memiliki dua bagian, bagian data dan bagian alamat yang menampung alamat dari elemen berikutnya dalam daftar, yang disebut simpul.





Ukuran daftar tertaut tidak tetap, dan item data dapat ditambahkan di lokasi mana pun dalam daftar. Kerugiannya adalah untuk mendapatkan sebuah node, kita harus melintasi semua jalan dari node pertama ke node yang kita butuhkan. Senarai Berantai seperti larik tetapi tidak seperti larik, ia tidak disimpan secara berurutan dalam memori.

Jenis daftar tertaut yang paling populer adalah:



  1. Daftar tautan tunggal
  2. Daftar tautan ganda

Contoh Daftar Tertaut

Format: [data, alamat]

Kepala -> [3,1000] -> [43,1001] -> [21,1002]



Dalam contoh, angka 43 ada di lokasi 1000 dan alamatnya ada di simpul sebelumnya. Ini adalah bagaimana daftar tertaut direpresentasikan.

Fungsi Daftar Tertaut Dasar

Ada beberapa fungsi yang dapat diterapkan pada daftar tertaut di C. Mari kita coba memahaminya dengan bantuan program contoh.Pertama, kami membuat daftar, menampilkannya, menyisipkan di lokasi mana pun, menghapus lokasi. Kode berikut akan menunjukkan kepada Anda bagaimana melakukan operasi pada daftar.

#include #include void create () void display () void insert_begin () void insert_end () void insert_pos () void delete_begin () void delete_end () void delete_pos () struct node {int info struct node * next} struct node * start = NULL int main () {int choice while (1) {printf ('n MENU n') printf ('n 1.Create n') printf ('n 2.Display n') printf ('n 3. Insert at awal n ') printf (' n 4. Masukkan di akhir n ') printf (' n 5. Masukkan pada posisi yang ditentukan n ') printf (' n 6. Hapus dari awal n ') printf (' n 7. Hapus dari akhir n ') printf (' n 8. Hapus dari posisi yang ditentukan n ') printf (' n 9. Keluar n ') printf (' n ----------------- --------------------- n ') printf (' Masukkan pilihan Anda: t ') scanf ('% d ', & pilihan) saklar (pilihan) {case 1 : create () break case 2: display () break case 3: insert_begin () break case 4: insert_end () break case 5: insert_pos () break case 6: delete_begin () break case 7: delete_end () break case 8: delete_pos () break case 9: exit (0) break default: printf ('n Wrong Choice: n') break}} return 0} voi d create () {struct node * temp, * ptr temp = (struct node *) malloc (sizeof (struct node)) if (temp == NULL) {printf ('nOut of Memory Space: n') exit (0) } printf ('nMasukkan nilai data untuk node: t') scanf ('% d', & temp-> info) temp-> next = NULL if (start == NULL) {start = temp} else {ptr = start while (ptr-> next! = NULL) {ptr = ptr-> next} ptr-> next = temp}} void display () {struct node * ptr if (start == NULL) {printf ('nList is empty: n ') kembali} lain {ptr = mulai printf (' n Elemen Daftar adalah: n ') sementara (ptr! = NULL) {printf ('% dt ', ptr-> info) ptr = ptr-> next}}} void insert_begin () {struct node * temp temp = (struct node *) malloc (sizeof (struct node)) if (temp == NULL) {printf ('nOut of Memory Space: n') return} printf ('nMasukkan nilai data untuk node: t ') scanf ('% d ', & temp-> info) temp-> next = NULL if (start == NULL) {start = temp} else {temp-> next = start start = temp }} void insert_end () {struct node * temp, * ptr temp = (struct node *) malloc (sizeof (struct node)) if (temp == NULL) {printf ('nOut of Memory Space: n') return} p rintf ('nMasukkan nilai data untuk node: t') scanf ('% d', & temp-> info) temp-> next = NULL if (start == NULL) {start = temp} else {ptr = start while (ptr-> next! = NULL) {ptr = ptr-> next} ptr-> next = temp}} void insert_pos () {struct node * ptr, * temp int i, pos temp = (struct node *) malloc ( sizeof (struct node)) if (temp == NULL) {printf ('nOut of Memory Space: n') return} printf ('nMasukkan posisi untuk node baru yang akan disisipkan: t') scanf ('% d' , & pos) printf ('nMasukkan nilai data node: t') scanf ('% d', & temp-> info) temp-> next = NULL if (pos == 0) {temp-> next = start start = temp} else {for (i = 0, ptr = startinext if (ptr == NULL) {printf ('nPosition not found: [Handle with care] n') return}} temp-> next = ptr-> next ptr -> next = temp}} kosongkan delete_begin () {struct node * ptr if (ptr == NULL) {printf ('nList is Empty: n') return} lain {ptr = start start = start-> next printf (' nElemen yang dihapus adalah:% dt ', ptr-> info) free (ptr)}} void delete_end () {struct node * temp, * ptr if (start == NULL) {printf (' nList is Empty: ') keluar (0) } else if (start-> next == NULL) {ptr = start start = NULL printf ('nElemen yang dihapus adalah:% dt', ptr-> info) free (ptr)} lain {ptr = start while (ptr- > berikutnya! = NULL) {temp = ptr ptr = ptr-> next} temp-> next = NULL printf ('nElemen yang dihapus adalah:% dt', ptr-> info) gratis (ptr)}} batal delete_pos () {int i, pos struct node * temp, * ptr if (start == NULL) {printf ('nThe List is Empty: n') exit (0)} else {printf ('nMasukkan posisi node yang akan dihapus : t ') scanf ('% d ', & pos) if (pos == 0) {ptr = start = start-> next printf (' nElemen yang dihapus adalah:% dt ', ptr-> info) free (ptr )} else {ptr = start for (i = 0inext if (ptr == NULL) {printf ('nPosition not Found: n') return}} temp-> next = ptr-> next printf ('nElemen yang dihapus adalah: % dt ', ptr-> info) gratis (ptr)}}}

Bagian pertama dari kode ini adalah membuat struktur. Struktur daftar tertaut dibuat sehingga dapat menyimpan data dan alamat sesuai kebutuhan. Hal ini dilakukan untuk memberikan gambaran kepada compiler tentang bagaimana seharusnya node tersebut.

struct node {int info struct node * next}

Dalam strukturnya, kita memiliki variabel data yang disebut info untuk menampung data dan variabel penunjuk untuk menunjuk ke alamat. Ada berbagai operasi yang bisa dilakukan pada daftar tertaut, seperti:

  • membuat()
  • tampilan ()
  • insert_begin ()
  • sisipkan_akhir ()
  • ] sisipkan_pos ()
  • delete_begin ()
  • delete_end ()
  • delete_pos ()

Fungsi-fungsi ini disebut oleh fungsi utama berbasis menu. Pada fungsi utama, kita mengambil masukan dari pengguna berdasarkan operasi apa yang ingin dilakukan pengguna dalam program. Masukan tersebut kemudian dikirim ke sakelar dan berdasarkan masukan pengguna.

Berdasarkan masukan yang diberikan, fungsi tersebut akan dipanggil. Selanjutnya, kami memiliki fungsi berbeda yang perlu diselesaikan. Mari kita lihat masing-masing fungsi ini.

Buat Fungsi

Pertama, ada fungsi create untuk membuat daftar tertaut. Ini adalah cara dasar membuat daftar tertaut. Mari kita lihat kodenya.

void create () {struct node * temp, * ptr printf ('nMasukkan nilai data untuk node: t') scanf ('% d', & temp-> info) temp-> next = NULL if (start == NULL ) {start = temp} else {ptr = start while (ptr-> next! = NULL) {ptr = ptr-> next} ptr-> next = temp}}

Keluaran

Sisipkan - Daftar Tertaut - Edureka

Pertama, dua pointer dibuat dari tipe node, ptr, dan temp . Kami mengambil nilai yang diperlukan untuk ditambahkan dalam daftar tertaut dari pengguna dan menyimpannya di bagian info dari variabel temp dan menetapkan suhu berikutnya yaitu bagian alamat ke null. Ada penunjuk awal yang menahan awal daftar. Kemudian kami memeriksa awal daftar. Jika awal daftar adalah null, maka kita menetapkan temp ke penunjuk awal. Jika tidak, kami melintasi ke titik terakhir di mana data telah ditambahkan.

Untuk ini, kami menetapkan ptr nilai awal dan melintasi sampai ptr-> berikutnya = null . Kami kemudian menetapkan ptr-> selanjutnya alamat temp. Dengan cara yang sama, ada kode yang diberikan untuk menyisipkan di awal, menyisipkan di akhir dan menyisipkan di lokasi yang ditentukan.

Fungsi Tampilan

Ini kode untuk fungsi tampilan.

void display () {struct node * ptr if (start == NULL) {printf ('nList is empty: n') return} else {ptr = start printf ('n Elemen List adalah: n') sedangkan (ptr! = NULL) {printf ('% dt', ptr-> info) ptr = ptr-> next}}}

Keluaran

Dalam fungsi tampilan, pertama-tama kita periksa apakah daftar tersebut kosong dan kembali jika kosong. Di bagian selanjutnya, kami menetapkan nilai awal ke ptr. Kami kemudian menjalankan perulangan hingga ptr bernilai null dan mencetak elemen data untuk setiap node, hingga ptr bernilai null, yang menentukan akhir daftar.

Hapus Fungsi

Berikut cuplikan kode untuk menghapus node dari daftar tertaut.

void delete_pos () {int i, pos struct node * temp, * ptr if (start == NULL) {printf ('nThe List is Empty: n') exit (0)} else {printf ('nMasukkan posisi node yang akan dihapus: t ') scanf ('% d ', & pos) if (pos == 0) {ptr = start start = start-> next printf (' nElemen yang dihapus adalah:% dt ', ptr-> info ) gratis (ptr)} lain {ptr = mulai untuk (i = 0inext if (ptr == NULL) {printf ('nPosition not Found: n') return}} temp-> next = ptr-> next printf ('nThe elemen yang dihapus adalah:% dt ', ptr-> info) free (ptr)}}}

Keluaran

cara membuat file log di java

Dalam proses penghapusan, ini pertama kali memeriksa apakah daftar itu kosong, jika ya ada. Jika tidak kosong, ia meminta pengguna untuk posisi yang akan dihapus. Setelah pengguna memasuki posisi, ia memeriksa apakah itu adalah posisi pertama, jika ya, ia menetapkan ptr untuk memulai dan memindahkan penunjuk awal ke lokasi berikutnya dan menghapus ptr. Jika posisinya tidak nol , lalu menjalankan perulangan for dari 0 hingga pos yang dimasukkan oleh pengguna dan disimpan di file pos variabel. Ada pernyataan if untuk memutuskan apakah posisi yang dimasukkan tidak ada. Jika ptr sama dengan null , maka tidak ada.

Kita tetapkan ptr ke temp di perulangan for, dan ptr kemudian melanjutkan ke bagian berikutnya. Setelah ini saat posisi ditemukan. Kami membuat variabel temp untuk menampung nilai ptr-> selanjutnya sehingga melewatkan ptr. Kemudian ptr dihapus. Demikian pula, ini bisa dilakukan untuk penghapusan elemen pertama dan terakhir.

Daftar Tertaut Ganda

Disebut daftar tertaut ganda karena ada dua petunjuk , satu titik ke simpul berikutnya dan titik lainnya ke simpul sebelumnya. Operasi yang dilakukan pada tautan ganda mirip dengan operasi daftar tertaut tunggal. Ini kode untuk operasi dasar.

#include #include struct Node typedef struct Node * PtrToNode typedef PtrToNode Daftar typedef PtrToNode Posisi struct Node {int e Posisi Posisi sebelumnya berikutnya} kosong Sisipkan (int x, Daftar l, Posisi p) {Posisi TmpCell TmpCell = (struct Node *) malloc (sizeof (struct Node)) if (TmpCell == NULL) printf ('Memory out of spacen') else {TmpCell-> e = x TmpCell-> sebelumnya = p TmpCell-> next = p-> next p-> next = TmpCell}} void Hapus (int x, List l) {Posisi p, p1, p2 p = Temukan (x, l) if (p! = NULL) {p1 = p -> sebelumnya p2 = p -> p1 berikutnya - > next = p -> next if (p2! = NULL) // jika node bukan node terakhir p2 -> sebelumnya = p -> sebelumnya} else printf ('Elemen tidak ada !!! n')} batal Tampilkan (Daftar l) {printf ('Elemen daftar adalah ::') Posisi p = l-> berikutnya sementara (p! = NULL) {printf ('% d ->', p-> e) p = p- > next}} int main () {int x, pos, ch, i List l, l1 l = (struct Node *) malloc (sizeof (struct Node)) l-> Previous = NULL l-> next = NULL List p = l printf ('PELAKSANAAN DAFTAR TERKAIT DUA PUBLIK DARI L IST ADTnn ') melakukan {printf (' nn1. BUAT 2. HAPUS 3. TAMPILAN 4. QUITnnMasukkan pilihan :: ') scanf ('% d ', & ch) switch (ch) {case 1: p = l printf (' Masukkan elemen yang akan disisipkan :: ') scanf ('% d', & x) printf ('Masukkan posisi elemen ::') scanf ('% d', & pos) for (i = 1 iberikutnya} Masukkan (x, l, p) break case 2: p = l printf ('Masukkan elemen yang akan dihapus ::') scanf ('% d', & x) Hapus (x, p) break case 3: Tampilan (l) break}} sementara (ch<4) } 

Keluaran

Jadi, seperti yang Anda lihat, konsep operasinya cukup sederhana. Daftar tertaut ganda memiliki operasi yang sama dengan daftar tertaut tunggal dalam bahasa pemrograman C. Satu-satunya perbedaan adalah bahwa ada variabel alamat lain yang membantu menelusuri daftar dengan lebih baik dalam daftar tertaut ganda.

Saya harap Anda telah memahami cara melakukan operasi dasar pada daftar tertaut tunggal dan ganda di C.

Jika Anda ingin mempelajari Daftar Tertaut di Java, berikut adalah .

Jika Anda menemukan pertanyaan, jangan ragu untuk menanyakan semua pertanyaan Anda di bagian komentar 'Daftar Tertaut di C' dan tim kami akan dengan senang hati menjawabnya.