7-数据结构-(带头节点)单链表的增删改查
问题:
单链表带头结点的创建以及输出,以及带与不带头节点的区别
思路:
- 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。
- 带头节点是为了使在空表时的操作更统一。如果不带头节点,空表插入时,直接让头指针,和第一节点指针相等即可。而非空表插入时,则时s->next=l->next;l->next=s;头插,两个操作。而带上头节点,所有情况下的插入操作,都同意了即都为s->next=l->next;l->next=s。
- 值得注意的是,带头节点的单链表,遍历输出时,记得从第二哥结点开始遍历,即让结点指针=头指针的指针域。即snode*s =l->next;
- 在指针改变实际值时,C语言中,要么来哥双指针,要么正常一维指针,最后返回头指针,主函数内接收即可。我觉得为了好理解,就用返回这个吧,整那么花里胡哨,也挺乱的。嗯
头插法:
//创建带头节点的单链表
snode* sheadlist(linklist l,int n)
{snode *phead=l; phead=(snode*)malloc(sizeof(snode));//创建头节点 phead->next=NULL; int i=0,x=n,k=0;printf("请输入想要插入的值\n");for(i=0;i<x;i++){printf("输入第%d个值\n",i+1);scanf("%d",&k);snode *p=(snode*)malloc(sizeof(snode));p->data=k;p->next=phead->next;phead->next=p;}return phead;
}
尾插法:
//创建带头结点尾插法
linklist srearlist(linklist l,int x)
{snode* phead=l;//创建头节点phead=(linklist)malloc(sizeof(snode));//用头结点创造空间,指针l没有创建,因此返回的时候返回头节点 才能获取整个单链表地址 phead->next=NULL;int i,k;snode *end=phead;//工作指针,从头节点开始工作 printf("请输入值\n");for(i=0;i<x;i++){scanf("%d",&k);snode *p=(snode*)malloc(sizeof(snode));//创建新结点,用来尾插进单链表 p->data=k;end->next=p;//直接给新结点连接起来 end=p; //因为尾插,所以要时刻知道最后一个结点的位置,因此s指针也跑到新加入的结点p上面. }end->next=NULL; return phead;//头节点始终指向整个单链表,因此返回头节点地址,用来获取整个字符串
}
按位查找,返回结点:
//返回第i个结点指针
snode* Searchnode(snode* phead,int i)
{int count=1;//从有序数据,数组第一个开始计算snode* p=phead->next;if(i==0) return phead;//返回头节点if(i<0) return NULL; //无效值while(p!=NULL && count != i) //进行遍历,每一次进行比对,每次遍历指针后移{p=p->next;count++;}return p;
}
按值查找,返回位置:(根据不同的情况需求在while判断条件那里改变条件,进而求得想要的位置即可)
//按值查找,查找比x大的,并返回应插入的位置
int Search_zhinode(snode* phead,int x)
{snode* p=phead->next;int count=1;while(x>p->data){p=p->next;count++;}return count;
}
在某个位置插入一个结点:(按位查找的妙用:
(用按位查找找到第i-1个结点,通过这个结点,进行操作))
//在某个位置插入一个结点
snode* SInsert(snode* phead,int pos,int x)
{if(pos<1 || pos>SLength(phead)) return NULL;//进行插入操作snode* p=(snode*)malloc(sizeof(snode));p->data=x;//获取第pos-1个位置上的结点,在它后面插入 snode* ppre=Search_weinode(phead,pos-1);p->next=ppre->next;ppre->next=p;return phead;
}
计算带头结点单链表长度:
//计算单链表长度
int SLenth(snode* phead)
{if(phead==NULL) return 0;int count=1;snode* p =phead->next;//从有效数据第一个开始 while(p->next!=NULL){p=p->next;count++;}return count;}
删除第i个结点:(用按位查找找到第i-1个结点,通过这个结点,进行操作)
//删除第i个结点
snode* SDelete(snode* phead,int i,int *x)
{if(i<1 || i>SLenth(phead)) return NULL;snode* p =Search_weinode(phead,i-1);snode* q=p->next;*x=q->data;p->next=q->next;free(q);return phead;
}
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//创建带头结点单链表
typedef struct snode
{int data;struct snode *next;
}snode,*linklist;
//创建带头节点的单链表
snode* sheadlist(linklist l,int n)
{snode *phead=l; phead=(snode*)malloc(sizeof(snode));//创建头节点 phead->next=NULL; int i=0,x=n,k=0;printf("请输入想要插入的值\n");for(i=0;i<x;i++){printf("输入第%d个值\n",i+1);scanf("%d",&k);snode *p=(snode*)malloc(sizeof(snode));p->data=k;p->next=phead->next;phead->next=p;}return phead;
} //创建带头结点尾插法
linklist srearlist(linklist l,int x)
{snode* phead=l;//创建头节点phead=(linklist)malloc(sizeof(snode));//用头结点创造空间,指针l没有创建,因此返回的时候返回头节点 才能获取整个单链表地址 phead->next=NULL;int i,k;snode *end=phead;//工作指针,从头节点开始工作 printf("请输入值\n");for(i=0;i<x;i++){scanf("%d",&k);snode *p=(snode*)malloc(sizeof(snode));//创建新结点,用来尾插进单链表 p->data=k;end->next=p;//直接给新结点连接起来 end=end->next; //因为尾插,所以要时刻知道最后一个结点的位置,因此s指针也跑到新加入的结点p上面. }end->next=NULL; return phead;//头节点始终指向整个单链表,因此返回头节点地址,用来获取整个字符串
}
//返回第i个结点指针
snode* Search_weinode(snode* phead,int i)
{int count=1;snode* p=phead->next;//从头节点的后继节点开始遍历 if(i==0) return phead;if(i<0) return NULL;//遍历,当值小于查找值时,一直遍历,直到相等,count停止增加,此时便时所找位置处的结点,返回即可, while(p!=NULL && count != i){p=p->next;count++;}return p;
}
//按值查找,查找比x大的,并返回应插入的位置
int Search_zhinode(snode* phead,int x)
{//默认单链表单调递增,因此从头遍历的话,看谁比x大,便找到了,主要画图清楚 snode* p=phead->next;int count=1;while(x>p->data){p=p->next;count++;}return count;
} void slprintf(snode *s)
{if(s==NULL) return NULL; //空表 情况 snode *scan = s->next;//因为带头结点第一个结点为头节点,所以打印从第二个结点打印,因此这里需要注意 while(scan != NULL) {printf("%d->",scan->data);scan = scan->next;} printf("NULL\n");
}
//在某个位置插入一个结点
snode* SInsert(snode* phead,int pos,int x)
{//进行插入操作//创建需要插入的结点,给结点赋值 snode* p=(snode*)malloc(sizeof(snode));p->data=x;//获取第pos-1个位置上的结点,在它后面插入 snode* ppre=Search_weinode(phead,pos-1);//进行插入操作 p->next=ppre->next;ppre->next=p;return phead;
}
//计算单链表长度
int SLenth(snode* phead)
{if(phead==NULL) return 0;int count=1;snode* p =phead->next;//从有效数据第一个开始 while(p->next!=NULL){p=p->next;count++;}return count;}
//删除第i个结点
snode* SDelete(snode* phead,int i,int *x)
{//判断插入合法性 if(i<1 || i>SLenth(phead)) return NULL;//找到删除结点的前驱结点 snode* p =Search_weinode(phead,i-1);//用按位查找,找到后返回前驱结点 //给q删除,因此先让q指针指向删除结点,取出值,随后p的指针域指向q的后继节点,最后给q释放。 snode* q=p->next;*x=q->data;//删除操作 p->next=q->next;free(q);return phead;
}int main()
{//创建头节点 snode* phead;
// phead=sheadlist(&phead,3);//尾插法建立带头节点单链表 phead=srearlist(phead,5); //打印单链表 slprintf(phead);
// snode *p=Searchnode(phead,2);//在有序的列表里面(默认有序),插入数值4,单链表仍有序 int pos=Search_zhinode(phead,4);printf("pos=%d\n",pos);//找到需要插入的位置后,进行在pos处的插入操作——即找到pos的前驱结点,之后进行插入 phead=SInsert(phead,pos,4);slprintf(phead);//计算单链表的长度 int len=SLenth(phead);printf("单链表长度为%d\n",len);//删除第4个结点,并返回删除结点的数值 int x=0;phead=SDelete(phead,4,&x);//因为需要给删除数值带回来,所以给x的地址传过去 printf("删除了%d\n",x);slprintf(phead);return 0;}
相关文章:
7-数据结构-(带头节点)单链表的增删改查
问题: 单链表带头结点的创建以及输出,以及带与不带头节点的区别 思路: 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。带头节点是为…...
每天一道leetcode:剑指 Offer 53 - II. 0~n-1中缺失的数字(适合初学者二分查找)
今日份题目: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例1 输入: [0,1,3] 输出: 2 示例2 …...
玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包
目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包,当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…...
配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】——“cpolar内网穿透”
配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 创建一条固定数据隧道2. 找到“保留二级子域名”栏位3. 重新编辑之前建立的临时数据隧道4. 进入“在线隧道列表”页面5. 在其他浏览器访问…...
【枚举】CF1706 C
有人一道1400写了一个小时 Problem - C - Codeforces 题意: 思路: 首先先去观察样例: 很显然,对于n是奇数的情况,只有一种情况,直接操作偶数位就好了 主要是没搞清楚n是偶数的情况 其实有个小技巧&…...
uniapp-疫情应急管理系统学生端
1 疫情资讯展示 <template><view class"container"><uni-section title"自定义卡片内容" type"line"><uni-card title"基础卡片" class"card-box" v-for"(item,index) in epidemicNewsList"…...
FreeRTOS的线程间通信
一、分类 FreeRTOS的线程间通信分为这几大类 由于我还在学习中,目前显从信号开始记录学习 二、逐块讲解 1、信号(osSignalWait osSignalSet) FreeRTOS从V8.2.0版本开始提供任务通知这个功能,每个任务多有一个32位的通知值&am…...
Linux内存管理工作原理:
Linux使用虚拟内存和内存映射来管理内存。每个进程都有独立的虚拟地址空间,通过将虚拟地址映射到物理内存,实现对内存的管理和访问。 虚拟地址空间划分:32位系统中,内核空间占1GB,用户空间占3GB;64位系统中…...
【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架
并发,数据同步往往是业务开发中比较重要的部分。 shenyu网关数据同步设计方案图 shenyu官网给出的同步设计方案图如下: 基于事件异步并发框架com.lmax.disruptor 下载下示例代码,跑起来发现,在shenyuAdmin模块里面用到了com.lma…...
Nginx(2)
目录 1.安装Nginx1.yum安装2.编译安装3.Nginx命令 2.配置文件详解 1.安装Nginx 1.yum安装 [rootdocker ~]# yum -y install nginx通过 rpm -ql nginx 查看安装信息 2.编译安装 2.1安装所需要的依赖 yum install -y gcc gcc-c make libtool wget pcre pcre-devel zlib zlib-…...
二维数组的鞍点
描述 给定一个二维数组,找出其中的鞍点。若存在鞍点,则输出其位置;否则输出“NO”。 鞍点的定义:在一个矩阵的行和列中,某个元素是所在行的最大值,而同列中又是最小值。 输入 输入包含多行,…...
go 内置函数copy()
go内置函数copy go 内置函数copy()函数说明:代码例子1:代码例子2:代码例子3: go 内置函数copy() 函数说明: 当我们在Go语言中需要将一个切片的内容复制到另一个切片时,可以使用内置的copy()函数。copy()函…...
Spring简述
Sping是什么Spring主要模块IOCDI依赖注入的三种方式 AOP术语 Sping是什么 Spring是一个轻量级的开源框架,主要作用是为了简化开发,它以IOC(控制反转)和AOP(面向切面编程)为内核 Spring主要模块 我们一般…...
框框大学之——教育技术学
清一色劝退的教育技术学。。。。。。 https://www.kkdaxue.com/?current1&major%E6%95%99%E8%82%B2%E6%8A%80%E6%9C%AF%E5%AD%A6&pageSize10&sortFieldcreateTime&sortOrderdescend 总结: 1 杂而不经 2 摆烂劝退居多 3 适合躺平 4 考公不行 5 要多…...
Android中的Apk 包体优化
Android中的Apk 包体优化 在Android中,APK包体优化指的是减小应用程序的安装包大小,以降低用户下载和安装应用的成本,提高用户体验。APK包体优化对于应用的性能、启动速度和用户留存率都有着重要的影响。下面展开说说一些常见的APK包体优化策…...
Java基础接口详解
Java基础接口详解 文末附上下载详解pdf链接 实现java代码中接口详细分析 Java基础接口是一种定义了一组方法签名但没有提供实际实现的抽象类似的结构。它们允许类通过实现接口来声明自己拥有某些特定的行为。接口在Java中扮演了重要的角色,以下是一些关键点…...
CCL 2023 电信网络诈骗案件分类评测-第一名方案
1 任务内容 1.1 任务背景 2022年12月1日起,新出台的《反电信网络诈骗犯罪法》正式施行,表明了我国治理当前电信网络诈骗乱象的决心。诈骗案件分类问题是打击电信网路诈骗犯罪过程中的关键一环,根据不同的诈骗方式、手法等将其分类ÿ…...
go test
关于go test 报错 command-line-arguments go test 直接调用被测试go文件方法时候报错 command-line-arguments [command-line-arguments.test],这里已经明确指出了命令参数问题 PS E:\code\mqtt> go test .\client_test.go # command-line-arguments [comma…...
401 · 排序矩阵中的从小到大第k个数
链接:LintCode 炼码 - ChatGPT!更高效的学习体验! 题解: 九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param matrix: a matrix of intege…...
进程什么时候会进入阻塞状态
等待I/O操作:当进程需要进行输入/输出操作,但是所需的数据还没有准备好或者输出设备还没有空闲时,进程会进入阻塞状态,等待I/O操作完成。 等待资源:当进程需要访问共享资源,但是该资源已经被其他进程占用时…...
终极指南:AngularJS UI-Router 路由历史管理与导航栈实现详解
终极指南:AngularJS UI-Router 路由历史管理与导航栈实现详解 【免费下载链接】ui-router The de-facto solution to flexible routing with nested views in AngularJS 项目地址: https://gitcode.com/gh_mirrors/ui/ui-router AngularJS UI-Router 是 Angu…...
LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal 题解
LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal 题解 题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请构造二叉树并返回其根节点。 示例…...
Net Insight推出可编程视频制作网络解决方案
随着实时媒体工作流程在设施、合作伙伴网络和云环境之间日益分布化,技术进步正在运营域之间创建可编程的分界点。基于这一动态趋势,Net Insight推出了可编程信任边界技术,使实时媒体互连在设施、网络和云环境之间传输时变得可预测。解释此次发…...
React Native 项目重构利器:使用 react-native-rename 快速迁移应用品牌
React Native 项目重构利器:使用 react-native-rename 快速迁移应用品牌 【免费下载链接】react-native-rename Rename react-native app with just one command 项目地址: https://gitcode.com/gh_mirrors/re/react-native-rename react-native-rename 是一…...
seo网站诊断需要哪些资料_seo网站诊断的重要性是什么
SEO网站诊断需要哪些资料 网站的关键字分析资料 关键字分析是SEO网站诊断中的核心部分之一。你需要收集关于网站当前使用的关键字的数据,包括关键字的搜索量、竞争程度、点击率和转化率等信息。可以使用工具如Google关键字规划师、Ahrefs或SEMrush来获取这些数据。…...
大模型学习指南:小白程序员必备,收藏这份2026年开源大模型体系与实战教程!
大模型学习指南:小白程序员必备,收藏这份2026年开源大模型体系与实战教程! 本文全面介绍了2026年主流开源大模型体系(如Llama、Qwen、Mistral等),解析了Prefix Decoder、Causal Decoder、Encoder-Decoder的…...
终极指南:3步永久解密科学文库PDF文档,告别7天访问限制
终极指南:3步永久解密科学文库PDF文档,告别7天访问限制 【免费下载链接】ScienceDecrypting 破解CAJViewer带有效期的文档,支持破解科学文库、标准全文数据库下载的文档。无损破解,保留文字和目录,解除有效期限制。 …...
Qwen2.5-72B-Instruct-GPTQ-Int4惊艳效果:多语言混合输入+统一语义理解测试
Qwen2.5-72B-Instruct-GPTQ-Int4惊艳效果:多语言混合输入统一语义理解测试 1. 模型概述 Qwen2.5-72B-Instruct-GPTQ-Int4是Qwen大型语言模型系列的最新版本,代表了当前开源大模型领域的顶尖水平。这个经过GPTQ 4-bit量化的720亿参数指令调优模型&#…...
利用快马平台五分钟搭建openmaic网页版图像描述演示原型
最近在调研多模态AI框架时,发现OpenMAIC这个开源项目很有意思。它整合了视觉理解和文本生成能力,特别适合做图像描述这类应用。不过对于想快速验证效果的新手来说,本地部署整套环境还是有点门槛。正好发现InsCode(快马)平台能极速搭建演示原型…...
Promise/A+ 规范:引用不可变 + 核心术语(对象 / 函数)详解
Promise/A 规范:引用不可变 核心术语(对象 / 函数)详解 文章目录Promise/A 规范:引用不可变 核心术语(对象 / 函数)详解前言一、“引用不可变” 是什么意思?二、为什么要强调 “引用不可变”&…...
