当前位置: 首页 > news >正文

考研数据结构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.dtcms.com/a/293374.html

相关文章:

  • 陷波滤波器设计全解析:原理、传递函数与MATLAB实现
  • Netty中AbstractReferenceCountedByteBuf对AtomicIntegerFieldUpdater的使用
  • 威胁情报:Solana 开源机器人盗币分析
  • Automotive SPICE
  • git的版本冲突
  • 大模型——Data Agent:超越 BI 与 AI 的边界
  • 用ESP32打造全3D打印四驱遥控车:无需APP的Wi-Fi控制方案
  • 从0开始的中后台管理系统-2
  • 课题学习笔记2——中华心法问答系统
  • 汽车行业数字化——解读52页汽车设计制造一体化整车产品生命周期PLM解决方案【附全文阅读】
  • 记录更新时间用java的new date还是数据库的now
  • 深入理解 C 语言数据类型:从内存到应用的全面解析
  • CAN基础知识 - 进阶版
  • 消息推送功能设计指南:精准触达与用户体验的平衡之道
  • Spring Boot 中集成ShardingSphere-JDBC的基本使用
  • Kibana报错[security_exception] current license is non-compliant for [security]
  • HCIA/IP(一二章)笔记
  • TTL+日志的MDC实现简易链路追踪
  • 强化学习理论
  • 计算机是怎么样工作的
  • 在 Ubuntu 22.04 上安装并优化 Nginx nginx入门操作 稍难,需要有一定理论 多理解 多实践
  • Class13预测房价代码
  • Google Gemini 体验
  • 从零开始学CTF(第二十五期)
  • 万界星空科技铜线/漆包线行业智能化MES系统解决方案
  • postgresql导入导出数据;pg_restore: error: did not find magic string in file header
  • 基础算法思想(递归篇)
  • 厚铜板载流革命与精密压合工艺——高可靠性PCB批量制造的新锚点
  • Android AppCompat:实现Material Design向后兼容的终极指南
  • IDEA-通过IDEA导入第三方的依赖包