前面学习了手动创建静态链表 现在是静态链表的头插法
#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;
}