【数据结构与算法】链表(上)

记录自己所学,无详细讲解

无头单链表实现

1.项目目录文件

2.头文件 Slist.h

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
struct Slist
{int data;struct Slist* next;
};
typedef struct Slist Slist;
//初始化
void SlistInit(Slist** phead);
//新建一个节点
Slist* Buynode(int n);
//尾插
void SlistPushback(Slist** phead, int n);
//头插
void SlistPushfront(Slist** phead, int n);
//尾删
void SlistPopback(Slist** phead);
//头删
void SlistPopfront(Slist** phead);
//查询是否存在
Slist* IsFind(Slist** phead, int n);
// 修改某个节点
void SlistModify(Slist* pos, int n);
// 删除某个节点
void SlistDel(Slist**phead, Slist* pos);
//某个节点前插入
void SlistInsertfront(Slist** phead, Slist* pos, int n);
//某个节点后插入
void SlistInsertback(Slist** phead, Slist* pos, int n);
//销毁单链表
void SlistDestory(Slist** phead);
//打印
void SlistPrint(Slist** phead);

 3.函数定义源文件 Slist.c

#include "Slist.h"
void SlistInit(Slist** phead)
{*phead = NULL;//(*phead)->next = NULL;
}
Slist* Buynode(int n)
{Slist* newnode = (Slist*)malloc(sizeof(Slist));assert(newnode);newnode->next = NULL;newnode->data = n;return newnode;
}
void SlistPushback(Slist** phead, int n)
{Slist* newnode = Buynode(n);if (*phead == NULL){*phead = Buynode(n);printf("%d尾插成功\n", (*phead)->data);}else{Slist* cur = *phead;while (cur->next!=NULL){cur = cur->next;}cur->next = newnode;printf("%d尾插成功\n", (newnode)->data);}
}
void SlistPushfront(Slist** phead, int n)
{Slist* newnode = Buynode(n);if (*phead == NULL){*phead = newnode;printf("%d头插成功\n", (*phead)->data);}else{newnode->next = *phead;*phead = newnode;printf("%d头插成功\n", (*phead)->data);}
}
void SlistPopback(Slist** phead)
{assert(*phead);Slist* cur = *phead;if ((*phead)->next == NULL){printf("%d尾删成功\n",(*phead)->data);free(*phead);*phead = NULL;}else{while ((cur->next)->next != NULL){cur = cur->next;}printf("%d尾删成功\n", (cur->next)->data);free(cur->next);cur->next = NULL;}
}
void SlistPopfront(Slist** phead)
{assert(*phead);printf("%d头删成功\n", (*phead)->data);Slist* cur = *phead;*phead = (*phead)->next;free(cur);cur = NULL;
}
Slist* IsFind(Slist** phead,int n)
{assert(*phead);Slist* cur = *phead;while (cur != NULL){if (cur->data == n){return cur;}cur = cur->next;}return NULL;
}
void SlistModify(Slist* pos, int n)
{if (pos == NULL){printf("修改失败,未找到节点\n");}else{pos->data = n;printf("修改成功\n");}
}
void SlistDel(Slist** phead,Slist* pos)
{assert(*phead);if (pos == NULL){printf("删除失败,未找到节点\n");}else if (*phead == pos){Slist* cur = *phead;*phead = (*phead)->next;free(cur);cur = NULL;printf("删除节点成功\n");}else{Slist* cur = *phead;while (cur->next!= pos){cur = cur->next;}cur->next = pos->next;free(pos);pos = NULL;printf("删除节点成功\n");}
}
void SlistInsertfront(Slist** phead, Slist* pos, int n)
{assert(*phead);Slist* newnode = Buynode(n);Slist* cur = *phead;if (pos == NULL){printf("插入失败,未找到节点\n");}else if (cur->next == NULL){newnode->next = cur;*phead = newnode;printf("插入成功\n");}else if (cur == pos){*phead = newnode;newnode->next = cur;printf("插入成功\n");}else{while (cur->next != pos){cur = cur->next;}cur->next = newnode;newnode->next = pos;printf("插入成功\n");}
}
void SlistInsertback(Slist** phead, Slist* pos,int n)
{assert(*phead);Slist* newnode = Buynode(n);Slist* cur = *phead;if (pos == NULL){printf("插入失败,未找到节点\n");}else{while (cur != pos){cur = cur->next;}Slist* ccur = cur->next;cur->next = newnode;newnode->next = ccur;printf("插入成功\n");}
}
void SlistDestory(Slist** phead)
{Slist* cur = *phead;Slist* ccur = cur;while (cur != NULL){ccur = cur;cur = cur->next;free(ccur);ccur = NULL;}*phead = NULL;
}
void SlistPrint(Slist** phead)
{assert(*phead);Slist* cur = *phead;while (cur != NULL){printf("%3d", cur->data);cur = cur->next;}
}

