不带头结点的链表基础操作(初始化,增删改查)

链表是什么?

**链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。**

链表基础操作

首先我们要想,一个结点里面要有什么?
一个是数据域,第二个是指针域,指向下一个结点,所以我们用一个结构体来包括一个结点所需要的这些内容。
这是链表中的一个结点的内容
在这里插入图片描述
SListDataType这个类型,是用户自定义类型,可以是int ,double,char,还可以是一个结构体类型。
在这里插入图片描述
而这个结构体里,就是链表的创建,里面是第一个结点的指针。
在这里插入图片描述
初始化,首先传一个链表的结构体指针,第一步判断指针是否为空,此处用断言判断,第二步初始化,给第一结点指空。
在这里插入图片描述
头插,时间复杂度为O(1),传进来连边的结构体指针,和要给结点里附的值。

	一 创建新结点。二新的结点里的数据域里附传进来的值三新建结点的指针域指向第一个结点四第一个结点指向新建结点,让新建结点作为新的链表的第一个结点

在这里插入图片描述
尾插,有循环,O(n)

一,创建新结点,新结点数据域赋值,新结点指针域指控。
二,判断链表是否为空,如果为空,把让链表的第一个结点指针指向新建的结点。
三,找最后一个结点,隐藏着链表一定有结点,创建一个新指针指向链表第一个结点,当指针不为空时,指针往后移。循环结束后,最后一个结点的指针域指向新建结点

在这里插入图片描述
头删

一,首先判断,如果没有链表,没有结点不能删。
二 新建指针指向第一个结点的下一个结点.
三 释放第一个结点。
四 第一个结点指向新建指针。

在这里插入图片描述
尾删 O(n)

一,首先判断第一个结点 assert(s != NULL);			// 不能没有链表assert(s->first != NULL);      不能没有结点二,如果链表中只有一个结点,直接释放三,否则,创建新指针指向头结点,**当下下一个结点不为空,指针指向下一个。释放下一个结点**,最后指空

在这里插入图片描述
查找

一 遍历链表,找到数据域里的值相同时,返回。

在这里插入图片描述
删除多个值相同的结点

一判断是否为空
二 判断是否只为一个结点
三 创建新指针cur指向第一个结点,当该结点下一个不为空时,如果结点下一个的数据域里的值等于要删的值,创建新指针指向下下一个结点
四 然后释放当前结点,并让cur指向下一个结点。

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

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

相关文章

链表面试题1:反转单链表,不带头结点。

三个指针p1,p2,p3,p1指向头结点的前一个结点,也就时指空,p2指向头结点,p3指向头结点下一个结点。 p3指向p2的下一个,让p2指针域指向p1,让p1挪到p2上,再让p2指向p3.

链表面试题2:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

我们可以,用两个新链表,一个存比基准值大的,另一个存比基准值小的。然后再拼接在一起。 用尾插的方法,首先说小的,创建两个指针,一个头,一个尾,再创建个指针跑链表,扫描…

栈和队列的基本操作(栈和队列的区别)

数据结构中的栈与内存中的栈的不同 一、数据结构中的堆栈 在数据结构中的堆栈,实际上堆栈是两种数据结构:堆和栈。堆和栈都是一种数据项按序排列的数据结构。 1.栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧,它是一种具有后进先…

链表面试题3:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成 的。

链表面试题3:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成 的。 首先我们的思想是将得一个链表和第二个链表的每个结点进行比较,谁小谁就插入到新链表的最后。 首先我们要判段链表是否为空,…

双向链表的操作(创建,插入,删除)

双向链表的代码看似复杂,其实很简单,只要画图便可明白, 删除 假如要删除的结点叫pos. pos->prev->nextpos->next; pos->next->prevpos->prev; free(pos);

二叉树的操作(前,中,后序遍历也叫深度优先遍历,非空结点的个数)递归实现

定义一个二叉树的结点 二叉树的前序遍历, 先访问根结点,再访问左,再访问右。 每次访问都要先看根结点是否为空,然后打印根结点,把此时根结点的左结点作为下一次递归的根结点,当把左结点遍历完后&#xff0…

二叉树的相关题(叶子结点个数,最大深度,找特殊值结点(值不重复),判断两个树是否相同,判断两个数是否为镜像树,是否为子树,)

叶子结点就是没有孩子结点,所以当当前根结点没有孩子结点的时候,就返回1,就是找到一个叶子结点,然后访问完每个不为空的结点就行,每次访问都是把当前结点的左/右结点作为新的结点,来判断。 求最大深度&…

为何线程有PID?

在linux下用 top -H -p <pid> 查询某个进程的线程 按理说&#xff0c;都是某个进程下的线程&#xff0c; 应该进程id PID一样啊&#xff0c;但实际却都不一样 实际是被PID的名字给弄混了&#xff0c;线程进程都会有自己的ID&#xff0c;这个ID就叫做PID&#xff0c;P…

