# 2. Node Structure

### 2.1 Defining a Node

In C, a node is typically defined using a **structure**:

```c
// Definition of a node
struct Node {
    int data;           // Data part
    struct Node *next;  // Pointer to next node
};
```

**Memory Layout:**
```
Single Node in Memory:
┌──────────┬──────────┐
│   data   │   next   │
│  (int)   │ (pointer)│
└──────────┴──────────┘
   4 bytes    8 bytes (on 64-bit system)
```

### 2.2 Creating a Node

**Method 1: Static Allocation (Limited)**
```c
struct Node node1;
node1.data = 10;
node1.next = NULL;
```

**Method 2: Dynamic Allocation (Recommended)**
```c
#include <stdio.h>
#include <stdlib.h>

struct Node {
    int data;
    struct Node *next;
};

int main() {
    // Allocate memory for new node
    struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
    
    // Check if allocation successful
    if (newNode == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }
    
    // Initialize node
    newNode->data = 10;
    newNode->next = NULL;
    
    printf("Node created with data: %d\n", newNode->data);
    
    // Free memory when done
    free(newNode);
    
    return 0;
}
```

### 2.3 The Arrow Operator (->)

When working with pointers to structures, use the arrow operator:

```c
struct Node *ptr;

// These are equivalent:
ptr->data = 10;      // Arrow operator (preferred)
(*ptr).data = 10;    // Dereference then dot operator
```

**Why use ->?**
- More readable
- Less typing
- Standard convention in C