数据结构——链表——单链表(C语言实现)
创作时间:
作者:
@小白创作中心
数据结构——链表——单链表(C语言实现)
引用
CSDN
1.
https://m.blog.csdn.net/xiahongtao111/article/details/143866639
单链表初始化
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#define MAXSIZE 100
typedef int Elemtype;
// 单链表节点结构
typedef struct Node {
Elemtype data;
struct Node* next;
} Node;
// 初始化链表
Node* initList() {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 0;
head->next = NULL;
return head;
}
int main() {
Node* List = initList();
return 1;
}
单链表头插法
// 头插法
int insertHead(Node* L, Elemtype e) {
Node* p = (Node*)malloc(sizeof(Node));
p->data = e;
p->next = L->next;
L->next = p;
}
int main() {
Node* list = initList();
insertHead(list, 10);
insertHead(list, 20);
}
单链表遍历
注意:下面的L指的是头节点,头节点的next是首元节点,才是链表存数据的第一个
// 遍历链表
void listNode(Node* L) {
Node* p = L->next; // L为头节点,L的next指向的是首元节点
while (p != NULL) {
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
单链表尾插法
相比于头插法,要先找到尾部,找到节点next指向是NULL的节点
// 获取尾节点
Node* get_tail(Node* L) {
Node* p = L;
while (p->next != NULL) {
p = p->next;
}
return p;
}
// 尾插
Node* insertTail(Node* tail, Elemtype e) {
Node* p = (Node*)malloc(sizeof(Node));
p->data = e;
tail->next = p;
p->next = NULL;
return p;
}
单链表在指定位置插入数据
// 在指定位置插入数据
int insertNode(Node* L, int pos, Elemtype e) { // L链表,pos是插入的位置,e是插入的新数据
// 用来保存插入位置的前驱节点
Node* p = L;
int i = 0;
// 遍历链表找到插入位置的前驱节点
while (i < pos - 1) {
p = p->next;
i++;
if (p == NULL) {
return 0;
}
}
Node* q = (Node*)malloc(sizeof(Node));
q->data = e;
q->next = p->next;
p->next = q;
return 1;
}
单链表删除节点
找到要删除节点的前置节点p
用指针q记录要删除的节点
通过改变p的后继节点实现删除
释放删除节点的空间
// 删除节点
int deleteNode(Node* L, int pos) {
// 要删除节点的前驱节点
Node* p = L;
int i = 0;
// 遍历链表,找到要删除节点的前驱节点
while (i < pos - 1) {
p = p->next;
i++;
if (p == NULL) {
return 0;
}
}
if (p->next == NULL) {
printf("要删除的位置错误\n");
return 0;
}
// q指向要删除的节点
Node* q = p->next;
// 让要删除节点的前驱指向要删除节点的后继
p->next = q->next;
// 释放要删除节点的空间
free(q);
return 1;
}
单链表获取链表长度
// 获取链表长度
int listlength(Node* L) {
Node* p = L;
int len = 0;
while (p != NULL) {
p = p->next;
len++;
}
return len;
}
单链表释放链表
指针p指向头节点后的第一个节点
判断指针p是否指向空节点
如果p不为空,用指针q记录指针p的后继节点
释放指针p指向的节点
指针p合指针q指向同一个节点,循环上面操作
// 释放链表
void freeList(Node* L) { // 传进来链表,也就是头节点
Node* p = L->next;
Node* q;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
L->next = NULL; // 头节点指向空
}
单链表应用——反转链表
先拿first指向空值,再拿second指向1,third指向second所指向的下一个节点
然后让second指向空值
然后挪动三个指针
再将此时的2指针指向改变
依次进行,直到second指向空值
再安一个头节点
// 反转链表
Node* reverseList(Node* head) {
Node *first = NULL;
Node *second = head->next;
Node *third;
while (second != NULL) {
third = second->next;
second->next = first;
first = second;
second = third;
}
Node *hd = initList();
hd->next = first;
return hd;
}
int main(int argc, char const *argv[]) {
Node *list = initList();
Node *tail = get_tail(list);
tail = insertTail(tail, 1);
tail = insertTail(tail, 2);
tail = insertTail(tail, 3);
tail = insertTail(tail, 4);
tail = insertTail(tail, 5);
tail = insertTail(tail, 6);
listNode(list);
Node* reverse = reverseList(list);
listNode(reverse);
return 0;
}
热门推荐
苏锡常城际铁路PK大湾区“超级地铁”:谁更胜一筹?
苏锡常城际铁路最新规划出炉,你最期待哪一站?
苏锡常城际铁路最新线路调整揭秘:太仓成最大赢家
懒人西瓜种植全攻略:从土壤准备到幼瓜管理的六大关键步骤
盆栽小西瓜的种植方法和管理
什么时候种西瓜?不同栽培方式的种植时间和技巧详解
白条鸡选购全攻略:从外观到营养价值的全方位解析
双十一大促:白条鸡与三黄鸡谁更值得买?
儿童服用中药期间的饮食禁忌与注意事项
东海带鱼 vs 南海带鱼,谁才是年夜饭C位?
“破肚子”的带鱼也能安全储存?教你妙招!
烤带鱼:健康美食界的黑马
红烧带鱼:家常菜界的“顶流”是如何炼成的?
国债逆回购:2025年节假日理财攻略
国债逆回购:金融市场波动中的稳健投资选择
雪球App教你玩转国债逆回购
新泰市人社局暖心上门认证服务:355位老人足不出户完成社保认证
新泰市社保资格认证:大数据+上门服务让群众更省心
草莓裸根苗、基质苗、脱毒组培苗哪种好?
化工产业革新:引领未来的四大驱动力
长武县必打卡景点:昭仁寺领衔
研究发现:六种流行保健品导致肝损伤和住院率上升
江宁路街道举办敦煌壁画亲子活动,让传统文化走进现代家庭
笔记本电脑品牌怎么选?五个维度教你如何选择笔记本电脑
显示器选购攻略:从菜鸟到行家,一篇文章让你挑对心仪屏幕!
显示器选购攻略:从菜鸟到行家,一篇文章让你挑对心仪屏幕!
选购显卡指南:关键性能参数与选择技巧详解
流感季必备:高压锅炖鸡汤,提高免疫力
冬季养生,鸡汤界的“网红”推荐
冬季感冒必备:一碗热鸡汤