单链表即每个节点都存在数据域和指针域(特殊节点除外),每个节点都一个直接前驱节点和直接后继节点(头节点无前驱,尾节点无后继),简单来说就是上一个节点的指针域中存放了下一个节点的地址,因此可以实现层层节点依次查找,时间复杂度为O(n),这也就是相对顺序表而言的缺点,但是对于频繁的插入和删除节点却是相对于顺序表的优点,除了首次查询为O(n)外,插入和删除都是O(1);

由于顺序表存储单元和长度都是固定的所以可以直接定位到需要查找的元素查找时间复杂的为O(1),删除和插入会导致其它单元的位置移动所以时间复杂度为O(n)。

接下来介绍下单链表中简单的基本操作实现:

//声明一个单链表结构体
typedef struct LNode {int data;     //数据域,数据域的类型为泛型(ElementType)LNode *next;   //指针域,指向下一个node的地址
}LNode,*LinkList;   //声明2个结构体别名(结构体别名和结构体指针别名),方便在外部直接通过别名定义该结构体类型的变量

头插法创建单链表:

/*
function:头插法创建单链表即将节点依次插入到head节点之后
*/
LinkList headInsertList(LinkList &L) {LNode *s;int x;L =(LinkList)malloc(sizeof(LNode)); //开辟一块空间,创建头节点L->next = NULL;//初始化空链表scanf_s("%d", &x);//控制台首次输入节点数据while (x != 9999) {s =(LinkList)malloc(sizeof(LNode));//创建一个新节点s->data = x;//指定新节点的数据域s->next = L->next;//指定新节点的指针域L->next = s;//头节点指向新节点scanf_s("%d", &x);//控制台依次输入节点数据}return L;
}

尾插法创建单链表:

/*
尾插法创建单链表即将节点依次插入到链表的尾部
*/
LinkList endInsertList(LinkList &L) {LNode *s;//定义需要创建的节点指针LNode *r;//定义尾节点指针L = (LinkList)malloc(sizeof(LNode));//开辟一块空间,创建头节点r = L;//初始化尾节点为头节点int x;scanf_s("%d", &x);while (x != 9999) {s = (LinkList)malloc(sizeof(LNode));//开辟一块空间存储需要创建的节点s->data = x;//s->next = NULL;    //清空尾节点的指针域r->next = s;r = s;scanf_s("%d", &x);}r->next = NULL;      //清空尾节点的指针域return L;
}

按序号查找节点:

/*
按序号查找法
*/
//*getElem表示返回节点指针类型,不加*则表示返回节点
LNode *getElemByIndex(LinkList L, int i) {LNode *p = L->next;//把头节点赋值给pint j = 1;//表示从1开始查找if (i < 1) {//线性表下标从1开始return NULL;}//遍历查找:下一个节点存在且还未到达查找点while (p && j<i){p = p->next;j++;}
}

按值查找表节点:

/*
按值查找表节点
e:需要查找的值,泛型表示法(伪代码):ElemetnType e,这里简单表示为int
*/
LNode *getElemByValue(LinkList L, int e) {LNode *q = L->next;//获取头节点int s = q->data;//遍历查找while (q != NULL && s != e){q = q->next;s = q->data;}return q;
}

在指定的位置i处插入节点:

/*
function:插入节点,在指定的位置i处插入节点
i:需要插入的位置
e:需要插入的节点
*/
LinkList insertAtIndex(LinkList &L, int i, LNode *e) {if (i < 1) {return NULL;}LNode *p = L->next;//获取头节点int j = 1;//查找需要插入节点的前驱节点while (p != NULL && j < i-1) {p = p->next;}e->next = p->next;p->next = e;
}

删除指定的节点:

/*
删除指定的节点
i:需要删除的节点位置
*/
LNode *deleteLNode(LinkList &L,int i) {//查找节点LNode *p = L->next;//获取头节点LNode *q;//需要删除的节点int j = 1;while (p != NULL && j < i-1) {//找到需要删除节点的上一个节点p = p->next;j++;}if (p == NULL) {//没找到return NULL;}q = p->next;p->next = q->next;free(q);//释放删除节点的空间return q;
}