4.函数调用测试源文件test.c

#include "Slist.h"
int main()
{Slist * list;SlistInit(&list);SlistPushback(&list, 5);SlistPushback(&list, 4);SlistPushback(&list, 3);SlistPushback(&list, 2);SlistPushback(&list, 1);SlistPushfront(&list,6);SlistPushfront(&list,7);//SlistPopback(&list);//SlistPopback(&list);//SlistPopfront(&list);//SlistDel(&list,IsFind(&list, 1));//SlistModify(IsFind(&list, 10), 9);SlistInsertfront(&list, IsFind(&list, 7), 8);SlistInsertback(&list, IsFind(&list, 8), 10);//SlistPrint(&list);SlistDestory(&list);SlistPrint(&list);
}

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

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

相关文章

webAPI中的节点操作、高级事件

一、节点操作 1.删除节点 node.removeChild(); 方法从node节点中删除一个子节点&#xff0c;返回删除的节点 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

C++20中头文件ranges的使用

<ranges>是C20中新增加的头文件&#xff0c;提供了一组与范围(ranges)相关的功能&#xff0c;此头文件是ranges库的一部分。包括&#xff1a; 1.concepts: (1).std::ranges::range:指定类型为range&#xff0c;即它提供开始迭代器和结束标记(it provides a begin iterato…

【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO

【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO 1.背景2.下载IDE3.安装IDE1.背景 TI:Texas instruments即德州仪器公司。 https://www.ti.com.cn/CCSTUDIO即Code Composer Studio。 Code Composer Studio 是适用于 TI 微控制器和处理器的集成开发环境 (IDE)。 它包含一整套用于…

系统托盘图标+快捷启动(Python)

QkStart 我把这个程序命名为QkStart 代码 # -*- coding: utf-8 -*- # Environment PyCharm # File_name QkStart |User Pfolg # 2024/10/19 22:06 import threading import time import pystray from PIL import Image from pystray import MenuItem, Menu import o…

leetcode.204.计数质数

#中等#枚举 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 埃氏筛 枚举没有考虑到数与数的关联性&#xff0c;因此难以再继续优化时间复杂度。接下来我们介绍一个常见的算法&#xff0c;该算法由希腊数学家厄拉多塞&#xff08;Eratosthenes&#xff09;提…

文字跑马灯:实现文字自动滚动策略的原理分析

一. 背景 在前端开发中&#xff0c;不少网站和应用都会运用到动态效果来吸引用户的注意&#xff0c;并提升用户体验。文字跑马灯是一种常见的动态效果&#xff0c;通过文字不断滚动来展示内容&#xff0c;吸引用户的注意力。 最近的一个项目就需要实现文字跑马灯效果&#xf…

Chrome谷歌浏览器禁止空格下翻页但可以暂停和播放视频脚本js

前提 播放某些网站的视频的时候(不能网页全屏的视频) 会产生空格下翻页但是不能暂停播放视频&#xff0c;解决方案:下载油猴或者脚本猫把这代码填进去 (function() {use strict;document.body.onkeydown function(event) {var e window.event || event;// 检查是否按下空格…

【消息队列】RabbitMQ实现消费者组机制

目录 1. RabbitMQ 的 发布订阅模式 2. GRPC 服务间的实体同步 2.1 生产者服务 2.2 消费者服务 3. 可靠性 3.1 生产者丢失消息 3.2 消费者丢失消息 3.3 RabbitMQ 中间件丢失消息 1. RabbitMQ 的 发布订阅模式 https://www.rabbitmq.com/tutorials/tutorial-three-go P 生…

基于SpringBoot+Vue+uniapp微信小程序的乡村政务服务系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

