Lingitud loend C-s: kuidas lingitud loendit C-s rakendada?

tema ajaveeb C-s lingitud loendis tutvustab teid lingitud loendi andmestruktuuri C-s ja aitab teil lingitud loendi rakendamist näidete abil üksikasjalikult mõista.

Pärast massiive on populaarsuselt teine ​​andmestruktuur Linked List. Lingitud loend on lineaarne andmestruktuur, mis koosneb sõlmede ahelast, milles iga sõlm sisaldab väärtust ja osuti ahela järgmisele sõlmele. Selles artiklis vaatame, kuidas rakendada lingitud loendit C-s.



Mis on lingitud loend C-s?

Lingitud loend on lineaarne andmestruktuur. Igal lingitud loendil on kaks osa, andmesektsioon ja aadressiosa, mis hoiab loendis järgmise elemendi aadressi, mida nimetatakse sõlmeks.



Lingitud loendi suurus pole fikseeritud ja andmeüksusi saab lisada loendi mis tahes asukohta. Puuduseks on see, et sõlme jõudmiseks peame läbima kogu tee esimesest sõlmest nõutava sõlmeni. Lingitud loend on nagu massiiv, kuid erinevalt massiivist ei salvestata seda järjestikku mällu.

Lingitud loendi kõige populaarsemad tüübid on:



  1. Ainult linkide loend
  2. Kahekordne linkide loend

Lingitud loendi näide

Vorming: [andmed, aadress]

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



Näites on number 43 olemas asukohas 1000 ja aadress on eelmises sõlmes. Nii on lingitud loend esindatud.

Lingitud loendi põhifunktsioonid

C-s olevas lingitud loendis saab rakendada mitmeid funktsioone. Proovime neist aru saada näidisprogrammi abil.Esiteks loome loendi, kuvame selle, sisestame suvalisse kohta, kustutame asukoha. Järgmine kood näitab, kuidas loendis toiminguid teha.

#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.Sisestage algus n ') printf (' n 4.Sisestage n lõppu ') printf (' n 5.Sisestage määratud kohale n ') printf (' n 6.Kustuta n algusest ') printf (' n 7.Kustuta lõpust n ') printf (' n 8. Kustuta määratud kohast n ') printf (' n 9. Exit n ') printf (' n ----------------- --------------------- n ') printf (' Sisestage oma valik: t ') scanf ('% d 'ja valik) lüliti (valik) {juhtum 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 Vale valik: n') break}} return 0} voi d create () {struct node * temp, * ptr temp = (struct node *) malloc (sizeof (struct node)) if (temp == NULL) {printf ('nMäluruumist välja: n') väljumine (0) } printf ('nSisestage sõlme andmeväärtus: t') scanf ('% d', & temp-> info) temp-> next = NULL if (start == NULL) {start = temp} else {ptr = start while (ptr-> järgmine! = NULL) {ptr = ptr-> next} ptr-> next = temp}} tühine kuva () {struct sõlme * ptr if (start == NULL) {printf ('nList on tühi: n ') return} else {ptr = käivita printf (' nLoendi elemendid on: n '), samal ajal kui (ptr! = NULL) {printf ('% dt ', ptr-> info) ptr = ptr-> järgmine}}} void insert_begin () {struct node * temp temp = (struct node *) malloc (sizeof (struct node)) if (temp == NULL) {printf ('nMäluruumist väljas: n') return} printf ('nSisestage sõlme andmeväärtus: 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 ('nMäluruumist väljas: n') return} lk rintf ('nSisestage sõlme andmeväärtus: t') scanf ('% d', & temp-> info) temp-> next = NULL if (start == NULL) {start = temp} else {ptr = start while (ptr-> järgmine! = NULL) {ptr = ptr-> järgmine} ptr-> järgmine = temp}} void insert_pos () {struct node * ptr, * temp int i, pos temp = (struct node *) malloc ( sizeof (struct node)) if (temp == NULL) {printf ('nMäluruumist väljas: n') return} printf ('nSisestage uue sisestatava sõlme asukoht: t') scanf ('% d' , & pos) printf ('nSisestage sõlme andmeväärtus: 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 ('nPositsiooni ei leitud: [käsitsege ettevaatlikult] n') return}} temp-> järgmine = ptr-> järgmine ptr -> next = temp}} void delete_begin () {struct sõlme * ptr if (ptr == NULL) {printf ('nList on tühi: n') return} else {ptr = start start = start-> järgmine printf (' nKustutatud element on:% dt ', ptr-> info) tasuta (ptr)}} void delete_end () {struct sõlm * temp, * ptr if (start == NULL) {printf (' nList on tühi: ') exit (0) } else if (start-> next == NULL) {ptr = start start = NULL printf ('nKustutatud element on:% dt', ptr-> info) tasuta (ptr)} else {ptr = start while (ptr- > järgmine! = NULL) {temp = ptr ptr = ptr-> next} temp-> next = NULL printf ('nKustutatud element on:% dt', ptr-> info) tasuta (ptr)}} void delete_pos () {int i, pos struct node * temp, * ptr if (start == NULL) {printf ('nNimekiri on tühi: n') exit (0)} else {printf ('nSisestage kustutatava sõlme asukoht : t ') scanf ('% d ', & pos) if (pos == 0) {ptr = start start = start-> next printf (' nKustutatud element on:% dt ', ptr-> info) tasuta (ptr )} else {ptr = start for (i = 0inext if (ptr == NULL) {printf ('nPositsiooni ei leitud: n') return}} temp-> next = ptr-> next printf ('nKustutatud element on: % dt ', ptr-> info) tasuta (ptr)}}}

