单链表(纯代码)

SListNode.h

#pragma once
#include <stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int SLDatetype;
typedef struct SListNode
{SLDatetype data;//节点数据struct SListNode* next;//指针保存下一个节点的地址
}SLND;//打印链表
void SLTPrint(SLND* pphead);
//头插
void SLTPushFront(SLND** pphead,SLDatetype x);
//尾插
void SLTPushback(SLND** pphead,SLDatetype x);
//尾删
void SLTPopback(SLND** pphead);
//头删
void SLTPopFront(SLND** pphead);
//查找
SLND* SLFind(SLND* phead, SLDatetype x);
//在指定位置之前插入数据
void SLTInsert(SLND** pphead,SLND*pos,SLDatetype x);
//删除指定节点
void SLTErase(SLND** pphead,SLND*pos);
//在指定位置之后插入数据
void SLTInsertAfter(SLND* pos, SLDatetype x);
//删除指定位置之后节点
void SLTEraseAfter(SLND* pos);
//销毁链表
void SLTDestory(SLND** pphead);

SListNode.c

#include"SListNode.h"
#include<assert.h>
//创建新的节点
SLND* SLTBuyNode(SLDatetype x)
{SLND* newnode = (SLND*)malloc(sizeof(SLND));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;return newnode;
}
//尾插
void SLTPushback(SLND** pphead,SLDatetype x)
{//不能对空指针进行简引用assert(pphead);//*pphead是指向第一个节点的指针//	空链表和非空链表SLND* newnode = SLTBuyNode(x);//空链表申请过来的节点就是尾节点if (*pphead == NULL){*pphead = newnode;}else{//找尾SLND* patail = *pphead;while (patail->next){patail = patail->next;}//此时patail指向的就是尾节点patail->next = newnode;}
}
//打印链表
void SLTPrint(SLND* phead)
{SLND* pcur = phead;while (pcur)//pcur!=NULL{printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}//头插
void SLTPushFront(SLND** pphead, SLDatetype x)
{assert(pphead);SLND* newnode = SLTBuyNode(x);newnode->next = *pphead;*pphead = newnode;
}
//尾删
void SLTPopback(SLND** pphead)
{//链表不能为空assert(pphead);//链表只有一个节点if ((*pphead)->next == NULL)//->优先级高于*{free(*pphead);*pphead = NULL;}else//链表有多个节点{SLND* prev = *pphead;SLND* ptail = *pphead;while (ptail->next){prev = ptail;ptail = ptail ->next;}free(ptail);ptail = NULL;prev->next = NULL;}
}
//头删
void SLTPopFront(SLND** pphead)
{
//链表不能为空assert(pphead && *pphead);SLND* next = (*pphead)->next;free(*pphead);*pphead = next;
}//查找
SLND* SLFind(SLND* phead, SLDatetype x)
{SLND* pcur = phead;while (pcur)//等价于pcur!=NULL{if (pcur->data == x){printf("找到啦!\n");return pcur;}pcur = pcur->next;}//pcur==NULLprintf("没找到。\n");return NULL;
}//在指定位置之前插入数据
void SLTInsert(SLND** pphead, SLND* pos, SLDatetype x)
{assert(pphead && *pphead);assert(pos);SLND* newnode = SLTBuyNode(x);//若pos==*pphead;说明是头插if (pos == *pphead){SLTPushFront(pphead, x);}else{SLND* prev = *pphead;while(prev->next!=pos){prev = prev->next;}newnode->next = pos;prev->next = newnode;}
}//在指定位置之后插入数据
void SLTInsertAfter(SLND* pos, SLDatetype x)
{assert(pos);SLND* newnode = SLTBuyNode(x);newnode->next = pos->next;pos->next = newnode;
}//删除指定节点
void SLTErase(SLND** pphead, SLND* pos)
{assert(pphead && *pphead);assert(pos);//pos是否是头节点if (pos == *pphead){//头删SLTPopFront(pphead);}else{SLND* prev = *pphead;while (prev->next!=pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}
}//删除指定位置之后节点
void SLTEraseAfter(SLND* pos)
{assert(pos && pos->next);//不能assert(pos->next&&pos);这样写//因为如果pos为NULL,无法对其简引用SLND* del = pos->next;pos->next = del->next;free(del);del = NULL;
}//销毁链表
void SLTDestory(SLND** pphead)
{assert(pphead && *pphead);SLND* pcur = *pphead;while (pcur){SLND* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;printf("销毁成功!\n");
}

tset.c

#define _CRT_SECURE_NO_WARNINGS
#include"SListNode.h"
void SListTest01(){//链表是一个一个节点组成//创建几个节点SLND* node1 = (SLND*)malloc(sizeof(SLND));node1->data = 1;SLND* node2 = (SLND*)malloc(sizeof(SLND));node2->data =2 ;SLND* node3 = (SLND*)malloc(sizeof(SLND));node3->data = 3;SLND* node4 = (SLND*)malloc(sizeof(SLND));node4->data = 4;//将四个链表连起来node1->next = node2;node2->next = node3;node3->next = node4;node4->next = NULL;SLND* plist = node1;//打印链表SLTPrint(plist);}
void SListTest02(void)
{SLND* plist = NULL;SLTPushback(&plist, 1);SLTPushback(&plist, 3);SLTPushFront(&plist, 6);SLTPrint(plist);SLTPopFront(&plist);SLTPopback(&plist);SLTPrint(plist);SLND*ree=SLFind(plist, 1);SLTInsertAfter(ree, 2);SLTPrint(plist);SLTInsert(&plist, ree, 6);SLTPrint(plist);SLTErase(&plist, ree);SLTPrint(plist);SLND* pree = SLFind(plist, 6);SLTEraseAfter(pree);SLTPrint(plist);SLTDestory(&plist);SLTPrint(plist);
}int main(void)
{SListTest02();
}

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

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

相关文章

SpringBoot实现学科竞赛管理:最佳实践

摘 要 随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大的数目的竞赛信息&#xff0c;传统竞赛管理方式已经无法满足需求&#xff0c;为了提高效率&#xff0c;竞赛管理系统应运而生。 本学科竞赛管理系统以实际运用为开发背景…

华为OD真题机试-英文输入法(Java)

华为OD机试真题中的“英文输入法”题目主要考察的是字符串处理、单词提取、以及基于前缀的单词联想功能。以下是对该题目的详细解析&#xff1a; 题目描述 主管期望你来实现英文输入法单词联想功能。具体需求如下&#xff1a; 依据用户输入的单词前缀&#xff0c;从已输入的…

MIMO 2T4R BBU RHUB AAU

MIMO&#xff08;Multiple-Input Multiple-Output&#xff0c;多输入多输出&#xff09;是一种无线通信技术&#xff0c;它通过在发射端和接收端使用多个天线来提高数据传输速率和信号质量。"2T4R"是MIMO技术中的一种配置&#xff0c;其中"2T"代表有两个发…

SpringBoot--为什么Controller是串行的?怎样才能并行?

原文网址&#xff1a;SpringBoot--为什么Controller是串行的&#xff1f;怎样才能并行&#xff1f;-CSDN博客 简介 本文介绍SpringBoot为什么Controller是串行的&#xff1f;在什么场景下才能并行执行&#xff1f; 大家都知道&#xff0c;SpringBoot的Controller按理是并行执…

主流NoSQL及应用场景详解

对比传统关系型数据库&#xff0c;NoSQL有着更为复杂的分类——键值、面向文档、列存储以及图数据库。这里就带你一览NoSQL各种类型的适用场景及一些知名公司的方案选择。 在过去几年&#xff0c;关系型数据库一直是数据持久化的唯一选择&#xff0c;数据工作者考虑的也只是在这…

React学习笔记(四)——React 组件生命周期

目录 1. 生命周期-概览 2. 生命周期-挂载阶段 3. 生命周期-更新阶段 4. 生命周期-卸载阶段 5. setState扩展-发现问题 6. setState扩展-更多用法 7. setState扩展-异步 1. 生命周期-概览 了解react类组件生命周期整体情况 大致步骤&#xff1a; 什么是生命周期React类组…

MurmurHash 算法

简介 一种非加密型哈希函数 特点 特点&#xff1a; 1.快 &#xff0c;MurMurHash3 比 MD5 快 2.低碰撞&#xff0c;MurMurHash3 128 位版本哈希值是 128 位的&#xff0c;跟 MD5 一样。128 位的哈希值&#xff0c;在数据量只有千万级别的情况下&#xff0c;基本不用担心碰撞…

Python3自带HTTP服务:轻松开启与后台管理

Python3自带有http服务&#xff0c;可以在服务器&#xff0c;也可以在本地启动&#xff0c;并运行一些常用的网页程序。比如&#xff1a;我们可以把streamlit框架编写的网页放到服务器上&#xff0c;开启http服务&#xff0c;就可以通过网页来调用这个pythont程序了&#xff0c…

Java SE 总结

Java SE&#xff08;Standard Edition&#xff09;是Java编程语言的标准版本&#xff0c;提供了基础的编程环境和API&#xff0c;适用于开发和运行Java应用程序。下面是Java SE的几个重要方面的知识回顾与总结。 1. Java环境基础 具体可参考这里对三者的介绍 传送门 1.1 JVM…

C++【类和对象】(取地址运算符重载与实现Date类)

文章目录 取地址运算符重载const成员函数取地址运算符重载 Date类的实现Date.hDate.cpp1.检查日期合法性2. 构造函数/赋值运算符重载3.得到某月的天数4. Date类 - 天数的操作4.1 日期 天数4.2 日期 天数4.3 日期 - 天数4.4 日期 - 天数 5. Date的前后置/--5.1 前置5.2 后置5.…

C++游戏

宠粉福利&#xff01; 目录 1.猜数字 2.五子棋 3.打怪 4.跑酷 5.打飞机 6.扫雷 1.猜数字 #include <iostream> #include <cstdlib> #include <ctime>int main() {std::srand(static_cast<unsigned int>(std::time(0))); // 设置随机数种子int …

ORM的了解

什么是ORM&#xff1f;为什么要用ORM&#xff1f;-CSDN博客 C高级编程&#xff08;99&#xff09;面向资源的设计思想&#xff08;ORM&#xff09;_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…

天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;天龙八部怀旧单机微改人面桃花。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xf…

【Mybatis篇】动态SQL的详细带练

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 文章目录 &#x1f3af;一.动态SQL简单介绍 &#x1f6a6;动态S…

【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架

原创 超 超的闲思世界 2024年09月11日 19:17 北京 9月11日消息&#xff0c;据外媒The Information昨晚报道&#xff0c;OpenAI的新模型「草莓」&#xff08;Strawberry&#xff09;&#xff0c;将在未来两周内作为ChatGPT服务的一部分发布。 「草莓」项目是OpenAI盛传已久的…

UI设计师面试整理-工具和技术技能

在UI设计师面试中,展示你对工具和技术的掌握程度非常重要。这不仅能体现你的专业能力,还能让面试官了解你是否具备他们团队所需的技能。以下是一些常用的UI设计工具和相关技术技能,以及如何在面试中有效展示它们。 1. UI设计工具 a. Sketch ● 用途

深度学习(4):torch.nn.Module

文章目录 一、是什么二、nn.Module 的核心功能三、nn.Module 的基本用法1. 定义自定义模型2. 初始化模型3. 模型的使用 四、nn.Module 的关键特性1. 自动注册子模块和参数2. forward 方法3. 不需要定义反向传播 五、常用的内置模块六、示例&#xff1a;创建一个简单的神经网络1…

安卓app开发系列之-常用工具与库

✨ 关于我 ✨ &#x1f468;‍&#x1f4bb; Hi there! 我是 [Jamson]&#xff0c;一名热爱编程与技术的狂热者&#xff0c;致力于前后端的全栈独立软件系统开发。通过不断学习和实践&#xff0c;我希望将知识分享给更多的朋友们&#xff0c;和大家一起成长。 &#x1f4a1; &…

全网最全软件测试面试题(含答案解析+文档)

一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到开发成功投入使用&#xff0c;并在使用中不断地修改、增补和完善&#xff0c;直到停止该软件的使用的全过程(从酝酿到…

YOLO V8半自动标注工具设计

前提&#xff1a; 对于某些边界不明确的小目标&#xff0c;要是目标由比较多的话&#xff0c;标注起来就会非常麻烦。 如何利用已有训练模型&#xff0c;生成框&#xff0c;进行预标注。再通过调节预标注框的方式&#xff0c;提高标注的效率。 1 通过预先训练的模型生成yolo 格…