1.引入单链表

顺序表对于中间或者头部的删除,时间复杂度为O(N),增容需要申请新的空间,拷贝数据,释放就空间,消耗。增容一般是2倍的增长,会有空间的浪费。为了解决这些问题,引入了单链表。

2.单链表

链表是一种物理存储结构上非连续的,非顺序的存储结构,逻辑结构上通过链表中指针链接实现连续性。类似火车头,节。与顺序表不同的是,链表的每一结点都是独立申请的空间,结点一般包含当前结点要保存的数据与下一个结点的地址,一般是从堆上申请。

struct SListNode
{
int data;
struct SListNode* next;
};

这就是一个结点的结构体。

3.单链表的实现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int sl;
typedef struct slist
{sl data;struct slist* next;
}listnode;
//申请一个节点
listnode* buylistnode(sl x)
{listnode* node=(listnode*)malloc(sizeof(listnode));if(node==NULL){perror("buylistnode");exit(-1);}node->next=NULL;node->data=x;return node;
}
//单链表打印
void listprint(listnode* p)
{while(p){printf("%d",p->data);p=p->next;}
}
//单链表尾插,为了改变真正的链表,要用二重指针。
//一重指针保存了数据的地址,我们要改变的是指针本身,不是它保存的地址,而是它本身的地址
void slpushback(listnode** pp,sl x)
{assert(pp);//头结点本身的地址不能为空,但是头结点保存的地址可以为空(起初链表为空)listnode* newnode=buylistnode(x);
//如果只有一个节点,那么直接在后面插入if(*pp==NULL){
*pp=newnode;}else{listnode* tail=*pp;while(tail->next){tail=tail->next;}tail->next=newnode;}
}
//单链表头插
void slpushfront(listnode** pp,sl x)
{assert(pp);listnode* newnode=buylistnode(x);newnode->next=*pp;*pp=newnode;
}
//单链表尾删
void slpopback(listnode** pp)
{assert(pp&&*pp);listnode* prev=NULL;listnode* tail=*pp;while(tail->next){
prev=tail;
tail=tail->next;}if(prev==NULL){*pp=NULL;}else{prev->next=NULL;}free(tail);
}
//单链表头删
void slpopfront(listnode** pp)
{assert(pp&&*pp);
//头结点本身的地址不能为空,而且保存的地址也不能为空,不然
//(*pp)->next对空指针解引用就错了listnode* next=(*pp)->next;free(*pp);*pp=next;
}
//单链表查找
listnode* slfind(listnode* p,sl x)
{while(p){if(p->data==x){return p;}p=p->next;}return NULL;
}
//单链表在pos之后插入
void slinsertafter(listnode* pos,sl x)
{assert(pos);listnode* newnode=buylistnode(x);newnode->next=pos->next;pos->next=newnode;
}
//删除pos后的值
void sleraseafter(listnode* pos)
{assert(pos&&pos->next);listnode* n=pos->next;pos->next=n->next;free(n);
}
//pos之前插入
void slinsertfront(listnode** pp,listnode* pos,sl x)
{assert(pp);if(pos==NULL){slpushback(pp,x);return;}listnode* newnode=buylistnode(x);if(*pp==pos){newnode->next=*pp;*pp=newnode;}else{listnode* prev=*pp;while(prev!=NULL&&prev->next!=pos){prev=prev->next;}newnode->next=pos;prev->next=newnode;}
}
//删除pos位置
void slerasepos(listnode** pp,listnode* pos)
{assert(pp&&pos);if(*pp==pos){*pp=pos->next;free(pos);}else{listnode* prev=*pp;while(prev!=NULL&&prev->next!=pos){prev=prev->next;}assert(prev!=NULL);prev->next=pos->next;free(pos);}
}
//删除整个
void slerase(listnode**pp)
{assert(pp);listnode* p=NULL;while(*pp){p=*pp;*pp=(*pp)->next;free(p);}
}
int main()
{return 0;
}

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

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

相关文章

docker设置镜像加速

配置镜像加速器解决 Docker 拉取问题 在使用 Docker 拉取镜像时&#xff0c;我首先按照官方指引尝试配置阿里云镜像加速器。然而&#xff0c;多次操作后仍无法正常使用&#xff0c;怀疑是个人账号没有权限拉取镜像&#xff0c;但经过多轮权限检查与配置核对&#xff0c;始终未…

【计算机网络】王道考研笔记整理(2)物理层

第二章 物理层2.1 通信基础的基本概念本节主要介绍通信中常用的一些基本概念&#xff0c;包括&#xff1a;信源、信宿、信号、信道&#xff0c;以及码元、速率、波特。首先&#xff0c;我们来看什么是信源、信宿、信号、信道&#xff0c;这些概念通过一张图就可以理解。其中&a…

2023年IEEE TITS SCI2区TOP,增强回溯搜索算法EBSA+多无人机辅助商业包裹递送系统飞行规划,深度解析+性能实测

目录1.摘要2.回溯搜索算法BSA原理3.模型定义4.增强回溯搜索算法EBSA5.结果展示6.参考文献7.算法辅导应用定制读者交流1.摘要 利用无人机进行商业包裹投递可以显著推动物流行业的转型升级&#xff0c;这得益于节省了人力资源成本&#xff0c;而无人机正在成为智能交通运输系统的…

window wsl 环境下编译openharmony,HarmonyOS 三方库 FFmpeg

1.wsl 创建 C:\Users\Administrator>wsl --list --online 以下是可安装的有效分发的列表。 使默认分发用 “*” 表示。 使用 wsl --install -d <Distro> 安装。 NAME FRIENDLY NAME Ubuntu Ubuntu Debian Debian GNU/Linux kali-linux Kali Linux Rolling Ub…

