0723 单项链表

Part 1.完成单向链表,并完成下面功能

1.单链表节点创建

链表是物理空间上不连续的一个结构,需要创建一个next作为指向下一个节点的指针,所以需要建立一个结构体包含数据域,next指针域,记录长度的数据域。因为长度只有头节点可以储存,所以需要建立一个联合体,head访问len,普通节点访问data。

typedef struct Node
{//结构体嵌套共用体union{//普通节点数据域datatype data;//头结点数据域:链表长度int len;};//指针域struct Node *next;
}*linklist;linklist create_node(int flag)
{linklist s = (linklist)malloc(sizeof(struct Node));if(NULL == s){return NULL;}if(flag == 1)//头节点s->len = 0;else if(flag == 0)//普通节点s->data = 0;s->next = NULL;return s;
}

2.单链表的头插

链表的插入需要检查链表是否创建完成,因为每个节点空间不连续,所以得单独创建。

头插只需要将需要插入的数据的next指向原第一个节点,再将头节点的next指向新节点即可。

int head_insert(linklist head,datatype element)
{if(NULL == head)//检查链表是否创建完成return Faulse;linklist s = create_node(0);//创建普通数据节点if(NULL == s)return Faulse;s->data = element;s->next = head->next;head->next = s;head->len++;return Success;
}

3.单链表头删

需要将头节点指向第二个节点(p->next->next)即可,然后释放p->第一个节点

int head_delete(linklist head)
{if(NULL == head || head->len == 0)return Faulse;linklist del = head->next;head->next = del->next;free(del);del = NULL;head->len--;return Success;
}

4.单链表的尾插

因为链表的最后一个节点都是指向NULL,所以只需要循环寻找最后一个节点,然后将最后一个节点指向新节点,新节点指向NULL即可

int rear_insert(linklist head,datatype element)
{if(NULL == head)return Faulse;linklist s = create_node(0);if(NULL == s)return Faulse;s->data = element;linklist p = head;while(p->next != NULL)//循环寻找原最后节点p=p->next;p->next = s;head->len++;return Success;
}

5.单链表遍历

只需要循环输出p->data(数据域),然后p = p->next往下一个节点即可完成循环输出遍历

int output(linklist head)
{if(NULL == head)return Faulse;linklist p = head->next;while(p != NULL){printf("%d\t",p->data);p=p->next;}printf("\n");
}

6.单链表按位置查找

需要判断给的值是否大于长度,然后循环从0到输入的位置,进行p=p->next下移,然后输出即可

int position_select(linklist head,int position)
{if(NULL == head || position > head->len+1 || position < 1)return Faulse;linklist p = head;for(int i = 0; i < position; i++)p = p->next;printf("%d个位置是:%d\n",position,p->data);return Success;
}

7.单链表按位置删除

和按位置查找一样,然后循环从0到输入的位置,进行p=p->next下移,然后使用尾删即可。

int position_delete(linklist head,int position)
{if(NULL == head || position > head->len+1 || position < 1)return Faulse;linklist p = head;for(int i = 0; i < position-1; i++)p=p->next;linklist del = p->next;p->next = del->next;free(del);head->len--;return Success;
}

8.单链表按位置修改

和按位置查找一样,然后循环从0到输入的位置,进行p=p->next下移,然后修改p->data修改数据域即可。

int position_change(linklist head,int position,datatype element)
{if(NULL == head || position > head->len+1 || position < 1)return Faulse;linklist p = head;for(int i = 0; i < position; i++)p = p->next;p->data = element;return Success;
}

9.单链表按元素查找

通过for循环,从第一个节点到最后一个节点进行和输入值对比,在每次循环记得将p下移,找到输入值的时候,输出i即可,既是第i个节点。

int element_select(linklist head,datatype element)
{if(NULL == head)return Faulse;linklist p = head;for(int i = 1; i <= head->len; i++){p = p->next;if(p->data == element)return i;else if(i == head->len+1)printf("没有这个数\n");}
}

10.单链表按元素修改

和按元素查找相似,从第一个节点到最后一个节点进行和输入值对比,然后找到后,将data数据域修改即可。

int element_change(linklist head,datatype element,datatype changeelement)
{if(NULL == head)return Faulse;linklist p = head;for(int i = 1; i <= head->len; i++){p = p->next;if(p->data == element)		p->data = changeelement;		else if(i == head->len+1)printf("没有这个数\n");}return Success;
}

11.单链表按元素删除

可以直接在函数里调用元素寻找函数,将返回的地址值,然后赋给按位置删除函数,删除即可。

int element_delete(linklist head,datatype element)
{if(NULL == head)return Faulse;int i = element_select(head,element);position_delete(head,i);return Success;
}

12.单链表逆置

int reverse(linklist head)
{if(NULL == head)return Faulse;linklist p = head->next;head->next = NULL;for(int i = 0; i < head->len; i++){linklist temp = p;p = p->next;temp->next = head->next;head->next = temp;}return Success;
}

13.单链表排序

运用了冒泡排序的基础模板,只不过内部的交换变成了节点之间的互相连接。交换原理是:1.定义一个s指向p->next(记录第二个节点)

