惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
D
DataBreaches.Net
腾讯CDC
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
云风的 BLOG
云风的 BLOG
罗磊的独立博客
月光博客
月光博客
MyScale Blog
MyScale Blog
U
Unit 42
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
G
Google Developers Blog
博客园 - 【当耐特】
D
Docker
I
InfoQ
雷峰网
雷峰网

云藉のBlog

自己总结的钢四pve经验(一) 第五年 近况·丙午大暑 相册·上海之行 相册·南京之行 随笔·一种名为爱好的坎 近况·丙午立夏 近况·丙午惊蛰 近况·乙巳立春 2026 近况·乙巳冬至 近况·乙巳重阳 在自己的服务器上部署Waline 近况·乙巳秋分 近况·乙巳·夏 四年 十八 青岛六十七中校歌 近况·6月9日 二〇二五 近况·甲辰·夏 三周年 十七·启航 近况·甲辰·春
数据结构·单链表
云藉 · 2025-09-22 · via 云藉のBlog

数据结构·单链表

链表由节点构成,单链表中的节点包含着数据和next指针,写成结构体的形式就是

1
2
3
4
5
typedef int ElemType;
typedef struct _Node {
ElemType data;
struct _Node *next;
} Node;

初始化链表

1
2
3
4
5
6
Node *InitList() {
Node *L = (Node *)malloc(sizeof(Node));
L->data = 0;
L->next = NULL;
return L;
}

插入

插入的方法分为:头插、尾插、任意插。

头插法

注意:一定是先让目标节点P的next指向后继节点,再让前驱节点的next指向P,不然后继节点的地址会被覆盖掉。

1
2
3
4
5
6
void HeadInsert(Node *L, ElemType e) {
Node *P = (Node *)malloc(sizeof(Node));
P->data = e;
P->next = L->next;
L->next = P;
}

尾插法

1
2
3
4
5
6
7
8
9
10
void *TailInsert(Node *L, ElemType e) {
Node *P = L, *Tail = (Node *)malloc(sizeof(Node));
while (P->next) {
P = P->next;
}

P->next = Tail;
Tail->data = e;
Tail->next = NULL;
}

任意位置插入

1
2
3
4
5
6
7
8
9
void Insert(Node *L, int index, ElemType e) {
Node *P = L, *Q = (Node *)malloc(sizeof(Node));
for (int i = 0; i < index - 1; i++) {
P = P->next;
}
Q->next = P->next;
P->next = Q;
Q->data = e;
}

遍历

1
2
3
4
5
6
7
8
void Traverse(Node *L) {
Node *P = L->next;
while (P!=NULL) {
printf("%c", P->data);
P = P->next;
}
printf("\n");
}

删除

1
2
3
4
5
6
7
8
9
void Delete(Node *L, int index) {
Node *P = L;
for (int i = 0; i < index - 1; i++) {
P = P->next;
}
Node *Q = P->next;
P->next = Q->next;
free(Q);
}

销毁

1
2
3
4
5
6
7
8
void Destory(Node *L) {
Node *P = L, *Q;
while (P) {
Q = P->next;
free(P);
P = Q;
}
}

查找

1
2
3
4
5
6
7
8
9
10
int Find(Node *L, ElemType e) {
Node *P = L;
int index = 0;
while (P) {
P = P->next;
index++;
if (P->data == e) return index;
}
return -1;
}