用c语言构建二叉树(重点)

结点创建 二叉树创建 我们以‘#’为NULL&#xff0c;我们要把输入进来的一个字符串转变为二叉树&#xff0c;所以我们要记住递归的每一步走到数组了哪个位置 所以我们要记住创建过程中用掉的前序个数&#xff0c;并返回&#xff0c;除此之外&#xff0c;还要加上当时的那个结点…

二叉树的广度优先遍历(层序遍历)

先定义一个二叉树的结点 再创建二叉树&#xff0c;这里就不写了&#xff0c;之前的有创建二叉树的博客。 层序遍历 用到栈的思想&#xff0c; 1 先让根 节点进队列&#xff0c;2 然后读队顶元素&#xff0c;3 让他出队列4 打印它的值5 让队顶元素的左右子树进栈&#xff0…

用前序中序创建二叉树(用中序后序创建二叉树)

定义二叉树结点 比如就拿这个二叉树 前序中序创建 因为前序遍历的顺序是 根 &#xff0c; 左 &#xff0c;右。 中序的遍历是 左 根 右。 我们会很不好想&#xff0c;但我们可以用前序和中序把上面那个二叉树的遍历一边 前序遍历&#xff1a;ABDEHCFG中序遍历&#xff1a;D…

Epoll详解及源码分析

文章来源&#xff1a;http://blog.csdn.net/chen19870707/article/details/42525887 Author&#xff1a;Echo Chen&#xff08;陈斌&#xff09; Email&#xff1a;chenb19870707gmail.com Blog&#xff1a;Blog.csdn.net/chen19870707 Date&#xff1a;Jan.7th, 2015 1…

非递归实现二叉树(前序,中序,后序)c/c++实现

这里还是用到栈的思想&#xff0c;为了方便用了c的一些内容&#xff0c;把出栈&#xff0c;进栈&#xff0c;读栈顶元素用一个个函数封装起来了&#xff0c;前面做了一些处理来使用这些函数。 前序非递归 思想&#xff1a;一直走左边&#xff0c;依次进栈。等左边为空的时候&…

Linux 中统计一个进程的线程数

如果你想看到 Linux 中每个进程的线程数&#xff0c;有以下几种方法可以做到这一点。 方法一: /proc proc 伪文件系统&#xff0c;它驻留在 /proc 目录&#xff0c;这是最简单的方法来查看任何活动进程的线程数。 /proc 目录以可读文本文件形式输出&#xff0c;提供现有进程和系…

Linux_linux基础命令(增删查,权限,Linux下的重要目录,重要命令(. du, df, top, free, pstack, su, sudo).安装gcc/g++, gdb, vim )

r&#xff1a;表示可读w&#xff1a;表示可写x&#xff1a;表示可执行也可以用数字表示这一点我们会在修改文件权限说明。对于文件夹的rwx表示&#xff1a;r表示可读及可以查看文件夹内容可以ls查看w表示可写及可以向文件夹中传送内容如文件x表示可执行及可以向文件夹中可以cd进…

Linux_linux常用工具之make/makefile详解

make/makefile make/makefile: 项目自动化构建工具 makefile:普通文本文件&#xff0c;记录了项目的构建流程规则。 make: 一个解释程序&#xff0c;到当前执行make命令的目录下寻找makefile文件&#xff0c;并且对makefile 中记录的项目构建规则进行解释执行。makefile: 编写…

Linux_linux常用工具(git,vim ,gcc ,gdb,权限)超详解

git :项目版本控制工具 项目克隆&#xff1a;git clone项目提交&#xff1a;git add&#xff08;本地仓库提交&#xff09; git commit -m “bak msg”&#xff08;-m 备注信息&#xff09;同步到服务器&#xff1a;git push origin master&#xff08;提交到主分支&…

Linux_linux常用工具------进度条程序

缓冲区对文件读写的影响&#xff1a;数据并没有直接写入文件&#xff0c;而是写入到缓冲区&#xff08;内存&#xff09;中&#xff0c;等到缓冲区中数据写满或者刷新缓冲区的时候&#xff0c;才会将数据真正的写入文件 fflush&#xff08;stdout&#xff09;刷新。 回车与换行…

Ubuntu下QT的安装详细教程

本文转自&#xff1a;http://blog.chinaunix.net/uid-7945126-id-4987195.html 经测试完美解决 ------------------------------------------------------------- 最近需要在Ubuntu下开发桌面软件&#xff0c;想起了QT。书上介绍的方法太老了&#xff0c;网上找了一大堆安装方法…

Linux_linux常用工具---闲杂篇(除了vim, 还有哪些常用的牛逼的编辑器, 并能够横向对比编辑器之间的区别和优缺点.)

vim自行查找资料, 自行配置插件. 借鉴别人的 " 显示相关 “”""""""""""""""""""""""""""""""""&…