【C语言手撕数据结构代码】【单链表】

定义结构体

// 定义链表节点结构体
typedef struct Node {
    int data;   // 节点存储的数据
    struct Node *next;   // 指向下一个节点的指针
} Node;

初始化单链表

// 初始化链表节点函数
// 返回值: 返回一个新的链表节点指针
Node *initNode() {
    Node *head = (Node *) malloc(sizeof(Node));   // 分配一个新的节点
    head->data = 0;   // 初始化节点数据为0
    head->next = NULL;   // 初始化下一个节点指针为NULL
    return head;   // 返回新节点指针
}

插入结点

// 头插法插入节点函数
// 参数:
//   head: 链表的头节点指针
//   data: 待插入节点的数据
void headInsert(Node *head, int data) {
    Node *p = (Node *) malloc(sizeof(Node));   // 分配一个新的节点
    p->data = data;   // 设置节点数据
    p->next = head->next;   // 将新节点的next指针指向原头节点
    head->next = p;   // 将头节点的next指针指向新节点,使其成为新的头节点
    head->data++;   // 更新链表长度
}
// 尾插法插入节点函数
// 参数:
//   head: 链表的头节点指针
//   data: 待插入节点的数据
void tailInsert(Node *head, int data) {
    Node *p = (Node *) malloc(sizeof(Node));   // 分配一个新的节点
    p->data = data;   // 设置节点数据
    Node *q = head;   // 用于遍历链表的指针
    while (q->next) {   // 找到链表尾部
        q = q->next;
    }
    q->next = p;   // 将尾节点的next指针指向新节点
    p->next = NULL;   // 设置新节点的next指针为NULL
    head->data++;   // 更新链表长度
}

删除结点

// 删除节点函数
// 参数:
//   head: 链表的头节点指针
//   data: 待删除节点的数据
void deleteLine(Node *head, int data) {
    Node *p = head;   // 用于遍历链表的指针
    while (p->next) {   // 遍历链表
        if (p->next->data == data) {   // 找到待删除节点
            Node *q = p->next;   // 保存待删除节点指针
            p->next = q->next;   // 将待删除节点从链表中移除
            free(q);   // 释放待删除节点内存
            head->data--;   // 更新链表长度
        }
        p = p->next;   // 移动到下一个节点
    }
}

遍历结点

// 打印链表函数
// 参数:
//   head: 链表的头节点指针
void printList(Node *head) {
    head = head->next;   // 移动到第一个数据节点
    while (head) {   // 遍历链表
        printf("%d -> ", head->data);   // 打印当前节点数据
        head = head->next;   // 移动到下一个节点
    }
    printf("NULL");   // 打印链表尾部标识
}

案例展示

#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
    int data;   // 节点存储的数据
    struct Node *next;   // 指向下一个节点的指针
} Node;
// 初始化链表节点函数
// 返回值: 返回一个新的链表节点指针
Node *initNode() {
    Node *head = (Node *) malloc(sizeof(Node));   // 分配一个新的节点
    head->data = 0;   // 初始化节点数据为0
    head->next = NULL;   // 初始化下一个节点指针为NULL
    return head;   // 返回新节点指针
}
// 头插法插入节点函数
// 参数:
//   head: 链表的头节点指针
//   data: 待插入节点的数据
void headInsert(Node *head, int data) {
    Node *p = (Node *) malloc(sizeof(Node));   // 分配一个新的节点
    p->data = data;   // 设置节点数据
    p->next = head->next;   // 将新节点的next指针指向原头节点
    head->next = p;   // 将头节点的next指针指向新节点,使其成为新的头节点
    head->data++;   // 更新链表长度
}
// 尾插法插入节点函数
// 参数:
//   head: 链表的头节点指针
//   data: 待插入节点的数据
void tailInsert(Node *head, int data) {
    Node *p = (Node *) malloc(sizeof(Node));   // 分配一个新的节点
    p->data = data;   // 设置节点数据
    Node *q = head;   // 用于遍历链表的指针
    while (q->next) {   // 找到链表尾部
        q = q->next;
    }
    q->next = p;   // 将尾节点的next指针指向新节点
    p->next = NULL;   // 设置新节点的next指针为NULL
    head->data++;   // 更新链表长度
}
// 删除节点函数
// 参数:
//   head: 链表的头节点指针
//   data: 待删除节点的数据
void deleteLine(Node *head, int data) {
    Node *p = head;   // 用于遍历链表的指针
    while (p->next) {   // 遍历链表
        if (p->next->data == data) {   // 找到待删除节点
            Node *q = p->next;   // 保存待删除节点指针
            p->next = q->next;   // 将待删除节点从链表中移除
            free(q);   // 释放待删除节点内存
            head->data--;   // 更新链表长度
        }
        p = p->next;   // 移动到下一个节点
    }
}
// 打印链表函数
// 参数:
//   head: 链表的头节点指针
void printList(Node *head) {
    head = head->next;   // 移动到第一个数据节点
    while (head) {   // 遍历链表
        printf("%d -> ", head->data);   // 打印当前节点数据
        head = head->next;   // 移动到下一个节点
    }
    printf("NULL");   // 打印链表尾部标识
}

// 主函数
int main() {
    Node *head = initNode();   // 初始化链表
    headInsert(head, 1);   // 使用头插法插入数据
    headInsert(head, 2);
    headInsert(head, 3);
    headInsert(head, 4);
    tailInsert(head, 5);   // 使用尾插法插入数据
    tailInsert(head, 6);
    tailInsert(head, 7);
    deleteLine(head, 4);   // 删除数据为4的节点
    printList(head);   // 打印链表
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code丶Q

让我们共同进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值