Pegepinde Inde I Structs
Væsentlige datastrukturer såsom stakke, linkede lister og træer kan indeholde referencer til andre objekter af samme type for at skabe forbindelser eller relationer mellem elementer. Datastrukturer vil blive gennemgået senere i dette kursus.
Elementer i sådanne datastrukturer kaldes normalt noder.
Hvis du forsøger at oprette en struktur, der indeholder et felt af samme type som strukturen selv, vil du få en fejl:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
I dette tilfælde opstår der en uendelig rekursion, når størrelsen af en sådan struktur skal bestemmes.
Denne idé kan implementeres ved hjælp af en pointer til en struktur:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Denne kode fungerer, fordi compileren kender den præcise størrelse af en pointer — typisk 4 eller 8 bytes, afhængigt af systemet.
Den forsøger ikke at beregne størrelsen af hele den indlejrede struktur; den gemmer blot en reference (address) til den.
Lad os 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 blev ikke eksplicit initialiseret i struktur-initialiseringen, og det vil derfor automatisk blive initialiseret til en null-pointer (NULL), da dette er standardværdien for pointere, når de ikke peger på et objekt.
while (pointer != NULL) - løkken vil køre, indtil pointeren peger på NULL-adressen.
I programmeringssprog som C og C++ betyder en pointer, der er NULL, normalt slutningen på en liste (eller en anden datastruktur). Derfor vil denne løkke blive udført, indtil pointer er NULL, hvilket kan tolkes som at nå slutningen af listen eller datastrukturen.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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
Pegepinde Inde I Structs
Stryg for at vise menuen
Væsentlige datastrukturer såsom stakke, linkede lister og træer kan indeholde referencer til andre objekter af samme type for at skabe forbindelser eller relationer mellem elementer. Datastrukturer vil blive gennemgået senere i dette kursus.
Elementer i sådanne datastrukturer kaldes normalt noder.
Hvis du forsøger at oprette en struktur, der indeholder et felt af samme type som strukturen selv, vil du få en fejl:
struct Node {
int data;
struct Node next; // error: `Node` structure contains itself
};
I dette tilfælde opstår der en uendelig rekursion, når størrelsen af en sådan struktur skal bestemmes.
Denne idé kan implementeres ved hjælp af en pointer til en struktur:
struct Node {
int data;
struct Node *next; // pointer to the `Node` structure
};
Denne kode fungerer, fordi compileren kender den præcise størrelse af en pointer — typisk 4 eller 8 bytes, afhængigt af systemet.
Den forsøger ikke at beregne størrelsen af hele den indlejrede struktur; den gemmer blot en reference (address) til den.
Lad os 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 blev ikke eksplicit initialiseret i struktur-initialiseringen, og det vil derfor automatisk blive initialiseret til en null-pointer (NULL), da dette er standardværdien for pointere, når de ikke peger på et objekt.
while (pointer != NULL) - løkken vil køre, indtil pointeren peger på NULL-adressen.
I programmeringssprog som C og C++ betyder en pointer, der er NULL, normalt slutningen på en liste (eller en anden datastruktur). Derfor vil denne løkke blive udført, indtil pointer er NULL, hvilket kan tolkes som at nå slutningen af listen eller datastrukturen.
Tak for dine kommentarer!