Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Osoittimet Rakenteiden Sisällä | Osoittimien ja Rakenteiden Käsittely
C-Rakenteiden Hallinta

bookOsoittimet Rakenteiden Sisällä

Keskeiset tietorakenteet, kuten pinot, linkitetyt listat ja puut, voivat sisältää viittauksia muihin saman tyyppisiin olioihin muodostaakseen yhteyksiä tai suhteita elementtien välille. Tietorakenteita käsitellään tarkemmin myöhemmin tällä kurssilla.

Note
Huomio

Tällaisten tietorakenteiden elementtejä kutsutaan yleensä solmuiksi.

Jos yrität luoda rakenteen, joka sisältää kentän, jonka tyyppi on sama kuin rakenteen itsensä, saat virheilmoituksen:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

Tässä tapauksessa ääretön rekursio tapahtuu, kun tällaisen rakenteen kokoa määritetään.

Tämä ajatus voidaan toteuttaa käyttämällä osoitinta rakenteeseen:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Tämä koodi toimii, koska kääntäjä tietää osoittimen tarkan koon — yleensä 4 tai 8 tavua järjestelmästä riippuen.
Se ei yritä laskea koko sisäkkäisen rakenteen kokoa; se tallentaa vain viittauksen (address) siihen.

Tarkastellaan, miten tämä toimii käytännössä.

main.c

main.c

copy
1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - koska next-kenttää ei alustettu rakenteen alustajassa, se alustetaan automaattisesti null-osoittimeksi (NULL), sillä tämä on vakioarvo osoittimille, kun ne eivät osoita mihinkään olioon.

while (pointer != NULL) - silmukka suoritetaan, kunnes osoitin osoittaa NULL-osoitteeseen.

Note
Huomio

Ohjelmointikielissä kuten C ja C++, osoitin, jonka arvo on NULL, tarkoittaa yleensä listan (tai muun tietorakenteen) loppua. Tämän vuoksi silmukka suoritetaan, kunnes pointer on NULL, mikä voidaan tulkita listan tai tietorakenteen loppuun pääsemiseksi.

question mark

Miksi emme voi luoda rakennetta, joka sisältää itsensä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

bookOsoittimet Rakenteiden Sisällä

Pyyhkäise näyttääksesi valikon

Keskeiset tietorakenteet, kuten pinot, linkitetyt listat ja puut, voivat sisältää viittauksia muihin saman tyyppisiin olioihin muodostaakseen yhteyksiä tai suhteita elementtien välille. Tietorakenteita käsitellään tarkemmin myöhemmin tällä kurssilla.

Note
Huomio

Tällaisten tietorakenteiden elementtejä kutsutaan yleensä solmuiksi.

Jos yrität luoda rakenteen, joka sisältää kentän, jonka tyyppi on sama kuin rakenteen itsensä, saat virheilmoituksen:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

Tässä tapauksessa ääretön rekursio tapahtuu, kun tällaisen rakenteen kokoa määritetään.

Tämä ajatus voidaan toteuttaa käyttämällä osoitinta rakenteeseen:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Tämä koodi toimii, koska kääntäjä tietää osoittimen tarkan koon — yleensä 4 tai 8 tavua järjestelmästä riippuen.
Se ei yritä laskea koko sisäkkäisen rakenteen kokoa; se tallentaa vain viittauksen (address) siihen.

Tarkastellaan, miten tämä toimii käytännössä.

main.c

main.c

copy
1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - koska next-kenttää ei alustettu rakenteen alustajassa, se alustetaan automaattisesti null-osoittimeksi (NULL), sillä tämä on vakioarvo osoittimille, kun ne eivät osoita mihinkään olioon.

while (pointer != NULL) - silmukka suoritetaan, kunnes osoitin osoittaa NULL-osoitteeseen.

Note
Huomio

Ohjelmointikielissä kuten C ja C++, osoitin, jonka arvo on NULL, tarkoittaa yleensä listan (tai muun tietorakenteen) loppua. Tämän vuoksi silmukka suoritetaan, kunnes pointer on NULL, mikä voidaan tulkita listan tai tietorakenteen loppuun pääsemiseksi.

question mark

Miksi emme voi luoda rakennetta, joka sisältää itsensä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 3
some-alt