考研数据结构Part1——单链表知识点总结

 一、前言

        单链表是线性表的链式存储结构,作为数据结构中最基础也是最重要的线性结构之一,在考研数据结构科目中占有重要地位。本文将总结带头结点单链表的各项基本操作,包括初始化、插入、删除、查找等,并附上完整C语言实现代码,帮助大家系统掌握这一重要知识点。本文基于王道考研做的知识点总结和代码复现。

二、基本操作

1. 初始化单链表(带头结点)

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;
//初始化,带头结点
bool InitLinkList(LinkList &L){L=(LNode*)malloc(sizeof(LNode));L->next=NULL;return true;
}

2. 创建单链表

//头插法
LinkList List_HeadInsert(LinkList &L){LNode *s;ElemType x;scanf("%d",&x);while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;s->next=L->next;L->next=s;scanf("%d",&x);	}return L;
}//尾插法
LinkList List_TailInsert(LinkList &L){LNode *r=L,*s;ElemType x;scanf("%d",&x);while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;r->next=s;r=s;//r指向新的尾节点scanf("%d",&x);}r->next=NULL;return r;
}

3.  查找、插入与删除操作

//求长度--O(n)
int Length(LinkList L){int len=0;LNode *p=L->next;while(p!=NULL){len++;p=p->next;}return len;
}
//按位查找--O(n)
LNode *GetElem(LinkList L,int i){LNode *p=L;int j=0;while(p!=NULL&&j<i){p=p->next;j++;}return p;		
}
//按值查找--O(n)
LNode *LocateElem(LinkList L,ElemType e){LNode *p=L->next;while(p!=NULL&&p->data!=e)p=p->next;return p;
}
//插入某元素到链表的指定位置--O(n)
bool ListInsert(LinkList &L,int i,ElemType &e){LNode *p=L;int j=0;while(p->next!=NULL && j<i-1){p=p->next;j++;}if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;
}//删除某元素到链表的指定位置--O(n)
bool ListDelete(LinkList &L,int i,ElemType &e){LNode *p=L;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;}if(p==NULL||p->next==NULL){return false;}LNode *q=p->next;e=q->data;p->next=q->next;free(q);return true;	
}

4. 判断两链表是否有相同节点

//判断两个链表是否有相同节点
LNode *getSimilar(LNode *A,LNode *B){LNode *a=A->next,*b=B->next;int ab=Length(A)-Length(B);if(ab>0){while(ab){a=a->next;ab--;}}else if(ab<0){while(ab){b=b->next;ab++;}}while(a&&b){if(a->data==b->data) return a;a=a->next;b=b->next;}return NULL;
}

三、主函数测试代码

int main()
{//创建链表A,BLinkList A,B;InitLinkList(A); InitLinkList(B);printf("创建链表A(按9999退出):");List_TailInsert(A);printf("创建链表B(按9999退出):");List_TailInsert(B);//统计表长,查询指定的值int len_A,len_B;len_A=Length(A);len_B=Length(B);printf("A,B的长度分别是%d和%d\n",len_A,len_B);printf("按位查询A的第2个节点是,%d\n",GetElem(A,2)->data);if(LocateElem(B,2)->data != NULL)printf("按值查询B中是否有节点值为2,有\n");elseprintf("按值查询B中是否有节点值为2,没有\n");//打印链表A,Bprintf("打印链表A:");LNode *p=A->next,*q=B->next;while(p!=NULL){printf("%d\t ",p->data);p=p->next;}	printf("\n打印链表B:");while(q!=NULL){printf("%d\t ",q->data);q=q->next;}//查找A,B是否有相同的节点if(getSimilar(A,B)!=NULL) printf("\nA,B中有相同值的节点,%d\n",getSimilar(A,B)->data);else printf("\nA,B中没有相同值的节点\n");//删除链表A,Bint x,y;for(int i=0;i<=len_A;i++)ListDelete(A,i,x);for(int j=0;j<=len_B;j++)ListDelete(B,j,y);printf("删除A,B的最后两个元素是%d,%d",x,y);return 0;
}

基于上述的代码进行测试,结果如下图所示:

四、练习模板

万丈高楼的搭建,也离不开简单的一砖一瓦,坚实的基础才是拿下大题的关键。

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;
//初始化,带头结点
bool InitLinkList(LinkList &L){}
//头插法
LinkList List_HeadInsert(LinkList &L){}
//尾插法
LinkList List_TailInsert(LinkList &L){}
//求长度--O(n)
int Length(LinkList L){}
//按位查找--O(n)
LNode *GetElem(LinkList L,int i){}
//按值查找--O(n)
LNode *LocateElem(LinkList L,ElemType e){}
//插入某元素到链表的指定位置--O(n)
bool ListInsert(LinkList &L,int i,ElemType &e){}
//删除某元素到链表的指定位置--O(n)
bool ListDelete(LinkList &L,int i,ElemType &e){}
//判断两个链表是否有相同节点
LNode *getSimilar(LNode *A,LNode *B){}
int main(){
//可用上面的main函数替换该部分的内容
}

