数据结构day05(单链表)

今日任务:

 思维导图:

实现 代码:(多文件)

head.h

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;typedef struct Linklist
{union {int len;datatype data;};struct Linklist* next;
}Node,*NodeP;
NodeP head_create();
NodeP create();
int output(NodeP head);
int tail_insert(NodeP head,datatype data);
int head_insert(NodeP head,datatype data);
int tail_delete(NodeP head);
int head_delete(NodeP head);
int pos_insert(NodeP head,datatype data,int pos);
int pos_delete(NodeP head,int pos);
int pos_update(NodeP head,datatype data,int pos);
int value_index(NodeP head,datatype data);
int value_delete(NodeP head,datatype data);
int inversion(NodeP head);
int free_linklist(NodeP head);
#endif

fun.c

#include "head.h"
/** function:   传参 空指针判定* @param [ in] * @param [out] * @return      */
int void_point(NodeP p){if(NULL==p){puts("how dare you give me null point.");return -1;}return 0;
}
/** function:    头结点创建* @param [ in] * @param [out] * @return      */
NodeP head_create(){NodeP head=(NodeP)malloc(sizeof(Node));if(head==NULL){puts("how dare you give me null place.");return NULL;}head->len=0;head->next=NULL;return head;
}
/** function:    节点创建* @param [ in] * @param [out] * @return      */
NodeP create(datatype data){NodeP new=(NodeP)malloc(sizeof(Node));if(new==NULL){puts("how dare you give me null place.");return NULL;}new->data=data;new->next=NULL;return new;
}
/** function:    输出* @param [ in] * @param [out] * @return      */
int output(NodeP head){if(void_point(head))return -1;while(head->next!=NULL){printf("%d\t",head->next->data);head=head->next;}puts("output done.");
}
/** function:    节点尾插* @param [ in] * @param [out] * @return      */
int tail_insert(NodeP head,datatype data){if(void_point(head))return -1;//找到尾部节点NodeP p=head;while(p->next!=NULL)p=p->next;p->next=create(data);head->len++;puts("tail insert success.");return 0;
}
/** function:    节点头插* @param [ in] * @param [out] * @return      */
int head_insert(NodeP head,datatype data){if(void_point(head))return -1;NodeP new=create(data);new->next=head->next;head->next=new;head->len++;puts("head insert success");
}
/** function:    尾删* @param [ in] * @param [out] * @return      */
int tail_delete(NodeP head){if(void_point(head))return -1;if(head->next==NULL){puts("there is no assigment to delete.");return -1;}//找到最后一个节点,free并len--,前一节点指向nullNodeP p=head;while(p->next->next!=NULL)p=p->next;free(p->next);p->next=NULL;head->len--;puts("tail delete success");return 0;
}
/** function:    头删* @param [ in] * @param [out] * @return      */
int head_delete(NodeP head){if(void_point(head))return -1;if(head->next==NULL){puts("there is no assigment to delete.");return -1;}NodeP p=head->next;free(head->next);head->next=p->next;p=NULL;head->len--;puts("head delete success");return 0;
}
/** function:    指定位置添加* @param [ in] * @param [out] * @return      */
int pos_insert(NodeP head,datatype data,int pos){if(void_point(head))return -1;if(pos>head->len+1||pos<1){puts("your position is illegal.");return -1;}NodeP p=head;while(pos--!=1)p=p->next;NodeP new=create(data);new->next=p->next;p->next=new;head->len++;puts("pos insert success");
}
/** function:    指定位置删除* @param [ in] * @param [out] * @return      */
int pos_delete(NodeP head,int pos){if(void_point(head))return -1;if(pos<1||pos>head->len){puts("your position is illegal.");return -1;}NodeP p=head;while(pos--!=1)p=p->next;NodeP x=p->next;p->next=p->next->next;free(x);x=NULL;head->len--;puts("pos delete success");return 0;
}
/** function:    指定位置修改* @param [ in] * @param [out] * @return      */
int pos_update(NodeP head,datatype data,int pos){if(void_point(head))return -1;if(pos<1||pos>head->len){puts("your position is illegal.");return -1;}NodeP p=head;while(pos--)p=p->next;p->data=data;puts("pos update success");return 0;
}
/** function:    按值查找下表* @param [ in] * @param [out] * @return      */
int value_index(NodeP head,datatype data){if(void_point(head))return -1;if(head->len==0){puts("linklist is null");return -1;}int index=0;NodeP p=head;while(p->next!=NULL){p=p->next;index++;if(p->data==data){printf("the index your want to find is%d\n",index);return index;}}puts("can't find your value");return 0;
}
/** function:    按值删除* @param [ in] * @param [out] * @return      */
int value_delete(NodeP head,datatype data){if(void_point(head))return -1;if(head->len==0){puts("linklist is null");return -1;}NodeP p=head;while(p->next!=NULL){if(p->next->data==data){pos_delete(head,value_index(head,data));puts("value delete success");return 0;}p=p->next;}puts("no value your want to delete");
}
/** function:    循环逆置* @param [ in] * @param [out] * @return      */
int inversion(NodeP head){if(void_point(head))return -1;if(head->len==0){puts("linklist is NULL");return -1;}if(head->len==1){puts("there is no deed");return 0;}//逆置//将第二个节点作为尾节点,但是得先记录一下,还得用于每次循环的头插的第一个元素NodeP p=head->next->next;head->next->next=NULL;//定义一个节点,用于方便循环调用后面的元素头插,NodeP k=p;puts("debug..");output(p);while(p!=NULL){p=p->next;k->next=head->next;head->next=k;k=p;}puts("inversion success.");return 0;
}
/** function:    释放链表* @param [ in] * @param [out] * @return      */
int free_linklist(NodeP head){if(void_point(head))return -1;NodeP p=NULL;while(head!=NULL){p=head;head=head->next;free(p);p=NULL;}puts("free success.");return 0;
}