Selle koodi esimene osa on struktuuri loomine. Lingitud loendistruktuur luuakse nii, et see mahutaks andmeid ja aadressi vastavalt meie vajadustele. Seda tehakse selleks, et anda koostajale aimu, kuidas sõlm peaks olema.

hübriidraamistik seleeni veebidraiveris
struct sõlme {int info struct sõlme * järgmine}

Struktuuris on meil andmemuutuja nimega info andmete hoidmiseks ja kursori muutuja aadressile osutamiseks. Lingitud loendis saab teha erinevaid toiminguid, näiteks:

  • loo ()
  • kuva ()
  • insert_begin ()
  • insert_end ()
  • ] insert_pos ()
  • delete_begin ()
  • kustuta_lõpp ()
  • kustuta_positsioon ()

Neid funktsioone kutsub menüüpõhine põhifunktsioon. Põhifunktsioonis võtame kasutajalt sisendi selle põhjal, millist operatsiooni kasutaja programmis teha soovib. Seejärel saadetakse sisend lülituskarbile ja põhineb kasutaja sisendil.

Vastavalt sellele, millist sisendit pakutakse, kutsutakse funktsiooni. Järgmisena on meil erinevad funktsioonid, mis tuleb lahendada. Vaatame kõiki neid funktsioone.

Funktsiooni loomine

Esiteks on lingitud loendi loomiseks funktsioon luua. See on lingitud loendi loomise peamine viis. Vaatame koodi.