2.p就能指向p->next->next(第一个节点指向第三个节点)

3.s->next = p(将第二个节点指向第一个节点)

4.p的上一个节点需要指向第二个节点

按上面四步可以完成交换值,但是因为单项链表没办法调用上一个节点,所以需要定义p(原上一个节点),p->next(原p节点),s = p->next->next(原第二个节点),即每个节点往前移一个节点进行提前比较,换值即可。然后在每次换之后将p往下移(p = p->next)即可(因为链表没使用到循环的i和j,所以步长需要自己增加)。

int sort(linklist head)
{if(NULL == head || head->len <= 1)return Faulse;linklist p = head;printf("%d\n",head->len);for(int i = 1; i < head->len; i++){p = head;for(int j = 0; j < head->len-i; j++){if(p->next->data > p->next->next->data){linklist s = p->next->next;//交换p->next->next = s->next;s->next = p->next;p->next = s;p = p->next;//步增}elsep = p->next;}}return Success;
}

14.单链表查找倒数第n个节点

寻找倒数第n个值,需要定义两个指针,指针之间相差n个节点距离,然后两个一起后移,当后面一个指针到末尾了,前一个指针就指向倒数第n个值了

int rearnum_select(linklist head,int num)
{	if(NULL == head)return Faulse;linklist p = head;linklist q = head;for(int i = 0; i < num; i++)//令两个指针相隔n{q = q->next;}while(q != NULL)//一起后移,到底输出前一个指针{p = p->next;q = q->next;}printf("倒数第%d个数是:%d\n",num,p->data);
}

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

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

相关文章

基于 ASP.NET Web 应用程序(.NET Framework)的花店系统

1.1功能模块实现1.1.1整体结构界面由两部分组成&#xff1a;左侧导航栏、右侧内容展示区。使用了 Bootstrap 5 的样式库&#xff0c;并结合了 ASP.NET MVC 的 Html.ActionLink 和 Razor 条件判断语句来动态生成菜单项。1.1.2导航栏功能模块导航栏基础结构导航栏基础结构使用 Bo…

C++ Qt6 CMake qml文件启动方式说明

在Qt6之后,Qt程序默认使用CMake进行构建,当然也可以使用qmake, 本篇博客介绍Qt6.8之前和Qt6.8版本中QtQuick程序的启动方式。 在QtQuick程序main.cpp里qml的文件启动分为两种:(1)直接加载qml文件,(2)加载qml模块,下面分别介绍这两种启动方式。 方式1:直接启动qml文…

字符串 “asdasjkfkasgfgshaahsfaf” 经过哈夫曼编码之后存储比特数是多少?

要计算字符串 “asdasjkfkasgfgshaahsfaf” 经过哈夫曼编码后的存储比特数&#xff0c;需按以下步骤进行&#xff1a;步骤 1&#xff1a;统计字符出现频率先统计字符串中每个字符的出现次数&#xff1a;a&#xff1a;出现 6 次s&#xff1a;出现 6 次d&#xff1a;出现 1 次j&a…

什么是游戏盾(高防版)?

随着网络游戏产业的快速发展&#xff0c;游戏服务器的安全问题日益受到关注。DDoS攻击、CC攻击等网络威胁常常导致游戏卡顿、断线甚至服务器宕机&#xff0c;严重影响玩家体验。游戏盾&#xff08;高防版&#xff09;是一种专为游戏业务设计的网络安全防护服务&#xff0c;集成…

openGauss数据库在CentOS 7 中的单机部署与配置

部署 版本选择 通过openGuass官网下载地址 &#xff0c;我们可以看到它支持x86_64与Aarch64两种平台&#xff0c;又分成openEuler 22、openEuler 20、Centos 7以及Docker 版本。 进入CentOS 7标签&#xff0c;看到又分成企业版、轻量版、极简版与分布式镜像版。 本文只讨论…

HTTP响应状态码详解

HTTP 响应状态码&#xff08;HTTP Status Code&#xff09;是服务器在响应客户端请求时返回的 3 位数字代码&#xff0c;用于表示请求的处理状态。以下是常见的 HTTP 状态码及其含义&#xff1a; 1xx&#xff08;信息性状态码&#xff09; 表示请求已被接收&#xff0c;需要继…

Pytorch中register_buffer和torch.nn.Parameter的异同

说下register_buffer和Parameter的异同 相同点方面描述追踪都会被加入 state_dict&#xff08;模型保存时会保存下来&#xff09;。与 Module 的绑定都会随着模型移动到 cuda / cpu / float() 等而自动迁移。都是 nn.Module 的一部分都可以通过模块属性访问&#xff0c;如 self…

吉吉巳资源整站源码完整打包,适用于搭建资源聚合/整合类站点,全网独家,拿来就用

想要搭建一个资源整合站点&#xff0c;如影视聚合类站点、资讯聚合类站点、图集聚合类站点等&#xff0c;需要花费大量的时间来查找合适的系统或源码。然后要去测试&#xff0c;修复bug&#xff0c;一直到能够正常的运营使用&#xff0c;花费的时间绝对不短&#xff0c;今天分享…

嵌入式学习的第三十五天-进程间通信-HTTP

TCP/IP协议模型&#xff1a;应用层&#xff1a;HTTP;传输层&#xff1a;TCP UDP;网络层&#xff1a;IPv4 IPv6网络接口层一、HTTP协议1. 万维网WWW(World Wide Web) 世界范围内的&#xff0c;联机式的信息储藏所。 万维网解决了获取互联网上的数据时需要解决的以下问题&#x…

es 和 lucene 的区别

1. Lucene 是“发动机”&#xff0c;ES 是“整车”Lucene&#xff1a;只是一个 Java 库&#xff0c;提供倒排索引、分词、打分等底层能力。你必须自己写代码处理索引创建、更新、删除、分片、分布式、故障恢复、API 封装等所有逻辑。Elasticsearch&#xff1a;基于 Lucene 的分…

AS32S601 系列 MCU芯片GPIO Sink/Source 能力测试方法

一、引言随着电子技术的飞速发展&#xff0c;微控制器&#xff08;MCU&#xff09;在工业控制、汽车电子、商业航天等众多领域得到了广泛应用。国科安芯推出的AS32S601 系列 MCU 以其卓越的性能和可靠性&#xff0c;成为了众多设计工程师的首选之一。为了确保其在实际应用中的稳…

JAVA-08(2025.07.24学习记录)

面向对象类package com.mm;public class Person {/*** 名词-属性*/String name;int age;double height;/*** 动词-方法*/public void sleep(String add) {System.out.println("我在" add "睡觉");}public String introduce() {return "我的名字是&q…

地下隧道管廊结构健康监测系统 测点的布设及设备选型

隧道监测背景 隧道所处地下环境复杂&#xff0c;在施工过程中会面临围堰变形、拱顶沉降、净空收敛、初衬应力变化、土体塌方等多种危险情况。在隧道营运过程中&#xff0c;也会受到材料退化、地震、人为破坏等因素影响&#xff0c;引发隧道主体结构的劣化和损坏&#xff0c;若不…

node.js卸载与安装超详细教程

文章目录一、卸载Step1&#xff1a;通过控制面板删除node版本Step2&#xff1a;删除node的安装目录Step3&#xff1a;查找.npmrc文件是否存在&#xff0c;有就删除。Step4&#xff1a;查看以下文件是否存在&#xff0c;有就删除Step5&#xff1a;打开系统设置&#xff0c;检查系…

飞算JavaAI“删除接口信息” 功能:3 步清理冗余接口,让管理效率翻倍

在飞算JavaAI的接口设计与管理流程中&#xff0c;“删除接口信息” 功能为用户提供了灵活调整接口方案的便利。该功能的存在&#xff0c;让用户能够在接口生命周期的前期&#xff08;审核阶段&#xff09;及时清理无需创建的接口&#xff0c;保证接口管理的简洁性与高效性。一、…

行业热点丨SimLab解决方案如何高效应对3D IC多物理场与ECAD建模挑战?

半导体行业正快速超越传统2D封装技术&#xff0c;积极采用 3D集成电路&#xff08;3D ICs&#xff09;和2.5D 先进封装等方案。这些技术通过异构芯粒、硅中介层和复杂多层布线实现更高性能与集成度。然而&#xff0c;由于电子计算机辅助设计&#xff08;ECAD&#xff09;数据规…

2025暑期—05神经网络-BP网络

按误差反向传播(简称误差反传)训练的多层前馈网络线性回归或者分类不需要使用神经元&#xff0c;原有最小二程即可。求解J依次变小。使用泰勒展开&#xff0c;只看第一阶。偏导是确定的&#xff0c;需要让J小于0的delta WkWk构造完成后 J&#xff08;Wk1&#xff09;已知&#…

qml的信号槽机制

qml的信号槽机制和qtwidget差不多&#xff0c;但是使用方法不一样&#xff0c;qtwidget一般直接用connect函数把信号和槽一绑定就完事了&#xff0c;qml分为自动绑定和手动绑定。信号自动绑定在一个组件里面定义一个信号&#xff0c;用signal定义&#xff0c;当事件触发&#x…

Unity国际版下载链接分享(非c1国内版)

转载Unity国际版下载链接分享&#xff08;非c1国内版&#xff09; - 哔哩哔哩 大家平时使用Unity注意一下会发现&#xff0c;现在我们下载的Unity版本号后面都一个c1&#xff0c;但是大家在B站学习时大神UP主们使用的Unity版本号大都是没有c1的。 例如&#xff1a;我在用的是…

第4章唯一ID生成器——4.1 分布式唯一ID

在复杂的系统中&#xff0c;每个业务实体都需要使用ID做唯一标识&#xff0c;以方便进行数据操作。例如&#xff0c;每个用户都有唯一的用户ID&#xff0c;每条内容都有唯一的内容ID&#xff0c;甚至每条内容下的每条评论都有唯一的评论ID。 4.1.1 全局唯一与UUID 在互联网还未…