Senarai Terpaut di C: Bagaimana Melaksanakan Daftar Terpaut di C?



blognya mengenai Linked List in C memperkenalkan anda kepada struktur data List Linked di C dan membantu anda memahami pelaksanaan senarai terpaut secara terperinci dengan contoh.

Selepas tatasusunan, struktur data kedua paling popular adalah Senarai Terpaut. Senarai terpaut adalah struktur data linier, terbuat dari rantai nod di mana setiap nod mengandungi nilai dan penunjuk ke simpul seterusnya dalam rantai. Dalam artikel ini, mari kita lihat bagaimana menerapkan senarai terpaut di C.

Apakah Senarai Terpaut di C?

Senarai Terpaut adalah struktur data linear. Setiap senarai yang dipautkan mempunyai dua bahagian, bahagian data dan bahagian alamat yang menyimpan alamat elemen seterusnya dalam senarai, yang disebut simpul.





Ukuran senarai yang dipautkan tidak tetap, dan item data dapat ditambahkan di lokasi mana pun dalam daftar. Kelemahannya ialah untuk sampai ke simpul, kita mesti melintasi jauh dari simpul pertama ke simpul yang kita perlukan. The Linked List adalah seperti array tetapi tidak seperti array, tidak disimpan secara berurutan dalam memori.

Jenis senarai terpaut yang paling popular adalah:



  1. Senarai pautan tunggal
  2. Senarai pautan berganda

Contoh Senarai Terpaut

Format: [data, alamat]

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



Dalam contoh, nombor 43 ada di lokasi 1000 dan alamat ada di simpul sebelumnya. Ini adalah bagaimana senarai terpaut ditunjukkan.

Fungsi Senarai Berkaitan Asas

Terdapat beberapa fungsi yang dapat dilaksanakan pada senarai terpaut di C. Mari cuba memahaminya dengan bantuan program contoh.Pertama, kami membuat senarai, memaparkannya, memasukkan di mana-mana lokasi, menghapus lokasi. Kod berikut akan menunjukkan kepada anda cara melakukan operasi dalam senarai.

#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} nod simpul * mula = NULL int utama () {int pilihan sementara (1) {printf ('n MENU n') printf ('n 1.Create n') printf ('n 2.Display n') printf ('n 3. Masukkan di permulaan n ') printf (' n 4. Masukkan pada akhir n ') printf (' n 5. Masukkan pada kedudukan yang ditentukan n ') printf (' n 6. Padam dari awal n ') printf (' n 7. Hapus dari hujung n ') printf (' n 8. Padam dari kedudukan yang ditentukan n ') printf (' n 9.Exit n ') printf (' n ----------------- --------------------- n ') printf (' Masukkan pilihan anda: t ') scanf ('% d ', & pilihan) suis (pilihan) {kes 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 () case break 7: delete_end () break case 8: delete_pos () break case 9: exit (0) break default: printf ('n Salah Pilihan: n') break}} kembali 0} voi d buat () {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} lain {ptr = start sementara (ptr-> next! = NULL) {ptr = ptr-> next} ptr-> next = temp}} paparan kosong () {struct node * ptr if (start == NULL) {printf ('nList kosong: n ') return} else {ptr = start printf (' nElemen Senarai adalah: n ') sementara (ptr! = NULL) {printf ('% dt ', ptr-> info) ptr = ptr-> seterusnya}}} 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} other {temp-> next = start start = temp }} batal insert_end () {struct node * temp, * ptr temp = (struct node *) malloc (sizeof (struct node)) if (temp == NULL) {printf ('nOut of Memory Space: n') kembali} hlm rintf ('nMasukkan nilai data untuk node: t') scanf ('% d', & temp-> info) temp-> next = NULL if (start == NULL) {start = temp} lain {ptr = mulakan sementara (ptr-> next! = NULL) {ptr = ptr-> next} ptr-> next = temp}} batal insert_pos () {struct node * ptr, * temp int i, pos temp = (struct node *) malloc ( sizeof (nod simpul)) jika (temp == NULL) {printf ('nOut of Memory Space: n') return} printf ('nMasukkan kedudukan untuk simpul baru yang akan dimasukkan: t') scanf ('% d' , & pos) printf ('nMasukkan nilai data node: t') scanf ('% d', & temp-> info) temp-> next = NULL jika (pos == 0) {temp-> seterusnya = mulakan permulaan = temp} lain {untuk (i = 0, ptr = startinext if (ptr == NULL) {printf ('nPosisi tidak dijumpai: [Tangani dengan berhati-hati] n') kembali}} temp-> seterusnya = ptr-> ptr seterusnya -> next = temp}} batal delete_begin () {struct node * ptr if (ptr == NULL) {printf ('nList is Empty: n') return} other {ptr = start start = start-> next printf (' nElemen yang dipadam adalah:% dt ', ptr-> info) percuma (ptr)}} batal delete_end () {struct node * temp, * ptr if (start == NULL) {printf (' nList is Empty: ') keluar (0) } lain jika (start-> next == NULL) {ptr = start start = NULL printf ('nElemen yang dihapus adalah:% dt', ptr-> info) percuma (ptr)} lain {ptr = mulakan sementara (ptr- > seterusnya! = NULL) {temp = ptr ptr = ptr-> next} temp-> next = NULL printf ('nElemen yang dihapus adalah:% dt', ptr-> info) percuma (ptr)}} batal delete_pos () {int i, pos struct node * temp, * ptr if (start == NULL) {printf ('nSenarai Kosong: n') keluar (0)} lain {printf ('nMasukkan kedudukan nod yang akan dihapuskan : t ') scanf ('% d ', & pos) jika (pos == 0) {ptr = start start = start-> next printf (' nElemen yang dihapus adalah:% dt ', ptr-> info) percuma (ptr )} lain {ptr = mulakan untuk (i = 0inext if (ptr == NULL) {printf ('nPosition not Found: n') return}} temp-> next = ptr-> next printf ('nElemen yang dihapuskan adalah: % dt ', ptr-> info) percuma (ptr)}}}