void create () {struct sõlm * temp, * ptr printf ('nSisestage sõlme andmeväärtus: 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}}

Väljund

Sisesta - Lingitud loend - Edureka

Esiteks luuakse kaks seda tüüpi osutit sõlm, ptr ja temp . Võtame kasutajalt lingitud loendisse lisamiseks vajaliku väärtuse ja salvestame selle temp muutuja infoossa ja määrame järgmise nimega aadressi temp nulliks. Loendi algust hoiab stardikursor. Seejärel kontrollime loendi algust. Kui loendi algus on null, määrame algkursile temp. Vastasel juhul läbime viimase punkti, kuhu andmed on lisatud.

Selleks määrame ptr algväärtuse ja travers tilli ptr-> järgmine = null . Seejärel määrame ptr-> järgmine temp. aadress Samamoodi on antud kood sisestamiseks alguses, sisestamiseks lõpus ja sisestamiseks määratud kohta.

Ekraani funktsioon

Siin on kuvamise funktsiooni kood.

void display () {struct node * ptr if (start == NULL) {printf ('nList is empty: n') return} else {ptr = start printf ('nLoendi elemendid on: n') samas (ptr! = NULL) {printf ('% dt', ptr-> info) ptr = ptr-> järgmine}}}

Väljund

Kuvamisfunktsioonis kontrollime kõigepealt, kas loend on tühi, ja naaseme, kui see on tühi. Järgmises osas määrame algväärtuse ptr. Seejärel käivitame tsükli, kuni ptr on null ja printime iga sõlme andmeelemendi, kuni ptr on null, mis määrab loendi lõpu.

java teisendades binaararvu kümnendarvuks

Kustuta funktsioon

Siin on koodilõik, et kustutada sõlm lingist.

void delete_pos () {int i, pos struct sõlme * temp, * ptr if (start == NULL) {printf ('nLoend on tühi: n') exit (0)} else {printf ('nSisestage kustutatav sõlm: t ') scanf ('% d ', & pos) if (pos == 0) {ptr = start start = start-> next printf (' nKustutatud element on:% dt ', ptr-> info ) free (ptr)} else {ptr = start for (i = 0inext if (ptr == NULL) {printf ('nPositsiooni ei leitud: n') return}} temp-> next = ptr-> järgmine printf ('nThe kustutatud element on:% dt ', ptr-> info) tasuta (ptr)}}}

Väljund

Kustutamise käigus kontrollib see kõigepealt, kas loend on tühi, kui jah, siis on see olemas. Kui see pole tühi, palub kasutaja positsioon kustutada. Kui kasutaja sisestab positsiooni, kontrollib ta, kas see on esimene positsioon, kui jah, siis ta määrab ptr alustamiseks ja liigutab algusosuti järgmisse asukohta ning kustutab ptr. Kui positsioon pole null , siis jookseb for for loop alates 0 kuni kasutaja sisestatud positsioonini ja salvestatud kausta pos muutuv. Seal on if-lause, et otsustada, kas sisestatud positsiooni pole. Kui ptr on võrdne nulliga , siis seda pole.

Meie määrake temp temp-le for silmus ja ptr liigub siis järgmise osa juurde. Pärast seda, kui positsioon on leitud. Teeme temp muutuja väärtuse hoidmiseks ptr-> järgmine jättes seega ptr vahele. Seejärel kustutatakse ptr. Samamoodi saab seda teha esimese ja viimase elemendi kustutamiseks.

Kahekordse lingiga loend

Seda nimetatakse topeltlingitud loendiks, kuna neid on kaks näpunäited , üks punkt järgmisele ja teised eelmisele sõlmele. Topeltlingitud toimingud sarnanevad üksikult lingitud toimingutega. Siin on põhitoimingute kood.

#include #include struct Node typedef struct Sõlm * PtrToNode typedef PtrToNode Nimekiri typedef PtrToNode Positsioonistruktuuri sõlm {int e Eelmine positsioon järgmine} void Insert (int x, List l, Position p) {Position TmpCell TmpCell = (struct Node *) malloc (sizeof (struct Node)) kui (TmpCell == NULL) printf ('Mälu on tühikust tühi') veel {TmpCell-> e = x TmpCell-> eelmine = p TmpCell-> järgmine = p-> järgmine p-> järgmine = TmpCell}} void Kustuta (int x, Loend l) {Positsioon p, p1, p2 p = Leia (x, l) if (p! = NULL) {p1 = p -> eelmine p2 = p -> järgmine p1 - > järgmine = p -> järgmine kui (p2! = NULL) // kui sõlm pole viimane sõlm p2 -> eelmine = p -> eelmine} else printf ('Elementi pole olemas !!! n')} tühine Kuva (loend l) {printf ('Loendi element on ::') Positsioon p = l-> järgmine, samal ajal (p! = NULL) {printf ('% d ->', p-> e) p = p- > järgmine}} int main () {int x, pos, ch, i Loend l, l1 l = (struct Node *) malloc (sizeof (struct Node)) l-> eelmine = NULL l-> järgmine = NULL List p = l printf ('L. LUBATUD LINGITUD LOETELU RAKENDAMINE IST ADTnn ') do {printf (' nn1. CREATEn 2. DELETEn 3. DISPLAYn 4. QUITnnSisestage valik :: ') scanf ('% d ', & ch) lüliti (ch) {juhtum 1: p = l printf (' Sisestage lisatav element :: ') scanf ('% d', & x) printf ('Sisestage elemendi asukoht ::') scanf ('% d', & pos) jaoks (i = 1 ijärgmine} Insert (x, l, p) break case 2: p = l printf ('Sisestage kustutatav element ::') scanf ('% d', & x) Delete (x, p) break case 3: Kuva (l) murda}} (ch<4) } 

Väljund

alamstring SQL serveri näites

Seega, nagu näete, on toimingute mõiste üsna lihtne. Topelt lingitud loendil on samad toimingud kui C-programmeerimiskeeles eraldi lingitud loendil. Ainus erinevus on see, et on veel üks aadressimuutuja, mis aitab topeltlingitud loendis loendist paremini läbi liikuda.

Loodan, et olete aru saanud, kuidas teha põhitoiminguid C-s ühe ja topelt lingitud loendis.

Kui soovite õppida Java lingitud loendit, siis siin on .

Kui teil on küsimusi, küsige julgelt kõiki oma küsimusi jaotise „Lingitud loend C-s” kommentaaride osas ja meie meeskond vastab sellele hea meelega.