学习嵌入式开发第二天C语言数据结构2---链表-头插法+尾插法

16 阅读2分钟

前面学习了手动创建静态链表 现在是静态链表的头插法

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 1. 定义节点结构体:卡片,有数据+箭头(next)
typedef struct Node
{
    int data;               // 存数字
    struct Node* next;      // 箭头:存下一张卡片的地址
} Node;

// 2. 静态链表【头插函数】
// head: 头指针的地址(二级指针);newNode:要插入的现成卡片地址
void headInsert(Node** head, Node* newNode)
{
    // ① 新卡片的箭头,指向原来链表的第一张卡片
    newNode->next = *head;
    // ② 更新路标head:让head指向这张新卡片(新卡片变成链表第一个)
    *head = newNode;
}

// 3. 遍历打印链表
void printList(Node* head)
{
    Node* p = head;         // p 临时路标,从头开始走
    while (p != NULL)       // p不是空,就继续循环
    {
        printf("%d ", p->data);
        p = p->next;        // p走到下一张卡片
    }
    printf("\n");
}

int main(void)
{
    // 静态:预先准备3张卡片,编译就存在,不能临时新增
    Node n1, n2, n3;
    Node* head = NULL;      // 路标head,初始NULL:链表是空的

    n1.data = 1;            // 卡片n1写数字1
    headInsert(&head, &n1); // 头插n1

    n2.data = 2;            // 卡片n2写数字2
    headInsert(&head, &n2); // 头插n2

    n3.data = 3;            // 卡片n3写数字3
    headInsert(&head, &n3); // 头插n3

    printList(head);        // 打印链表:3 2 1

    return 0;
}

尾插法:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 定义节点(卡片:数据+箭头next)
typedef struct Node
{
    int data;
    struct Node* next;
} Node;

/**
 * @brief 静态链表尾插函数
 * @param head  头指针的地址(二级指针)
 * @param newNode 准备插入的现成节点地址
 */
void tailInsert(Node** head, Node* newNode)
{
    newNode->next = NULL;   // 新卡片的尾巴必须置空,它会是新的尾节点

    // 判断:链表是空的
    if (*head == NULL)
    {
        *head = newNode;    // 空链表,新节点直接当第一个节点
        return;             // 函数结束,不用往下找尾巴了
    }

    // 链表不为空:找到最后一张卡片
    Node* p = *head;        // p临时路标,从头开始
    while (p->next != NULL) // 如果p的下一张卡片不是NULL,继续往后走
    {
        p = p->next;
    }
    // 循环结束:p就是最后一个节点!p->next == NULL
    p->next = newNode;      // 最后节点的箭头指向新卡片
}

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

int main(void)
{
    // 静态预先准备3张卡片
    Node n1, n2, n3;
    Node* head = NULL;  // 路标,初始为空

    n1.data = 1;
    tailInsert(&head, &n1); // 尾插1

    n2.data = 2;
    tailInsert(&head, &n2); // 尾插2

    n3.data = 3;
    tailInsert(&head, &n3); // 尾插3

    printList(head); //输出:1 2 3

    return 0;
}