Pekere Inne i Strukturer
Viktige datastrukturer som stakker, lenkede lister og trær kan inneholde referanser til andre objekter av samme type for å opprette forbindelser eller relasjoner mellom elementene. Datastrukturer vil bli gjennomgått senere i dette kurset.
Elementer i slike datastrukturer kalles vanligvis noder.
Hvis du prøver å opprette en struktur som inneholder et felt av samme type som strukturen selv, vil du få en feil:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
I dette tilfellet oppstår en uendelig rekursjon når størrelsen på en slik struktur skal bestemmes.
Denne ideen kan implementeres ved å bruke en peker til en struktur:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Denne koden fungerer fordi kompilatoren kjenner den nøyaktige størrelsen på en peker — vanligvis 4 eller 8 byte, avhengig av systemet.
Den prøver ikke å beregne størrelsen på hele den nestede strukturen; den lagrer bare en referanse (address) til den.
La oss se hvordan dette fungerer i praksis.
main.c
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" }; – feltet next ble ikke eksplisitt initialisert i struktur-initialiseringen, og vil derfor automatisk bli satt til en nullpeker (NULL), siden dette er standardverdien for pekere når de ikke peker til noe objekt.
while (pointer != NULL) – løkken vil kjøre så lenge pekeren ikke peker til NULL-adressen.
I programmeringsspråk som C og C++ betyr en peker som er NULL vanligvis slutten på en liste (eller annen datastruktur). Derfor vil denne løkken kjøre til pekeren er NULL, noe som kan tolkes som at slutten på listen eller datastrukturen er nådd.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Can you explain why using a pointer solves the recursion problem?
What are some real-world examples of using linked lists or similar structures?
Can you show how to traverse a linked list in C?
Fantastisk!
Completion rate forbedret til 4.35
Pekere Inne i Strukturer
Sveip for å vise menyen
Viktige datastrukturer som stakker, lenkede lister og trær kan inneholde referanser til andre objekter av samme type for å opprette forbindelser eller relasjoner mellom elementene. Datastrukturer vil bli gjennomgått senere i dette kurset.
Elementer i slike datastrukturer kalles vanligvis noder.
Hvis du prøver å opprette en struktur som inneholder et felt av samme type som strukturen selv, vil du få en feil:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
I dette tilfellet oppstår en uendelig rekursjon når størrelsen på en slik struktur skal bestemmes.
Denne ideen kan implementeres ved å bruke en peker til en struktur:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Denne koden fungerer fordi kompilatoren kjenner den nøyaktige størrelsen på en peker — vanligvis 4 eller 8 byte, avhengig av systemet.
Den prøver ikke å beregne størrelsen på hele den nestede strukturen; den lagrer bare en referanse (address) til den.
La oss se hvordan dette fungerer i praksis.
main.c
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" }; – feltet next ble ikke eksplisitt initialisert i struktur-initialiseringen, og vil derfor automatisk bli satt til en nullpeker (NULL), siden dette er standardverdien for pekere når de ikke peker til noe objekt.
while (pointer != NULL) – løkken vil kjøre så lenge pekeren ikke peker til NULL-adressen.
I programmeringsspråk som C og C++ betyr en peker som er NULL vanligvis slutten på en liste (eller annen datastruktur). Derfor vil denne løkken kjøre til pekeren er NULL, noe som kan tolkes som at slutten på listen eller datastrukturen er nådd.
Takk for tilbakemeldingene dine!