【代码随想录Day45】动态规划Part13

647. 回文子串 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;动态规划&#xff0c;字符串性质决定了 DP 数组的定义 | LeetCode&#xff1a;647.回文子串_哔哩哔哩_bilibili class Solution {public int countSubstrings(String s) {// 将字符串转换为字符数…

【软件测试】JUnit

Junit 是一个用于 Java 编程语言的单元测试框架&#xff0c;Selenium是自动化测试框架&#xff0c;专门用于Web测试 本篇博客介绍 Junit5 文章目录 Junit 使用语法注解参数执行顺序断言测试套件 Junit 使用 本篇博客使用 Idea集成开发环境 首先&#xff0c;创建新项目&#…

从零开始实现 C++ 双向链表:深入理解链表底层原理

文章目录 前言&#xff1a;1. 主要数据结构2. 迭代器的实现3. 链表的实现3.1 基本结构3.2 链表的插入与删除3.3 其他成员函数 4. 迭代器操作与遍历链表5. 拷贝构造与赋值运算符6. 总结 前言&#xff1a; 在 C 标准库中&#xff0c;std::list 是一种非常常用的数据结构&#xff…

VUE 仿神州租车-开放平台

项目背景&#xff1a; 神州租车是一家提供汽车租赁服务的公司&#xff0c;其API开放平台为开发者提供了访问神州租车相关服务和数据的接口。用VUE技术来仿照其开发平台。 成果展示&#xff1a; 首页&#xff1a; API文档&#xff1a; 关于我们&#xff1a;

牛只行为及种类识别数据集18g牛只数据,适用于多种图像识别,目标检测,区域入侵检测等算法作为数据集。数据集中包括牛只行走,站立,进食,饮水等不同类型的数据

18g牛只数据&#xff0c;适用于多种图像识别&#xff0c;目标检测&#xff0c;区域入侵检测等算法作为数据集。 数据集中包括牛只行走&#xff0c;站立&#xff0c;进食&#xff0c;饮水等不同类型的数据&#xff0c;可以用于行为检测 数据集中包含多种不同种类的牛只&#xff…

黑盒测试 | 挖掘.NET程序中的反序列化漏洞

通过不安全反序列化漏洞远程执行代码 今天&#xff0c;我将回顾 OWASP 的十大漏洞之一&#xff1a;不安全反序列化&#xff0c;重点是 .NET 应用程序上反序列化漏洞的利用。 &#x1f4dd;$ _序列化_与_反序列化 序列化是将数据对象转换为字节流的过程&#xff0c;字节流可以…

从底层结构开始学习FPGA(15)----时钟结构(通俗版)

目录 0、前言 1、IO Bank和Clock Region(时钟区域)是一个东西吗? 2、时钟输入管脚 3、时钟架构 3.1、全局时钟BUFG 3.2、水平时钟BUFH 3.3、IO时钟BUFIO 3.4、区域时钟BUFR/BUFMR 4、总结 《从底层结构开始学习FPGA》目录与传送门 0、前言 我思来想去,总觉…

基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

Maxwell 底层原理 详解

Maxwell 是一个 MySQL 数据库的增量数据捕获&#xff08;CDC, Change Data Capture&#xff09;工具&#xff0c;它通过读取 MySQL 的 binlog&#xff08;Binary Log&#xff09;来捕获数据变化&#xff0c;并将这些变化实时地发送到如 Kafka、Kinesis、RabbitMQ 或其他输出端。…

Java的重载和主要内存区

JAVA的重载 ​ 在Java中&#xff0c;重载&#xff08;Overloading&#xff09;是指在同一个类中可以定义多个同名的方法&#xff0c;但它们的参数列表必须不同。重载可以通过改变参数的数量、类型或者顺序来实现。重载提高了代码的可读性和灵活性。 JAVA重载要满足的条件&…

面经整理 八股 虾皮购物 Java后端开发 上

目录 1.java中的锁机制 什么是可重入锁 锁机制 可重入锁&#xff08;Reentrant Lock&#xff09; 特点&#xff1a; 示例代码&#xff1a; 总结 2.可重入锁的使用场景 1. 递归调用 2. 多线程资源共享 3. 复杂对象的状态管理 4. 保证顺序执行 总结 3.讲一下AQS AQ…