Bahagian pertama kod ini adalah membuat struktur. Struktur senarai terpaut dibuat supaya dapat menyimpan data dan alamat yang kita perlukan. Ini dilakukan untuk memberi idea kepada penyusun mengenai bagaimana simpul seharusnya.

simpul struktur {int info simpul * seterusnya}

Dalam struktur, kami mempunyai pemboleh ubah data yang disebut info untuk menyimpan data dan pemboleh ubah penunjuk untuk menunjuk ke alamat. Terdapat pelbagai operasi yang dapat dilakukan pada senarai terpaut, seperti:

  • buat ()
  • paparan ()
  • masukkan_begin ()
  • masukkan_akhir ()
  • ] masukkan_pos ()
  • delete_begin ()
  • delete_end ()
  • delete_pos ()

Fungsi-fungsi ini dipanggil oleh fungsi utama berdasarkan menu. Dalam fungsi utama, kami mengambil input dari pengguna berdasarkan operasi apa yang ingin dilakukan pengguna dalam program ini. Input kemudian dihantar ke kotak suis dan berdasarkan input pengguna.

Berdasarkan input apa yang disediakan fungsi akan dipanggil. Seterusnya, kita mempunyai fungsi yang berbeza yang perlu diselesaikan. Mari kita lihat setiap fungsi ini.

Buat Fungsi

Pertama, ada fungsi buat untuk membuat senarai terpaut. Ini adalah cara asas senarai terpaut dibuat. Mari kita melihat kodnya.

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} other {ptr = start while (ptr-> next! = NULL) {ptr = ptr-> next} ptr-> seterusnya = temp}}

Pengeluaran

Masukkan - Senarai Terpaut - Edureka

Pertama, dua petunjuk dibuat dari jenisnya nod, ptr, dan temp . Kami mengambil nilai yang perlu ditambahkan dalam daftar terpaut dari pengguna dan menyimpannya di bahagian maklumat pemboleh ubah temp dan menetapkan temp berikutnya yang merupakan bahagian alamat untuk nol. Terdapat penunjuk permulaan yang memegang permulaan senarai. Kemudian kami menyemak permulaan senarai. Sekiranya permulaan senarai adalah nol, maka kita menetapkan temp ke pointer permulaan. Jika tidak, kami melintasi titik terakhir di mana data telah ditambahkan.

Untuk ini, kami memberikan ptr nilai permulaan dan melintasi sampai ptr-> seterusnya = nol . Kami kemudian menetapkan ptr-> seterusnya alamat temp. Dengan cara yang serupa, ada kod yang diberikan untuk memasukkan di awal, memasukkan di akhir dan memasukkan di lokasi yang ditentukan.

Fungsi Paparan

Inilah kod untuk fungsi paparan.

paparan kosong () {struct node * ptr if (start == NULL) {printf ('nList is blank: n') return} other {ptr = start printf ('nElemen Senarai adalah: n') sementara (ptr! = NULL) {printf ('% dt', ptr-> info) ptr = ptr-> seterusnya}}}

Pengeluaran

Dalam fungsi paparan, pertama-tama kita memeriksa apakah senarai itu kosong dan kembali jika kosong. Pada bahagian seterusnya, kami menetapkan nilai permulaan ke ptr. Kami kemudian menjalankan loop sehingga ptr nol dan mencetak elemen data untuk setiap node, hingga ptr null, yang menentukan akhir daftar.

Padam Fungsi

Inilah coretan kod untuk menghapus nod dari senarai yang dipautkan.

batal delete_pos () {int i, pos struct node * temp, * ptr if (start == NULL) {printf ('nSenarai Kosong: n') keluar (0)} lain {printf ('nMasukkan kedudukan node yang akan dihapuskan: t ') scanf ('% d ', & pos) jika (pos == 0) {ptr = start start = start-> next printf (' nElemen yang dihapuskan adalah:% dt ', ptr-> info ) percuma (ptr)} lain {ptr = mulakan untuk (i = 0inext if (ptr == NULL) {printf ('nPosition not Found: n') return}} temp-> next = ptr-> next printf ('nThe elemen yang dipadam adalah:% dt ', ptr-> info) percuma (ptr)}}}