求链表长度:

/*
求链表长度即依次遍历累加求和
*/
int getLength(LinkList &L) {LNode *p = L->next;//获取头节点int j = 1;while (p != NULL) {p = p->next;j++;}return j;}

以上为线性表链表中单链表的基本操作。

数据结构-链表之单链表相关推荐

  1. python单链表实现具体例子_Python实现数据结构线性链表(单链表)算法示例

    本文实例讲述了Python实现数据结构线性链表(单链表)算法.分享给大家供大家参考,具体如下: 初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码. #!/usr/bin ...

  2. 「数据结构 | 链表」单链表、双向链表节点操作演示动画

    目录 1. 什么是链表 2. 链表数据结构 2.1 单链表数据结构(Java) 2.2 双向链表数据结构(Java) 3. 单链表操作动画 3.1 新增节点 3.2 删除节点 4. 双向链表操作动画 ...

  3. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  4. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  5. 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

    一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...

  6. 数据结构之——《单链表》

    数据结构之--<单链表> 1.链表概念 2.链表分类 3.接口函数实现 1.链表概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现. ...

  7. 数据结构精讲——单链表

    新手必会数据结构精讲--单链表 链表的介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 . 实际中链表的结构非常多样,以下情况组合起来就 ...

  8. 数据结构5: 链表(单链表)的基本操作及C语言实现

    逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储. 由于分散存储,为了能够体现出数据元素之间的逻辑关 ...

  9. 【数据结构|链表】单链表基本操作

    文章目录 一.链表 二.链表分类 三.单链表基本操作   3.1 单链表存储结构Init   3.2 遍历链表visitlist函数   3.3 求表长length   3.4 查找listfind ...

  10. 【数据结构-C】单链表基本操作及图解分析

    目录 单链表介绍​ 单链表基本操作及图解分析 1.创建一个新结点 2.头插法向单链表中插入结点​ 3. 尾插法向单链表中插入结点​ 4.头删法删除单链表结点​ 5.尾删法删除单链表结点​ 6.返回单链 ...

最新文章

  1. [03] 处理注解:反射
  2. 惊呆了!B 站公告低级错误,将公司名写成“百度”
  3. 利用PHP的Popen实现RRDTOOL作图的动态输出
  4. 实现延时任务的 4 种实现方案!
  5. 成功解决YOLOv3测试——could not create cudnn handle: CUDNN_STATUS_NOT_INITIALIZE作记录
  6. apache hadoop_春天遇见Apache Hadoop
  7. C51单片机——指令系统
  8. java php quercus,php中Quercus框架的安装
  9. 进程调度算法-先来先服务、最短作业优先调度算法和高响应比优先调度算法
  10. MODIS数据快速下载方法
  11. Windows读取NXP MiFare Ultralight C类型NFC卡片的信息
  12. pythonsorted函数cmp_python3中sorted函数里cmp参数改变详解
  13. android自动秒杀脚本,京东自动秒杀脚本手机版-京东自动秒杀脚本安卓版下载v7.0.4 - 7230手游网...
  14. 计算机不显示验证码,浏览器中网页验证码不显示的原因与解决办法
  15. 转载:性格与健康(刘善人)之二
  16. 浅谈数字媒体艺术中的技术应用-3-工具介绍(二)
  17. 怎么把文件发给商家打印?如何给商家发送需打印的文件
  18. WWW相关概念的学习
  19. OpenCV——KAZE、AKAZE特征检测、匹配与对象查找
  20. 2018年 团体程序设计天梯赛——题解集

热门文章

  1. 技本功丨知否知否,Redux源码竟如此意味深长(下集)
  2. 实现一个简单的Tomcat
  3. LeetCode 410——分割数组的最大值
  4. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述
  5. Redis--keys的通用操作
  6. Yii2系列教程三:Database And Gii
  7. Lync server 2010 发布拓扑错误0x80070005
  8. hadoop中job.setOutputFormatClass(PartitionByCoun...
  9. android 键盘 能复制,android – 从EditText中禁用软键盘,但仍允许复制/粘贴?
  10. c语言中的素数定理,素数定理