Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Pegepinde Inde I Structs | Arbejde med Pointere og Structs
Beherskelse af C Structs

bookPegepinde 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.

Note
Bemærk

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

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" }; - 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.

Note
Bemærk

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.

question mark

Hvorfor kan vi ikke oprette en struktur, der indeholder sig selv?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Suggested prompts:

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?

bookPegepinde 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.

Note
Bemærk

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

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" }; - 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.

Note
Bemærk

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.

question mark

Hvorfor kan vi ikke oprette en struktur, der indeholder sig selv?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 3
some-alt