五、总结

        掌握带头结点单链表的各项操作是数据结构学习的基础,也是考研的重点内容。带头结点的链表相比普通链表有以下优势:

  • 统一操作:无论链表是否为空,操作方式一致
  • 简化代码:不需要特殊处理第一个结点的情况
  • 提高效率:某些操作如头插法更加高效

六、附录

链表操作-易错点总结
操作代码模板注意事项
头插法s->next=L->next; L->next=s两句顺序不能反
尾插法r->next=s; r=s;最后指针要置NULL
结点删除p->next = q->next; free(q);需要临时保存q的data
链表遍历while(p!=NULL){...p=p->next;}结束条件勿用p->next!=NULL

        💡 应试技巧
1. 画图!用不同颜色标注指针变化
2. 先写边界条件(空表、单结点表)
3. 检查循环结束后尾结点是否为NULL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90075.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔试——Day15

文章目录第一题题目思路代码第二题题目&#xff1a;思路代码第三题题目&#xff1a;思路代码第一题 题目 平方数 思路 判断⼀个数开根号之后左右两个数的平⽅&#xff0c;哪个最近即可 代码 第二题 题目&#xff1a; 分组 思路 枚举所有的结果&#xff0c;找到第一个复合要…

物联网全流程开发记录

问题 有数据采集设备&#xff0c;服务器&#xff0c;上位机用户显示三部分&#xff0c;采集设备将采集的数据发送至服务器。服务器将数据保存&#xff0c;上位机读取服务器保存的数据库显示。当出现多设备&#xff0c;多用户时&#xff0c;如何通过多设备对应多用户&#xff0c…

【LeetCode 热题 100】46. 全排列——回溯

Problem: 46. 全排列 文章目录整体思路完整代码时空复杂度时间复杂度&#xff1a;O(N * N!)空间复杂度&#xff1a;O(N)整体思路 这段代码旨在解决一个经典的组合数学问题&#xff1a;全排列 (Permutations)。给定一个不含重复数字的数组 nums&#xff0c;它需要找出其所有可能…

AXI接口学习

amba总线的发展axi协议是两个接口之间的点对点的协议&#xff0c;主要是有5个通道。主机在写地址&#xff08;AW&#xff09;通道上发送地址&#xff0c;并在写数据&#xff08;W&#xff09;通道上将数据传输到从机。从机将接收到的数据写入指定地址空间。从机完成写操作&…

Validation - Spring Boot项目中参数检验的利器

Validation - Spring Boot项目中参数检验的利器 什么是Validation Sping Boot官方原文&#xff1a;When it comes to validating user input, Spring Boot provides strong support for this common, yet critical, task straight out of the box.Although Spring Boot support…

云服务器VS虚拟主机:如何抉择?

开篇引入在当今数字化浪潮中&#xff0c;无论是个人站长想要搭建独具风格的博客&#xff0c;展示自己的生活感悟与专业见解&#xff1b;还是中小企业期望构建官方网站&#xff0c;拓展线上业务版图&#xff0c;提升品牌知名度&#xff1b;亦或是大型互联网企业筹备高并发的电商…

不同相机CMOS噪点对荧光计算的影响

摘要&#xff1a;荧光成像是生物医学、材料科学等领域的重要研究手段&#xff0c;其成像质量高度依赖传感器噪声特性。本文系统分析CMOS传感器噪声类型及其对荧光信号计算的影响机制&#xff0c;结合实验数据探讨不同CMOS架构的噪声表现差异&#xff0c;提出针对性优化策略。研…

docker 常见命令使用记录

1. swarm 集群 1. 集群创建 # 创建集群管理节点&#xff0c; --advertise-addr 指定节点管理通信地址&#xff0c;--data-path-addr 指定容器通信地址 docker swarm init --advertise-addr 1.14.138.35 --data-path-addr 1.14.138.35# --advertise-addr 指明当前work节点的…

KRaft 角色状态设计模式:从状态理解 Raft

这些状态类是 Raft 协议行为的核心载体。它们包含转移逻辑 和 节点在特定状态下的所有行为和数据。QuorumState它是 KRaft 客户端实现中状态管理的核心&#xff0c;扮演着“状态机上下文&#xff08;Context&#xff09;”和“状态转换协调者”的关键角色。QuorumState 是整个 …

Linux的磁盘存储管理实操——(上)

