C言語でリンクリストの末尾にノードを追加する方法


方法1: 末尾まで移動して追加する この方法では、リンクリストの末尾までポインタを移動し、新しいノードを追加します。

#include <stdio.h>
#include <stdlib.h>
struct Node {
    int data;
    struct Node* next;
};
void append(struct Node head_ref, int new_data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    struct Node* last = *head_ref;
    new_node->data = new_data;
    new_node->next = NULL;
    if (*head_ref == NULL) {
        *head_ref = new_node;
        return;
    }
    while (last->next != NULL) {
        last = last->next;
    }
    last->next = new_node;
}
void printList(struct Node* node) {
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
}
int main() {
    struct Node* head = NULL;
    append(&head, 1);
    append(&head, 2);
    append(&head, 3);

    printf("リストの
内容:
 ");
    printList(head);
    return 0;
}

この例では、append関数を使用して新しいノードをリストの末尾に追加します。printList関数を使用してリストの内容を表示します。

方法2: 末尾へのポインタを保持する この方法では、リンクリストの末尾へのポインタを保持しておくことで、ノードの追加を効率的に行います。

#include <stdio.h>
#include <stdlib.h>
struct Node {
    int data;
    struct Node* next;
};
void append(struct Node head_ref, struct Node tail_ref, int new_data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = NULL;
    if (*head_ref == NULL) {
        *head_ref = new_node;
        *tail_ref = new_node;
    } else {
        (*tail_ref)->next = new_node;
        *tail_ref = new_node;
    }
}
void printList(struct Node* node) {
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
}
int main() {
    struct Node* head = NULL;
    struct Node* tail = NULL;
    append(&head, &tail, 1);
    append(&head, &tail, 2);
    append(&head, &tail, 3);

    printf("リストの
内容:
 ");
    printList(head);
    return 0;
}

この例では、append関数でノードを追加する際に、末尾へのポインタを保持しています。これにより、新しいノードを追加する際にリスト全体を走査する必要がなくなります。

以上がC言語でリンクリストの末尾にノードを追加する方法の例です。他にもさまざまな方法が存在しますが、ここでは基本的な方法を紹介しました。