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

推荐订阅源

T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
雷峰网
雷峰网
量子位
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
博客园 - Franky
罗磊的独立博客
宝玉的分享
宝玉的分享
博客园_首页
腾讯CDC
The GitHub Blog
The GitHub Blog
D
DataBreaches.Net
IT之家
IT之家
D
Docker
Microsoft Security Blog
Microsoft Security Blog
博客园 - 司徒正美
V
V2EX
月光博客
月光博客
N
Netflix TechBlog - Medium
爱范儿
爱范儿
I
InfoQ
P
Proofpoint News Feed

云藉の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;
}