4.3.1初阶数据结构(C语言)(无头不循环单链表)
1.完整的单链表+注释:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>typedef int SLTDateType; // 重定义数据类型typedef struct SListNode // 定义结构体类型的节点
{SLTDateType data;struct SListNode* next;
}SListNode;extern SListNode* BuySListNode(SLTDateType x); // 动态申请一个节点 extern void SListPrint(SListNode* plist); // 1.单链表打印extern void SListPushBack(SListNode** pplist, SLTDateType x); // 2.单链表尾插extern void SListPushFront(SListNode** pplist, SLTDateType x); // 3.单链表的头插extern void SListPopBack(SListNode** pplist); // 4.单链表的尾删extern void SListPopFront(SListNode** pplist); // 5.单链表头删extern SListNode* SListFind(SListNode* plist, SLTDateType x); // 6.单链表查找extern void SListInsertBefore(SListNode** pplist, SListNode* pos, SLTDateType x); // 7.单链表在pos位置之前插入xextern void SListInsertAfter(SListNode* pos, SLTDateType x); // 8.单链表在pos位置之后插入xextern void SListErase(SListNode** pplist, SListNode* pos); // 9.单链表删除pos位置的值extern void SListEraseAfter(SListNode* pos); // 10.单链表删除pos位置之后的值extern void SListDestroy(SListNode** pplist); // 11.单链表的销毁
#include"SList.h"SListNode* BuySListNode(SLTDateType x) // 动态申请一个节点
{SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));if (newnode == NULL){exit(-1);}else{newnode->data = x;newnode->next = NULL;}return newnode;
}void SListPrint(SListNode* plist) // 1.单链表打印
{SListNode* cur = plist;while (cur){printf("%d->", cur->data);cur = cur->next;}printf("NULL\n");
}void SListPushBack(SListNode** pplist, SLTDateType x) // 2.单链表尾插
{if (*pplist == NULL) //头插要改变指针,所以用二级指针操作{*pplist = BuySListNode(x);return;}SListNode* tail = *pplist;while (tail->next) //找尾{tail = tail->next;}tail->next = BuySListNode(x);
}void SListPushFront(SListNode** pplist, SLTDateType x) // 3.单链表的头插
{SListNode* newnode = BuySListNode(x);newnode->next = *pplist;*pplist = newnode;
}void SListPopBack(SListNode** pplist) // 4.单链表的尾删
{if (*pplist == NULL) //考虑特殊情况1{printf("表中没有数据,尾删失败!\n");return;}if ((*pplist)->next == NULL) //考虑特殊情况2{free(*pplist);*pplist = NULL;return;}SListNode* end = *pplist; //使用前后指针,便于删除SListNode* prev = *pplist;while (end->next != NULL){prev = end;end = end->next;}free(end);end = NULL;prev->next = NULL;
}void SListPopFront(SListNode** pplist) // 5.单链表头删
{if (*pplist == NULL) //考虑特殊情况{printf("表中没有数据,头删失败!\n");return;}SListNode* begin = *pplist;*pplist = begin->next;free(begin);begin = NULL;
}SListNode* SListFind(SListNode* plist, SLTDateType x) // 6.单链表查找
{while (plist != NULL){if (plist->data == x){return plist;}plist = plist->next;}printf("没找到!\n");return NULL;
}void SListInsertBefore(SListNode** pplist, SListNode* pos, SLTDateType x) // 7.单链表在pos位置之前插入x
{SListNode* newnode = BuySListNode(x);if (pos == *pplist) //考虑特殊情况{newnode->next = *pplist;*pplist = newnode;return;}SListNode* prev = *pplist;while (prev->next != pos){prev = prev->next;}newnode->next = pos;prev->next = newnode;
}void SListInsertAfter(SListNode* pos, SLTDateType x) // 8.单链表在pos位置之后插入x
{if (pos == NULL) //考虑特殊情况{printf("pos位置错误,插入失败!\n");return;}SListNode* newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode;
}void SListErase(SListNode** pplist, SListNode* pos) // 9.单链表删除pos位置的值
{if (pos == NULL) //考虑特殊情况{printf("pos位置错误,删除失败!\n");return;}if (*pplist == NULL) //考虑特殊情况{printf("表中没有数据,头删失败!\n");return;}if (pos == *pplist) //考虑头删情况{(*pplist) = pos->next;free(pos);return;}SListNode* prev = *pplist;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);
}void SListEraseAfter(SListNode* pos) // 10.单链表删除pos位置之后的值
{if ((pos == NULL) || (pos->next == NULL)){printf("pos位置错误,删除失败!\n");return;}SListNode* next = pos->next;pos->next = next->next;free(next);
}void SListDestroy(SListNode** pplist) // 11.单链表的销毁
{SListNode* cur = *pplist;while ((*pplist) != NULL){*pplist = (*pplist)->next;free(cur);cur = *pplist;}printf("销毁成功\n");
}
#include"SList.h"void test1() //测试1
{SListNode* plist = NULL;/*SListPopBack(&plist);SListPrint(plist);SListPushBack(&plist, 1);SListPopBack(&plist);SListPrint(plist);SListPushBack(&plist, 2);SListPushBack(&plist, 3);SListPopBack(&plist);*/SListPrint(plist);SListPopFront(&plist);SListPushFront(&plist, 1);SListPopFront(&plist);SListPrint(plist);SListPushFront(&plist, 2);SListPushFront(&plist, 3);SListPopFront(&plist);SListPrint(plist);}void test2() //测试2
{SListNode* plist = NULL;SListPushBack(&plist, 1);SListPushBack(&plist, 2);SListPushBack(&plist, 2);SListPushBack(&plist, 3);SListPushBack(&plist, 2);SListPushBack(&plist, 4);SListPushBack(&plist, 5);SListPrint(plist);SListNode* pos = SListFind(plist, 2);int i = 1; //数字出现个数while (pos != NULL) //找到所有指定的数字{printf("第%d次出现的地址:%p\n", i++, pos);pos = SListFind(pos->next, 2);}pos = SListFind(plist, 3);pos->data = 0;SListPrint(plist);}void test3()
{SListNode* plist = NULL;SListPushBack(&plist, 1);SListPushBack(&plist, 2);SListPushBack(&plist, 3);SListPushBack(&plist, 4);SListPushBack(&plist, 5);SListPushBack(&plist, 6);SListPushBack(&plist, 7);SListPrint(plist);/*SListNode* pos = SListFind(plist, 7);SListInsertBefore(&plist, pos, 0);SListPrint(plist);*//*SListNode* pos = SListFind(plist, 7);SListInsertAfter(pos, 0);SListPrint(plist);*//*SListNode* pos = SListFind(plist, 7);SListErase(&plist, pos);SListPrint(plist);*/SListNode* pos = SListFind(plist, 1);SListEraseAfter(pos);SListDestroy(&plist);SListPrint(plist);}void menu() //菜单
{printf("********1.打印*****2.尾插********\n");printf("********3.头插*****4.尾删********\n");printf("********5.头删*****6.查找********\n");printf("********7.位前插***8.位后插******\n");printf("********9.位删****10.位后删******\n");printf("*******11.销毁*****0.退出********\n");
}void test()
{SListNode* plist = NULL;int input = 0; //输入选择int x = 0; //输入插入的值SListNode* pos = NULL; //地址变量enum choose{_exit, //0.退出_SListPrint, //1.单链表打印_SListPushBack, //2.单链表的尾插_SListPushFront, //3.单链表的头插_SListPopBack, //4.单链表的尾删_SListPopFront, //5.单链表头删_SListFind, //6.单链表查找_SListInsertBefore, //7.单链表在pos位置之前插入x_SListInsertAfter, //8.单链表在pos位置之后插入x_SListErase, //9.单链表删除pos位置的值_SListEraseAfter, //10.单链表删除pos位置之后的值_SListDestroy //11.单链表的销毁};do{menu();printf("请选择\n");scanf("%d", &input);switch (input){case _exit:break;case _SListPrint:SListPrint(plist); //1.单链表打印break;case _SListPushBack:printf("请输入\n");scanf("%d", &x);SListPushBack(&plist, x); //2.单链表的尾插break;case _SListPushFront:printf("请输入\n");scanf("%d", &x);SListPushFront(&plist, x); //3.单链表的头插break;case _SListPopBack:SListPopBack(&plist); //4.单链表的尾删break;case _SListPopFront:SListPopFront(&plist); //5.单链表头删break;case _SListFind:printf("请输入\n");scanf("%d", &x);pos = SListFind(plist, x); //6.单链表查找break;case _SListInsertBefore:printf("请输入\n");scanf("%d", &x);SListInsertBefore(&plist, pos, x); //7.单链表在pos位置之前插入xbreak;case _SListInsertAfter:printf("请输入\n");scanf("%d", &x);SListInsertAfter(pos, x); //8.单链表在pos位置之后插入xbreak;case _SListErase:SListErase(&plist, pos); //9.单链表删除pos位置的值break;case _SListEraseAfter:SListEraseAfter(pos); //10.单链表删除pos位置之后的值break;case _SListDestroy:SListDestroy(&plist); //11.单链表的销毁break;default:printf("选项不存在,请重新输入!\n");break;}} while (input);
}int main()
{//test1(); //测试1//test2(); //测试2//test3(); //测试3test();system("pause");return 0;
}
2.练习题:
1.删除链表中等于给定值 val 的所有节点
2.反转一个单链表
3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点
4.输入一个链表,输出该链表中倒数第k个结点
5.将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
6.编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
7.链表的回文结构
8. 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针
9.对链表进行插入排序
10.给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深度拷贝
11.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL
12.给定一个链表,判断链表中是否有环
13.输入两个链表,找出它们的第一个公共结点
3.链表的优点:
1.按需申请空间不用了就释放空间,更合理的使用了空间。
2.头部中间插入删除数据,不需要挪动数据。
4.链表的缺点:
1.每一个数据都要存一个指针去链接后面的数据节点。
2.不支持随机访问。
相关文章:
4.3.1初阶数据结构(C语言)(无头不循环单链表)
1.完整的单链表注释: #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h>typedef int SLTDateType; // 重定义数据类型typedef struct SListNode // 定义结构体类型的节点 {SLTDateType data;str…...
一文深度解读音视频行业技术发展历程
从1948年的香农定律,到音视频的今天。IMMENSE、36氪|作者 北京时间2月28日凌晨,FIFA年度颁奖典礼在巴黎举行。梅西荣膺年度最佳球员,斯卡洛尼当选年度最佳男足主帅,马丁内斯荣获年度最佳男足门将!阿根廷因…...
面向对象拓展贴
1. 类和对象的内存分配机制 1.1 分配机制 Java 内存的结构分析 栈: 一般存放基本数据类型(局部变量)堆: 存放对象(Cat cat , 数组等)方法区:常量池(常量,比如字符串), 类加载信息示意图 [Cat (name, age, price)]…...
Android仿QQ未读消息拖拽粘性效果
效果图原理分析首先是在指定某个位置画一个圆出来,手指按到这个圆的时候再绘制一个可以根据手指位置移动的圆,随着手指的移动两个圆逐渐分离,分离的过程中两圆中间出现连接带,随着两圆圆心距的增大,半径也是根据某一比…...
Linux 打包压缩解压指令 gzip bzip2 tar
总结自鸟哥Linux私房菜 Linux压缩文件的扩展名大多是:“.tar, .tar.gz, .tgz, .gz, .Z, .bz2, *.xz”, 不同压缩文件使用了不同的算法,不能通用压缩或解压 常见扩展名: *.Z compress 程序压缩的文件; *.zip zip 程序…...
系统升级丨分享返佣,助力商企实现低成本高转化营销
秉承助力传统经济数字化转型的长远理念 酷雷曼VR再次在VR全景营销中发力 创新研发“分享返佣”功能 进一步拓宽商企VR全景营销渠道 助力商企搭建低成本、高传播、高转化 的VR营销体系 01、什么是“分享返佣”? ●“分享返佣”即“推广”返佣,是酷…...
机试代码模板
文章目录进制转换高精度加/乘法搜索BFSDFS树二叉树遍历图Dijkstra算法Kruskal算法动态规划最长公共子序列(LCS)最长上升子序列(LIS)KMP算法进制转换 #include <iostream> #include <string> #include <cmath> #include <iomanip> #include <algori…...
Java性能优化-垃圾回收算法-理解CMS回收器
垃圾回收算法 理解 CMS回收器 三个基本操作 1.回收新生代(同时暂停所有的应用线程) 2.运行并发周期来清理老年代数据 3.如果有必要则FULL GC压缩老年代 当发生新生代回收 , 如果老年代没有足够的空间容纳晋升的对象则执行FULL GC,所有线程停…...
Oracle11G的表空间数据文件大小限制问题处理
1.表空间数据文件容量 oracle11g的表空间数据文件容量与DB_BLOCK_SIZE有关,在初始建库时,DB_BLOCK_SIZE要根据实际需要,设置为 4K,8K、16K、32K、64K等几种大小,ORACLE的物理文件最大只允许4194304个数据块(由操作系统…...
计算机三级|网络技术|备考指南|网络系统结构与设计的基本原则|1
一、网络系统结构与设计的基本原则宽带城域网的关键技术p1 p2 p3设计一个宽带城域网涉及“三个平台一个出口”,即网络平台、业务平台、管理平台和城市宽带出口。宽带城域网:宽带城域网划分为三个层次:核心层、汇聚层、接入层。核心层承担高速…...
基于 TI Sitara系列 AM64x核心板——程序自启动说明
前 言 本文主要介绍AM64x的Cortex-A53、Cortex-M4F和Cortex-R5F核心程序自启动使用说明。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。 本说明文档适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.5.5 Linux开发环境:Ubun…...
自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第一部分
我是去年9月22日才正式学习Java的,因为在国营单位工作了4年,在天津一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你…...
微电影广告的内容突破方案
微电影作为新媒体时代背景的产物,深受大众的欢迎,同时,微电影广告在微电影模式环境下应运而生,以自己独特的传播优势,俘获了大量企业主的青睐,也获得了广大青年群体的喜爱。微电影广告欲确保可持续发展&…...
茌平区为什么越来越多的企业由请高新技术企业?山东同邦科技分享
茌平区为什么越来越多的企业由请高新技术企业?山东同邦科技分享 近年来,越来越多的企业开始申报高新技术企业,认定为国家高新技术企业能获得非常多的好处,那么具体都有哪些呢? 一、国际高新技术企业认定的好处: 1、财政补贴: 获得高新企业…...
谷歌优化排名怎么做出来的?谷歌排名多久做上去?
本文主要分享谷歌排名的算法机制,让你很容易地用更短的时间把Google的自然排名做到首页。 本文由光算创作,有可能会被剽窃和修改,我们佛系对待这种行为吧。 谷歌优化排名怎么做出来的? 答案是:持续更新原创优质内容…...
字节跳动青训营--Webpack
文章目录前言一、为什么要学习Webpack?二、什么是Webpack?1. 产生背景2. 基础概念三、使用Webpack1. 安装2. 编辑配置文件3. 执行编译命令核心流程四、如何使用Webpack流程类配置配置总览五、理解Loader六、理解插件插件钩子课外关注资料前言 此文章仅用…...
微信多媒体文件speex格式转为mp3文件格式
1、安装speex环境 wget https://ftp.osuosl.org/pub/xiph/releases/speex/speex-1.2.0.tar.gz tar -zxvf speex-1.2.0.tar.gz -C /usr/local/ cd /usr/local/speex-1.2.0/ ./configure make make install 2、配置path到/usr/lib 因为安装的speex生成的可执行文件默认在/usr…...
IAP初探
IAP(In-Application Programming)在应用编程,浅显易懂,按照字面意思即是在程序不关闭情况下,对应用进行再次写入程序,对程序的写入需要传输数据,而传输数据的前提是通信, IAP对代码进行更新可以简要分为以…...
【组织架构】中国铁路兰州局集团有限公司
1 公司简介 中国铁路兰州局集团有限公司,是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一,简称“兰局”。经过59年的发展,现已成为西北地区最大的交通运输企业之一,形成了以兰州为枢纽,由陇海铁路、包兰铁…...
【计算机三级网络技术】 第四篇 路由设计技术基础
文章目录一、分组转发二、路由选择1.理想的路由算法的基本特征2.路由算法的度量标准3.路由算法分类:4.IP路由选择与路由汇聚(重点)三、自治系统与Internet的路由选择协议1.自治系统2.路由选择协议的分类四、内部网关协议1.RIP的基本概念2.RIP的原理3.RIP的运行过程五…...
嵌入式工程师进阶,基于AM64x开发板的IPC多核开发案例分享
前 言 本文档主要说明AM64x基于IPC的多核开发方法。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。 适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.5.5 Linux开发环境:Ubuntu 18.04.4 64bit Linux Processor SDK:ti-proc…...
腾讯安全与锐捷网络战略合作,威胁情报能力“被集成”
2月28日,腾讯安全和锐捷网络在北京联合举办“威胁情报”战略合作发布会。双方发布了一款集成了腾讯安全威胁情报的新一代防火墙,并举办战略合作签约仪式。会上,锐捷网络安全产品事业部总经理项小升、腾讯安全总经理陈龙代表双方签署战略合作协…...
接口自动化测试用例详解
phpunit 接口自动化测试系列 Post接口自动化测试用例 Post方式的接口是上传接口,需要对接口头部进行封装,所以没有办法在浏览器下直接调用,但是可以用Curl命令的-d参数传递接口需要的参数。当然我们还以众筹网的登录接口为例,讲…...
【数据库增删查改进阶版】保姆级教程带大家去学习更加复杂的sql语句,各种各样的约束以及各种各样的查询
前言: 大家好,我是良辰丫🍅🍅🍅,上一篇数据库我们一起学习了基础版本的增删查改,今天我们将接触更高级的增删查改,主要是学习一些约束条件,你们准备好了嘛?开…...
【C#基础】C# 正则表达式
序号系列文章7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程9【C# 基础】C# 异常处理操作文章目录前言1,Regex 的概念2,Regex 的创建3,Regex 常用操作4,Regex 类的使用5,学习资源推荐结语前言 🌼 h…...
企业活动直播如何设置VIP观看席?
阿酷tony / 2023-2-28 / 长沙 / 多图内容企业活动直播如何设置VIP观看席?有意思吧,直播也能设vip席位。在直播间可以分设尊享嘉宾席、特邀VIP以及观众席三个区域,为企业提供多种用户接待模式,不仅能为嘉宾营造尊享VIP体验…...
线性代数学习-2
线性代数学习-2矩阵消元消元回代消元矩阵置换矩阵逆矩阵本文转载于https://herosunly.blog.csdn.net/article/details/88713747 该文章本人认为十分有用,便自己敲一遍笔记加固印象原文链接 原文这个笔记感觉比我老师讲的更加透彻,清晰。很好的展示了线性…...
Java 类
Java类是Java编程语言中的基本概念之一,用于描述对象的属性和方法。本文将详细介绍Java类的作用、定义和使用,以及在实际工作中的应用。 什么是Java类? Java类是一种用于描述对象的模板或蓝图。它定义了一个对象的属性和方法,以…...
GO中sync 包的 RWMutex 读写互斥锁
文章目录背景RWMutex 简介代码验证多个协程请求读锁 RLock() 和 RLock()读写交错 RLock() 和 Lock()写入的时候读取读取的时候写入请求多个写Lock() 和 Lock()背景 Mutex 互斥锁是严格锁定读和写,如果我们需要单独对读或者写添加锁需要使用 sync包的RWMutex 针对读…...
糖化学试剂55520-67-7,5-vinyl-2-deoxyuridine,5-乙烯基-2-脱氧尿苷特点分析说明
5-vinyl-2-deoxyuridine(5-VdU),5-vinyl-2-deoxyuridine,5-Vinyldeoxyuridine5-乙烯基-2-脱氧尿苷 | CAS:55520-67-7 | 纯度:95%试剂信息:CAS:55520-67-7所属类别:糖化学分子量:C11H…...
为什么要完善网站建设/学seo推广
朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow 声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好的理解人工智能技术,我让助理负…...
软件开发资源网站/西安互联网推广公司
使用VS2010打开VS2013的CPP工程,出现上面的问题:无法打开源文件 stdio.h 解决方案是,打开下图右边的每个解决方案的属性,找到【配置属性】-【常规】-【平台工具集】, 将V120改为V100(VS2010),即可&#x…...
什么样的蓝色做网站做好看/aso优化违法吗
改问题是"babel-eslint"版本更新问题导致的; 给大家一个最简单粗暴的解决方案: 在项目里找到对应的工程:直接删除里面的node_modules文件夹,然后重新npm install下就可以了; node_modules文件内容较多&#…...
宁波做网站优化/上海短视频培训机构
关键字:回归分析,同时置信带,相互独立,横截面数据,纵向数据 一、回归分析 1.1 定义 回归分析(regression analysis)是确定两种或两种以上变量(比如自变量与因变量,自变量也叫协变…...
各类网站导航/十大营销模式
国内美食千千万,哪道最解馋?非火锅莫属,口味多样,食材多类,是解馋的不二之选。亲朋好友锅前座,红红火火赛新年。五湖四海来相聚,吃饭却成为了烦恼,众口难调一直存在,火锅…...
自建网站外贸怎么做/免费二级域名分发网站源码
首先,我们来看一个函数定义: def f(a,*b,**c):print(fa:{a},b:{b},c:{c})*b与**c都是可变参数 出现带一个星号的参数 b,这是可变位置参数带两个星号的参数 c,这是可变关键字参数 现在执行如下代码: In [2]: f(1,2,…...