单链表头插法

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int val;
    struct Node* next;
} Node;

// 单链表
// 初始化
Node* create() {
    Node* head;
    head = (Node*)malloc(sizeof(Node));
    head -> val = 0;
    head -> next = NULL;
    return head;
}

// 头插法
void insertHead(Node* head, int n) {
    Node* p = (Node*)malloc(sizeof(Node));
    p -> val = n;
    p -> next = head -> next;
    head -> next = p;
}

// 在指定位置插入
void insertNode(Node* head, int pos, int n) {
    Node* p = head;
    for (int i = 0; i < pos - 1; i++) {
        p = p -> next;
        if (p == NULL) {
            return;
        }
    }

    Node* q = (Node*)malloc(sizeof(Node));
    q -> val = n;
    q -> next = p -> next;
    p -> next = q;
}

// 删除指定位置结点
void delete(Node* head, int pos) {
    Node* p = head;
    for (int i = 0; i < pos - 1; i++) {
        p = p -> next;
        if (p == NULL) {
            return;
        }
    }

    if (p -> next == NULL) {
        printf("Error!\n");
        return;
    }

    Node* q = p -> next;
    p -> next = q -> next;
    free(q);
}

// 遍历(打印链表)
void listNode(Node* head) {
    Node* p = head -> next;
    while (p != NULL) {
        printf("%d ", p -> val);
        p = p -> next;
    }
}

int main() {
    Node* head = create();
    int a = 1, b = 2;
    insertHead(head, a);
    insertHead(head, b);
    insertNode(head, 2, 3);
    delete(head, 2);
    listNode(head);
    return 0;
}