main.c

#include "head.h"
int main(int argc, const char *argv[])
{NodeP p=head_create();tail_insert(p,10);tail_insert(p,20);tail_insert(p,30);tail_insert(p,40);tail_insert(p,50);head_insert(p,99);head_insert(p,88);output(p);//pos_insert(p,66,0);//output(p);//pos_delete(p,8);//output(p);//pos_update(p,66,8);//output(p);//tail_delete(p);//output(p);//head_delete(p);//output(p);//value_delete(p,77);//output(p);//inversion(p);//output(p);free_linklist(p);p=NULL;return 0;
}

不好,眼花了,没看到实现单项循环链表,ji

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

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

相关文章

在R中安装TensorFlow、TensorFlow_Probability、numpy(R与Python系列第二篇)

目录 前言&#xff1a; 1-安装tensorflow库 Step1: 下载R包tensorflow Step2&#xff1a;安装TensorFlow库 Step3&#xff1a;导入R中 2-安装tensorflow_probability库 Step1&#xff1a;下载R包&#xff1a;tfprobability Step2&#xff1a;安装TensorFlow Probability …

基于Kohonen网络的聚类算法

1.案例背景 1.1 Kohonen网络 Kohonen网络是自组织竞争型神经网络的一种,该网络为无监督学习网络,能够识别环境特征并自动聚类。Kohonen神经网络是芬兰赫尔辛基大学教授Teuvo Kohonen 提出的,该网络通过自组织特征映射调整网络权值,使神经网络收敛于一种表示形态。在这一形态中…

EG1164大功率同步整流升压模块开源,最高效率97%

EG1164大功率同步整流Boost升压电源模块&#xff0c;最高效率97%&#xff0c;输入电压8~50V&#xff0c;输出电压8~60V可调&#xff0c;最大功率300瓦以上&#xff0c;开关频率219kHz。 白嫖了张嘉立创的彩色丝印券就随便画了个板试试&#xff0c;第一次打彩色丝印。 因为我测…

如何飞速成为开源贡献者(Contributor)

如何飞速成为开源贡献者Contributor 一、环境信息1.1 硬件信息1.2 软件信息 二、Git安装2.1 Git介绍2.2 Git下载安装 三、开源项目选定四、GitHub参与开源流程4.1 Fork项目4.2 SSH配置4.2.1 为什么要配置SSH4.2.2 如何配置SSH 4.3 Clone项目4.4 IDEA关联4.5 PR生成4.6 PR提交 一…

Navicat16安装教程

注&#xff1a;因版权原因&#xff0c;本文已去除破解相关的文件和内容 1、在本站下载解压后即可获得Navicat16安装包和破解补丁&#xff0c;如图所示 2、双击“navicat160_premium_cs_x64.exe”程序&#xff0c;即可进入安装界面&#xff0c; 3、点击下一步 4、如图所示勾选“…

Java 中数据结构HashMap的用法

Java HashMap HashMap 是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口&#xff0c;根据键的 HashCode 值存储数据&#xff0c;具有很快的访问速度&#xff0c;最多允许一条记录的键为 null&#xff0c;不支持线程同步。 HashMap 是…

防雷接地+防雷检测综合应用解决方案