Pengeluaran

Dalam proses penghapusan, ia terlebih dahulu memeriksa sama ada senarai itu kosong, jika ya itu ada. Sekiranya tidak kosong, ia meminta pengguna untuk menghapuskan kedudukan. Setelah pengguna memasuki kedudukan, ia akan memeriksa apakah itu posisi pertama, jika ya, ia memberikannya ptr untuk memulakan dan menggerakkan penunjuk permulaan ke lokasi seterusnya dan menghapus ptr. Sekiranya kedudukan tidak sifar , kemudian menjalankan loop untuk 0 dari 0 hingga ke pos yang dimasukkan oleh pengguna dan disimpan di pos pemboleh ubah. Terdapat pernyataan if untuk memutuskan sama ada kedudukan yang dimasukkan tidak hadir. Sekiranya ptr sama dengan nol , maka ia tidak hadir.

Kami berikan ptr kepada temp dalam gelung untuk, dan ptr kemudian beralih ke bahagian seterusnya. Selepas ini apabila kedudukan dijumpai. Kami membuat pemboleh ubah temp untuk menahan nilai ptr-> seterusnya sehingga melangkau ptr. Kemudian ptr dipadamkan. Begitu juga, ia boleh dilakukan untuk penghapusan elemen pertama dan terakhir.

Senarai Berganda Berganda

Ia disebut senarai berganda kerana ada dua petunjuk , satu titik ke nod seterusnya dan titik lain ke nod sebelumnya. Operasi yang dilakukan dalam dua kaitan adalah serupa dengan senarai yang dihubungkan secara tunggal. Inilah kod untuk operasi asas.

penerangan kerja pembangun data besar
#include #include struct Node typedef struct Node * PtrToNode typedef PtrToNode List typedef PtrToNode Position struct Node {int e Position sebelumnya Position next} void Insert (int x, List l, Position p) {Position TmpCell TmpCell = (struct Node *) malloc (sizeof (struct Node)) jika (TmpCell == NULL) printf ('Memory out of spacen') yang lain {TmpCell-> e = x TmpCell-> sebelumnya = p TmpCell-> seterusnya = p-> seterusnya p-> seterusnya = TmpCell}} batal Padam (int x, Senaraikan l) {Kedudukan p, p1, p2 p = Cari (x, l) jika (p! = NULL) {p1 = p -> p2 sebelumnya = p -> p1 seterusnya - > seterusnya = p -> seterusnya jika (p2! = NULL) // jika simpul bukan nod terakhir p2 -> sebelumnya = p -> sebelumnya} lain printf ('Elemen tidak wujud !!! n')} batal Paparan (Senarai l) {printf ('Elemen senarai adalah ::') Kedudukan p = l-> seterusnya sementara (p! = NULL) {printf ('% d ->', p-> e) p = p- > next}} int utama () {int x, pos, ch, i List l, l1 l = (struct Node *) malloc (sizeof (struct Node)) l-> sebelumnya = NULL l-> seterusnya = Senarai NULL p = l printf ('PELAKSANAAN SENARAI BERGABUNG DOUBLY OF L IST ADTnn ') lakukan {printf (' nn1. CREATEn 2. DELETEn 3. DISPLAYn 4. QUITnn Masukkan pilihan :: ') scanf ('% d ', & ch) switch (ch) {case 1: p = l printf (' Masukkan elemen yang akan dimasukkan :: ') scanf ('% d', & x) printf ('Masukkan kedudukan elemen ::') scanf ('% d', & pos) untuk (i = 1 iseterusnya} Masukkan (x, l, p) pecah kes 2: p = l printf ('Masukkan elemen yang akan dihapus ::') scanf ('% d', & x) Padam (x, p) pecah kes 3: Paparan (l) rehat}} sementara (ch<4) } 

Pengeluaran

Oleh itu, seperti yang anda lihat, konsep operasi cukup mudah. Senarai yang dipaut dua kali mempunyai operasi yang sama dengan senarai yang dipautkan secara tunggal dalam bahasa pengaturcaraan C. Satu-satunya perbezaan ialah terdapat pemboleh ubah alamat lain yang membantu melintasi senarai dengan lebih baik dalam senarai yang berganda.

Saya harap anda telah memahami bagaimana melakukan operasi asas pada senarai yang dihubungkan secara tunggal dan berganda di C.

Sekiranya anda ingin mempelajari Senarai Terpaut di Java, berikut adalah .

Sekiranya anda menjumpai sebarang pertanyaan, jangan ragu untuk mengajukan semua soalan anda di bahagian komen 'Senarai Terpaut di C' dan pasukan kami akan dengan senang hati menjawab.