Kubernetes服务暴露与负载均衡深度探析

目录 Kubernetes服务基础 服务类型与适用场景 服务发现与DNS 负载均衡机制 kube-proxy IPVS Ingress控制器 Ingress与服务暴露 Ingress资源 Ingress控制器 负载均衡策略与配置 服务配置 Ingress配置 IPVS配置 高可用性设计 服务冗余 Ingress控制器高可用 负载…

探索飞算 JavaAI 进阶:解锁高效Java开发的新维度

前引&#xff1a;在当今快速迭代的软件开发领域&#xff0c;Java作为企业级应用的基石&#xff0c;持续推动着技术创新。随着性能需求的提升&#xff0c;“飞算JAVA”应运而生&#xff0c;它融合了现代优化理念&#xff0c;为开发者提供了一套简洁、高效的解决方案。本文将深入…

Java大厂面试故事:谢飞机的互联网医疗系统技术面试(Spring Boot、MyBatis、Kafka、Spring Security、AI等)

Java大厂面试故事&#xff1a;谢飞机的互联网医疗系统技术面试&#xff08;Spring Boot、MyBatis、Kafka、Spring Security、AI等&#xff09;本文以互联网医疗场景为主线&#xff0c;模拟Java大厂真实面试流程&#xff0c;由严肃面试官与"水货"程序员谢飞机展开有趣…

Deekseek 学习笔记

目录 比较全的微调笔记&#xff0c;推荐&#xff1a; ds 硬件gpu测试网站&#xff1a; 比较全的微调笔记&#xff0c;推荐&#xff1a; 零基础入门&#xff1a;DeepSeek微调教程来了&#xff01;_deepseek微调训练-CSDN博客 r1微调笔记&#xff1a; https://zhuanlan.zhihu…

aksk前端签名实现

需求&#xff1a; 页面和后台使用aksk进行签名校验&#xff0c;普通JSON参数签名没问题&#xff0c;但使用formData上传文件时签名总是无法通过后台校验 关键点&#xff1a; 1、浏览器在传递formData格式数据时会自动随机boundary&#xff0c;这样页面无法在请求发起前拿到随机…

基于物联网的智能体重秤设计与实现

标题:基于物联网的智能体重秤设计与实现内容:1.摘要 随着物联网技术的飞速发展&#xff0c;智能设备在人们日常生活中的应用越来越广泛。本研究的目的是设计并实现一款基于物联网的智能体重秤&#xff0c;以满足人们对健康数据实时监测和管理的需求。方法上&#xff0c;采用高精…

安全领域的 AI 采用:主要用例和需避免的错误

作者&#xff1a;来自 Elastic Elastic Security Team 安全领域的 AI 采用&#xff1a;主要用例和需避免的错误 人工智能&#xff08;artificial intelligence - AI&#xff09;在安全领域的广泛应用呈现出一种矛盾。一方面&#xff0c;它帮助安全专家大规模应对高级威胁&…

Element-Plus-全局自动引入图标组件,无需每次import

效果图配置如下1、核心代码修改main.js/ts//main.js // 全局注册图标组件 import * as ElementPlusIconsVue from element-plus/icons-vue for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component) } app.use(ElementPlusIconsVu…

日历插件-FullCalendar的详细使用

一、介绍FullCalendar 是一个功能强大、高度可定制的 JavaScript 日历组件&#xff0c;用于在网页中显示和管理日历事件。它支持多种视图&#xff08;月、周、日等&#xff09;&#xff0c;可以轻松集成各种框架&#xff0c;并提供丰富的事件处理功能。二、实操案例具体代码如下…

【A题解题思路】2025APMCM亚太杯中文赛A题解题思路+可运行代码参考(无偿分享)

注&#xff1a;该内容由“数模加油站”原创&#xff0c;无偿分享&#xff0c;可以领取参考但不要利用该内容倒卖&#xff0c;谢谢&#xff01;A 题 农业灌溉系统优化问题1思路框架&#xff1a;1.1 研究背景与问题意义土壤湿度是农业生产中影响作物根系水分供应的关键环境指标。…

【JAVA】面向对象三大特性之继承

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、继承的概念和使用细则1.1 继承的基本使用和含义1.2 关于子类访问父类成员的问题1.3 super关键的引出1.4 super调用父类当中指定的构造方法1.5 关于super和th…

基于深度学习的自动调制识别网络(持续更新)

基于卷积神经网络架构 CNN 参考文献 T.J. O’Shea, J. Corgan, T.C. Clancy, Convolutional radio modulation recognition networks, in: Proc. Int. Conf. Eng. Appl. Neural Netw., Springer, 2016, pp. 213–226. MCNet 参考文献 T. Huynh-The, C.-H. Hua, Q.-V. Pha…

Java进阶---并发编程

一.线程复习1.什么是线程&#xff0c;进程进程是操作系统分配资源的基本单位线程是进程中的一个执行单元(一个独立执行的任务)&#xff0c;是cpu执行的最小单元2.Java中如何创建线程1.继承Thread类&#xff0c;重写run()&#xff0c;直接创建子类的对象2.类实现Runnable接口&am…

小车循迹功能的实现(第六天)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4…

C++ auto与 for循环

一、数组 #include <iostream> #include <vector> using namespace std; int main() {int vec[6] {1,2,3};for (auto num : vec) { /* num 是 int */ cout << "Hello, world!" << num <<endl;}return 0; }二、STL容器与迭代器 for 循…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | ROM、RAM、FIFO 的使用

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1.实验简介 实验目的&#xff1a; 掌握紫光平台的 RAM、ROM、FIFO IP 的使用 实验环境&#xff1a; Window11 PDS2022…