一、Linux的设备文件分类 Linux的设备文件分类1、在Linux系统中设备文件是用来与外接交互的接口&#xff0c;它将内核中的硬件设备与文件系统关联起来&#xff0c;让用户可以像操作普通文件一样来操作硬件设备&#xff0c;同时也为开发者提供了方便而强大的应用程序接口。 2、L…

内核bpf的实现原理

bpftrace能帮我们干什么&#xff1f;1、统计 tcp连接的生命时长、2、统计mysql执行一条sql语句的时间3、统计redis执行命令的时间、 4、对文件进行一次读或者写的时间。 常用命令&#xff1a; bpftrace -e Begin { printf("hello\n"); } bpftrace -l *enter_accep…

前端npm配置Nexus为基础仓库

步骤&#xff1a; 一、Nexus仓库配置 新增npm仓库,具体详解见 Nexus私有仓库配置&#xff0c;解释 注&#xff1a;Nexus的版本需要至少3.38以上&#xff0c;不然会出现npm install 时npm的审计功能报错&#xff0c;导致install失败。虽然在3.38以后不会报400错误&#xff0c…

数据结构 之 【排序】(直接插入排序、希尔排序)

目录 1.直接插入排序 1.1直接插入排序的思想 1.2直接插入排序的代码逻辑&#xff1a; 1.3 直接插入排序图解 1.4单趟排序代码(单个元素的排序逻辑) 1.5完整排序代码 1.6直接插入排序的时间复杂度与空间复杂度 1.7直接插入排序的优势 2.希尔排序(缩小增量排序) 2.1…

Laravel 后台登录 403 Forbidden 错误深度解决方案-优雅草卓伊凡|泡泡龙

Laravel 后台登录 403 Forbidden 错误深度解决方案-优雅草卓伊凡|泡泡龙一顿操作猛如虎&#xff0c;一看结果250&#xff0c;必须记录&#xff0c;必须记录&#xff0c;&#xff01;今天弄了很久关于我们2023年的产品系统蜻蜓T会议系统专业版&#xff0c;然后终于搞好了密码也重…

Newline全场景方案闪耀2025中国智慧生活大会

7月15日 — 16日&#xff0c;由中国电子视像行业协会等权威机构指导的2025 CIC中国智慧生活大会在京召开。Newline作为视像协会PID分会副会长单位携全场景智慧办公解决方案亮相&#xff0c;首席营销官李宇鹏受邀出席领袖圆桌环节&#xff0c;与腾讯云、京东方、创维、TCL、小猿…

Edge浏览器地址栏默认搜索引擎设置指南

前言 Microsoft Edge 浏览器允许用户自定义地址栏默认搜索引擎&#xff0c;只是设置入口隐藏比较深&#xff0c;以版本 137.0.3296.83 (正式版本) (64 位)为例详细记录设置地址栏默认搜索引擎步骤&#xff1a; Edge 设置默认搜索引擎步骤 通过设置界面修改 打开Edge设置&#x…

Python eval函数详解 - 用法、风险与安全替代方案

Python eval函数详解 - 用法、风险与安全替代方案在Python中&#xff0c;eval() 是一个内置函数&#xff0c;用于解析并执行传入的字符串形式的表达式。它能够将字符串动态地转换为有效的Python代码并运行。虽然 eval() 功能强大&#xff0c;但其使用也伴随着潜在的安全风险。本…

Webpack5 新特性与详细配置指南

一、Webpack5 新特性 内置 Asset Modules&#xff08;资源模块&#xff09; 替代 file-loader、url-loader、raw-loader 等&#xff0c;统一资源处理方式。四种类型&#xff1a;asset/resource&#xff1a;导出文件 URL&#xff08;等同 file-loader&#xff09;。asset/inli…

笼子在寻找一只鸟:解读生活的隐形陷阱

想象一个闪闪发光的笼子&#xff0c;敞开着门&#xff0c;在世界中游荡&#xff0c;寻找一只鸟儿。这画面是不是有点奇怪&#xff1f;这是卡夫卡的格言“一个笼子在寻找一只鸟”带给我们的奇思妙想。通常&#xff0c;鸟儿自由翱翔&#xff0c;笼子静静等待&#xff0c;但卡夫卡…

低空经济展 | 约克科技携小型化测试设备亮相2025深圳eVTOL展

全球低空经济与eVTOL产业盛会——2025深圳eVTOL展&#xff0c;将于2025年9月23日至25日在深圳坪山燕子湖国际会展中心盛大启幕&#xff01; 本届展会以“低空经济eVTOL航空应急救援商载大型无人运输机”为核心&#xff0c;预计汇聚200位发言嘉宾、500家顶尖展商及15,000位专业观…