防雷接地和防雷检测是防雷工程中的重要内容&#xff0c;它们旨在保护建筑物和设备免受雷电的危害。地凯科技将介绍防雷接地和防雷检测的基本原理、施工案例方案和国标措施。 防雷接地是指将建筑物的金属结构、防雷装置和电气设备与地面连接&#xff0c;形成一个接地系统&#…

安装Ubuntu系统,将U盘当作启动盘后写保护怎么回复?

下载ChipGenius 插入写保护的U盘&#xff0c;打开ChipGenius.exe后可以扫描到U盘&#xff0c;如下图中的E:盘就是我插入的U盘&#xff08;我的PC上只有C、D两个分区&#xff09;&#xff1b; ChipGenius的作用 下载ChipGenius是为了获取U盘的设备信息&#xff1a;重点是主控…

数据集学习笔记(七):不同任务数据集的标签介绍(包含目标检测、图像分割、行为分析)

文章目录 一、目标检测1.1 TXT1.2 COCO1.3 XML 二、图像分割2.1 json2.1 TXT2.1.1 json转txt 三、行为分析3.1 TXT3.2 JSON 一、目标检测 1.1 TXT 每行表示&#xff08;类别&#xff0c;中心x相对坐标&#xff0c;中心y相对坐标&#xff0c;相对宽度、相对高度&#xff09; 1…

LeetCode494. 目标和

494. 目标和 文章目录 [494. 目标和](https://leetcode.cn/problems/target-sum/)一、题目二、题解方法一&#xff1a;目标和路径计数算法方法二&#xff1a;01背包方法三&#xff1a;01背包一维数组 一、题目 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个…

面试官:说一下 MyBatis 的一级缓存和二级缓存 ?

目录 1. MyBatis 的缓存机制 2. 为什么不默认开启 MyBatis 的二级缓存 3. MyBatis 如何开启二级缓存 4. MyBatis 有哪些缓存清除策略 1. MyBatis 的缓存机制 MyBayis 中包含两级缓存&#xff1a;一级缓存和二级缓存 1. 一级缓存是 SqlSession 级别的&#xff0c;是 MyBati…

jmeter 常数吞吐量定时器

模拟固定吞吐量的定时器。它可以控制测试计划中各个请求之间的时间间隔&#xff0c;以达到预期的吞吐量。 参数包括&#xff1a; Target Throughput&#xff1a;目标吞吐量&#xff08;每分钟请求数&#xff09;Calculate Throughput based on&#xff1a;吞吐量计算基准&…

stm32---用外部中断实现红外接收器

一、红外遥控的原理 红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传 输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是 家用电器广泛采用&#xff0c;并越来越多的应用到计算机系…

2022年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;stack or queue 栈和队列都是常用的线性结构&#xff0c;它们都提供两个操作&#xff1a; Push&#xff1a;加入一个元素。 Pop&#xff1a;弹出一个元素。 不同的是&#xff0c;栈是”先进后出”&…

leetcode236. 二叉树的最近公共祖先(java)

二叉树的最近公共祖先 题目描述递归法代码演示 上期经典 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q …

Ae 效果:CC Light Rays

生成/CC Light Rays Generate/CC Light Rays CC Light Rays&#xff08;CC 光线&#xff09;可以创建从光源发出并能穿过图层内容的光线效果。常用于制作光线透过门窗或云层的场景&#xff0c;或者用于创建神奇或梦幻的氛围感。 本效果会被限制在源图层的大小范围之内。 ◆ ◆…

每日一题 98验证二叉搜索树(中序遍历)

题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a…

【负载均衡】常见的负载均衡策略有哪些?

文章目录 前言负载均衡分类常见负载均衡策略小结 前言 负载均衡策略是实现负载均衡器的关键&#xff0c;而负载均衡器又是分布式系统中不可或缺的重要组件。使用它有助于提高系统的整体性能、可用性、可靠性和安全性&#xff0c;同时支持系统的扩展和故障容忍性。对于处理大量…

基于 Docker 的 MySQL 主从复制搭建(Mac M1版本)

系统&#xff1a;Macbook M1 镜像版本&#xff1a;mysql:5.7 如果是要查 slave连接不上 master的问题&#xff0c;可以直接跳到文章末尾踩坑处 准备工作 拉取镜像 docker pull mysql:5.7本地数据卷挂载 因为mysql不挂载的话&#xff0c;重启丢失数据&#xff0c;所以在本地创…

微服务--Gatway:网关

routes: - id:order_route(路由唯一 标识&#xff0c;路由到order) uri&#xff1a;http://localhost:8020 #需要转发的地址 #断言规则&#xff08;用于路由规则的匹配&#xff09; predicates: -path/order-serv/** -pathlb://order-service # lb: 使用nacos中的本地…