-2

Can someone explain what we mean when we do, like what does struct Node* next do. does it create a pointer of type struct? any help and resources about structures in c would be helpful

struct Node {
    int dest;
    struct Node* next;
};
tester124
  • 21
  • 3
  • This is a typical structure to be used in something like *linked list*. Here you go, you have the search terms. – Eugene Sh. Aug 07 '19 at 14:23
  • there is **no** struct within struct in your example. `next` is a `pointer` to an object of type `struct Node` which is the same struct the pointer belongs to. – Serge Aug 07 '19 at 14:27

2 Answers2

0

"struct" itself is not a type. "struct [tag]" is a type, for example "struct Node" in your code.

In your case you define a structure type. Every structure of that type will contain a pointer to another structure of that type as a member called "next".

This allows you to chain the structures together in a so called linked list. You store a pointer to the first structure in a variable, then you can follow the chain of links down to the structure you need.

For example, you can do

struct Node *start;
start = malloc(sizeof struct Node);
start->dest = 7;
start->next = malloc(sizeof struct Node);
start->next->dest = 13;
start->next->next = malloc(sizeof struct Node);
start->next->next->dest = 19;
printf("%d %d %d\n", start->dest, start->next->dest, start->next->next->dest);
free(start->next->next);
free(start->next);
free(start);

Please note that this code omits all error handling, in real code you have to handle the case when malloc returns NULL.

Also, in real code you would use such a structure in loops that traverse the chain, not directly as above.

TeaRex
  • 56
  • 1
0

As @Serge is pointing out in comments, is not a struct within a struct, is a reference (a pointer) to an object of the same type, an example:

#include <stdio.h>

struct Node {
    int dest;
    struct Node* next;
};

int main(void)
{
    /* An array of nodes */
    struct Node nodes[] = {
        {1, &nodes[1]}, // next points to the next element
        {2, &nodes[2]}, // next points to the next element
        {3, NULL}       // next points to null
    };
    /* A pointer to the first element of the array */                           
    struct Node *node = nodes;

    while (node) {
        printf("%d\n", node->dest);
        node = node->next; // node moves to the next element
    }
    return 0;
}

Output:

1
2
3

Of course, in my example there is no benefit in using a linked list, linked lists are useful when we don't know the number of elements before-hand.

Another example using dynamic memory:

struct Node *head, *node;

node = head = calloc(1, sizeof *node);
node->dest = 1;
while (more_elements_needed) {
    node->next = calloc(1, sizeof *node);
    node->next->dest = node->dest + 1;
    node = node->next;
}
for (node = head; node != NULL; node = node->next) {
    printf("%d\n", node->dest);
}
David Ranieri
  • 39,972
  • 7
  • 52
  • 94