APP开发网站建设哪家好/电商线上推广渠道

APP开发网站建设哪家好,电商线上推广渠道,竞赛网站建设风险评估,模板性公司网站图片🍔链表基础知识 1.概念:链表是由多个节点链接构成的,节点包含数据域和指针域,指针域上存放的指针指向下一个节点 2.链表的种类:按单向或双向、带头或不带头、循环或不循环分为多个种类 3.特点:无法直接找到…

🍔链表基础知识

1.概念:链表是由多个节点链接构成的,节点包含数据域和指针域,指针域上存放的指针指向下一个节点
2.链表的种类:按单向或双向、带头或不带头、循环或不循环分为多个种类
3.特点:无法直接找到结点,但可以快速插入、删除节点,尤其适用于头插,效率块于其它方式
4.应用:p2p网络,文件系统,作为其他数据结构的基础数据结构

👻本篇文章是关于带头单向链表的

🍟带头单链表

👻头可以理解为哨兵位。哨兵不用干其他活,放好哨就行,而哨兵位不存储有效数据,只提供指向下一个节点(即存放有效数据的第一个节点)的指针。

👻以一个学生信息表为例,用单链表存储学生信息

🍟定义部分

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct {int age;int height;double weight;
}Student;
typedef struct node {Student stu;struct node* next;
}Node;

🍟函数部分

🥤一、辅助操作函数

🍕1.结点的拷贝函数

//节点的拷贝函数
void CopyValue(Student* s1, Student* s2){s1->age = s2->age;s1->height = s2->height;s1->weight = s2->weight;
}

🍕2.输入学生信息函数

//输入学生信息
void InputValue(Student* stu) {if (!stu)return;printf("学生的年龄,身高,体重\n");scanf("%d%d%lf", &stu->age, &stu->height, &stu->weight);
}

🍕3.打印信息函数

//输出每个节点的信息
void DisplayNode(Student* stu) {printf("年龄:%-5d 身高:%-5d 体重:%-5lf\n", stu->age, stu->height, stu->weight);
}

🍕4.打印单链表

//打印单链表
void DisplayLink(Node* head) {//1.判断链表是否为空,为空直接返回if (!head)return;//2.打印每个节点信息Node* p = head->next;while (p != NULL) {DisplayNode(&p->stu);p = p->next;}
}

🥤二、创建节点,创建、销毁链表

🍕1.创建节点

//创建节点
Node* CreateNode(Student* stu){//1.申请一份空间Node* node = (Node*)malloc(sizeof(Node));//2.判断空间是否申请成功if (!node) {printf("内存不足\n");return NULL;}//3.初始化结节中的数据域,即学生信息CopyValue(&node->stu, stu);node->next = NULL;//4.返回创建的结点return node;
}

🍕2.创建链表

//创建链表
Node* CreateLink() {Student stu = { 0,0,0 };//该组数据不是有效数据//1.创建头结点Node* head = CreateNode(&stu);if (!head) exit(-1);//2.创建其他结点,连接到头结点构成链表int tag = 0;Node* pnew, * tail = head;printf("是否创建新结点,继续添加输入1,否则输入0\n");scanf("%d", &tag);while (tag != 0) {InputValue(&stu);pnew=CreateNode(&stu);tail->next = pnew;tail = pnew;printf("是否创建新结点,继续添加输入1,否则输入0\n");scanf("%d", &tag);}return head;
}

🍕3.销毁链表

//销毁链表
void FreeLink(Node* head) {//1.判断链表是否为空,为空则返回if (head == NULL)return;//如果非空,则逐个结点释放Node* p, * q;p = head;while (p->next != NULL) {q = p->next;p->next = q->next;free(q);}free(head);
}

🥤三、增删查改——增

🍕在指定节点后面插入节点

//在指定位置插入节点
void InsertNode(Node* head, Node* pnew,int i) {//1.判断链表是否为空,为空拒绝插入if (!head)return;//2.判断结点是否为空,为空拒绝插入if (!pnew)return;//3.遍历链表,插入指定位置Node* p = head;for (int n = 0;n < i;n++) {p = p->next;}pnew->next = p->next;p->next = pnew;
}

只能对当前指针所在节点处的后面的结点进行操作!!!
如果想在指定节点前面插入节点,只需要改变for循环中的初始值,让指针停留在指定节点的前置节点处,就可以插入到指定节点的前面了

🥤四、增删查改——删

🍕删除指定位置节点

//删除指定位置节点
void DeleteNode(Node* head, int i) {//1.判断链表是否为空,为空直接返回if (!head)return;//2.遍历链表找到要删除的位置Node *p=head,*q;for (int n = 1;n < i&&p->next!=NULL;n++) {p = p->next;//当p等于NULL了,说明把整条链表都遍历完了还没有找到}//3.如果找到了该位置,删除,找不到就返回if (!p)return;q = p->next;p->next = q->next;free(q);
}

只能对当前指针所在节点处的后面的结点进行操作!!!
n从1开始,指针停留位置就是被删除节点的前置节点,从而可以删除掉指定节点;如果n从0开始,指针停留位置是指定节点,此时就无法删除该位置了,此时的指针只能掌控住指向节点之后的节点。

🥤五、增删查改——查与改

🍕比较两节点内容

//比较两节点内容
int Compare(Student* s1, Student* s2) {if (s1 == NULL || !s2)return -1;if (s1->age == s2->age && s1->height == s2->height && s1->weight == s2->weight)return 1;return 0;
}

🍕根据指定信息查找结点

//根据指定信息查找节点
int CheckNode(Node* head, Student* stu) {//1.链表与查找的节点不为空if (!head || !stu)return 0;//2.遍历单链表,找到是否有相同的节点Node* p = head->next;int ret = 1;int m = 0;while (p!=NULL) {m = Compare(&p->stu, stu);if (m == 1)return ret;p = p->next;ret++;}return 0;
}

🍕改变指定位置的节点信息

//改变指定位置的节点信息
void ModifyValue(Node* head,Student*stu, int input) {//1.判断第一个节点是否存在if (!head || head->next == NULL)return;//2.遍历链表找到节点位置Node* p = head->next;for (int i = 1;i < input;i++) {p = p->next;}//3.改变信息p->stu.age = stu->age;p->stu.height = stu->height;p->stu.weight = stu->weight;
}

🍟测试带头单链表完整程序

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct {int age;int height;double weight;
}Student;
typedef struct node {Student stu;struct node* next;
}Node;
//节点的拷贝函数
void CopyValue(Student* s1, Student* s2){s1->age = s2->age;s1->height = s2->height;s1->weight = s2->weight;
}
//输入学生信息
void InputValue(Student* stu) {if (!stu)return;printf("学生的年龄,身高,体重\n");scanf("%d%d%lf", &stu->age, &stu->height, &stu->weight);
}
//输出每个节点的信息
void DisplayNode(Student* stu) {printf("年龄:%-5d 身高:%-5d 体重:%-5lf\n", stu->age, stu->height, stu->weight);
}
//创建节点
Node* CreateNode(Student* stu){//1.申请一份空间Node* node = (Node*)malloc(sizeof(Node));//2.判断空间是否申请成功if (!node) {printf("内存不足\n");return NULL;}//3.初始化节点中的数据域,即学生信息CopyValue(&node->stu, stu);node->next = NULL;//4.返回创建的节点return node;
}//创建链表
Node* CreateLink() {Student stu = { 0,0,0 };//1.创建头节点Node* head = CreateNode(&stu);if (!head) exit(-1);//2.创建其他节点,连接到头节点构成链表int tag = 0;Node* pnew, * tail = head;printf("是否创建新结点,继续添加输入1,否则输入0\n");scanf("%d", &tag);while (tag != 0) {InputValue(&stu);pnew=CreateNode(&stu);tail->next = pnew;tail = pnew;printf("是否创建新结点,继续添加输入1,否则输入0\n");scanf("%d", &tag);}return head;
}
//销毁链表
void FreeLink(Node* head) {//1.判断链表是否为空,为空则返回if (head == NULL)return;//如果非空,则逐个节点释放Node* p, * q;p = head;while (p->next != NULL) {q = p->next;p->next = q->next;free(q);}free(head);
}//打印单链表
void DisplayLink(Node* head) {//1.判断链表是否为空,为空直接返回if (!head)return;//2.打印每个节点信息Node* p = head->next;while (p != NULL) {DisplayNode(&p->stu);p = p->next;}
}
//在指定位置插入节点
void InsertNode(Node* head, Node* pnew,int i) {//1.判断链表是否为空,为空拒绝插入if (!head)return;//2.判断结点是否为空,为空拒绝插入if (!pnew)return;//3.遍历链表,插入指定位置Node* p = head;for (int n = 0;n < i;n++) {p = p->next;}pnew->next = p->next;p->next = pnew;
}
//在指定位置删除结点
void DeleteNode(Node* head, int i) {//1.判断链表是否为空,为空直接返回if (!head)return;//2.遍历链表找到要删除的位置Node *p=head,*q;for (int n = 1;n < i&&p->next!=NULL;n++) {p = p->next;//当p等于NULL了,说明把整条链表都遍历完了还没有找到}//3.如果找到了该位置,删除,找不到就返回if (!p)return;q = p->next;p->next = q->next;free(q);
}
//比较两节点内容
int Compare(Student* s1, Student* s2) {if (s1 == NULL || !s2)return -1;if (s1->age == s2->age && s1->height == s2->height && s1->weight == s2->weight)return 1;return 0;
}
//根据指定信息查找节点
int CheckNode(Node* head, Student* stu) {//1.链表与查找的节点不为空if (!head || !stu)return 0;//2.遍历单链表,找到是否有相同的节点Node* p = head->next;int ret = 1;int m = 0;while (p!=NULL) {m = Compare(&p->stu, stu);if (m == 1)return ret;p = p->next;ret++;}return 0;
}//改变指定位置的节点信息
void ModifyValue(Node* head,Student*stu, int input) {//1.判断第一个节点是否存在if (!head || head->next == NULL)return;//2.遍历链表找到节点位置Node* p = head->next;for (int i = 1;i < input;i++) {p = p->next;}//3.改变信息p->stu.age = stu->age;p->stu.height = stu->height;p->stu.weight = stu->weight;
}int main() {//1.初步创建链表并插入初始信息,最终打印Node* head = CreateLink();DisplayLink(head);//2.插入新节点printf("请输入要插入的位置:\n");int input = 0;scanf("%d", &input);//得到位置Student stu;printf("请输入学生信息:\n");InputValue(&stu);//得到信息Node* pnew = CreateNode(&stu);//得到新的结点InsertNode(head, pnew, input);printf("以下是插入信息后的信息表\n");DisplayLink(head);//3.在指定位置删除结点printf("请输入要删除的位置\n");int input2 = 0;scanf("%d", &input2);DeleteNode(head, input2);printf("以下是删除信息后的信息表\n");DisplayLink(head);//4.根据指定信息查找结点int input3;do{if (head->next == NULL) {printf("表中已无信息\n");break;}printf("请输入要查找的学生信息\n");Student stu2;InputValue(&stu2);int ret = CheckNode(head, &stu2);if (ret != 0)printf("找到了,该学生编号为:%d\n", ret);elseprintf("无该学生信息\n");printf("是否继续查找,是输1,否输0:");input3 = 0;scanf("%d", &input3);} while (input3 == 1);//5.改变指定位置的节点信息printf("请输入要改变的结点位置:");int input4 = 0;scanf("%d", &input4);printf("请输入改变后的信息\n");Student stu3;InputValue(&stu3);ModifyValue(head,&stu3,input4);printf("以下是改变信息后的信息表\n");DisplayLink(head);//销毁链表FreeLink(head);
}

🌈测试结果

在这里插入图片描述
在这里插入图片描述

如有错误请指正哦,感谢❤️

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

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

相关文章

最近写了10篇Java技术博客【SQL和画图组件】

&#xff08;1&#xff09;Java获取SQL语句中的表名 &#xff08;2&#xff09;Java SQL 解析器实践 &#xff08;3&#xff09;Java SQL 格式化实践 &#xff08;4&#xff09;Java 画图 画图组件jgraphx项目整体介绍&#xff08;一&#xff09; 画图组件jgraphx项目导出…

安防视频综合管理合平台EasyCVR可支持的视频播放协议有哪些?

EasyDarwin开源流媒体视频EasyCVR安防监控平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等能力。 视频监控综合管理平台EasyCVR具备视频融合能力&#xff0c;平台基于云边端一体化架构&#xff0c;具有强大的…

vue卡片轮播图

我的项目是vue3的&#xff0c;用的swiper8 <template><div class"tab-all"><div class"tab-four"><swiper:loop"true":autoplay"{disableOnInteraction:false,delay:3000}":slides-per-view"3":center…

[NLP]LLM高效微调(PEFT)--LoRA

LoRA 背景 神经网络包含很多全连接层&#xff0c;其借助于矩阵乘法得以实现&#xff0c;然而&#xff0c;很多全连接层的权重矩阵都是满秩的。当针对特定任务进行微调后&#xff0c;模型中权重矩阵其实具有很低的本征秩&#xff08;intrinsic rank&#xff09;&#xff0c;因…

c语言实现八大排序详细解析

首先先看排序算法的整体分类 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff…

为Android构建现代应用——应用导航设计

在前一章节的实现中&#xff0c;Skeleton: Main structure&#xff0c;我们留下了几个 Jetpack 架构组件&#xff0c;这些组件将在本章中使用&#xff0c;例如 Composables、ViewModels、Navigation 和 Hilt。此外&#xff0c;我们还通过 Scaffold 集成了 TopAppBar 和 BottomA…

yolov3-spp 训练结果分析:网络结果可解释性、漏检误检分析

1. valid漏检误检分析 ①为了探查第二层反向找出来的目标特征在最后一层detector上的意义&#xff01;——为什么最后依然可以框出来目标&#xff0c;且mAP还不错的&#xff1f; ②如何进一步提升和改进这个数据的效果&#xff1f;可以有哪些优化数据和改进的地方&#xff1f;让…

《ChatGPT原理最佳解释,从根上理解ChatGPT》

【热点】 2022年11月30日&#xff0c;OpenAI发布ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c; 即聊天机器人程序 &#xff0c;开启AIGC的研究热潮。 ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够…

竞争之王CEO商战课,聚百家企业在京举行

竞争之王CEO商战课&#xff0c;于2023年7月29-31日在北京临空皇冠假日酒店举办&#xff0c;近百家位企业家齐聚一堂&#xff0c;共享饕餮盛宴。 竞争之王CEO商战课是打赢商战的第一课。 竞争环境不是匀速变化&#xff0c;而是加速变化。 在未来的市场环境中&#xff0c;企业间…

Day12-1-Webpack前端工程化开发

Webpack前端工程化 1 案例-webpack打包js文件 1 在index.html中编写代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><me…

基于Kubernetes环境的高扩展机器学习部署利器——KServe

随着ChatGPT的发布&#xff0c;人们越来越难以回避利用机器学习的相关技术。从消息应用程序上的文本预测到智能门铃上的面部识别&#xff0c;机器学习&#xff08;ML&#xff09;几乎可以在我们今天使用的每一项技术中找到。 如何将机器学习技术交付给消费者是企业在开发过程中…

【Spring Boot】请求参数传json数组,后端采用(pojo)新增案例(103)

请求参数传json数组&#xff0c;后端采用&#xff08;pojo&#xff09;接收的前提条件&#xff1a; 1.pom.xml文件加入坐标依赖&#xff1a;jackson-databind 2.Spring Boot 的启动类加注解&#xff1a;EnableWebMvc 3.Spring Boot 的Controller接受参数采用&#xff1a;Reque…

构建vue项目配置和环境配置

目录 1、环境变量process.env配置2、vue package.json多环境配置vue-cli-service serve其他用法vue-cli-service build其他用法vue-cli-service inspect其他用法3、vue导出webpack配置4、配置打包压缩图片文件5、打包去掉多余css(由于依赖问题暂时未实现)6、打包去除console.…

【Linux】进程间通信——管道

目录 写在前面的话 什么是进程间通信 为什么要进行进程间通信 进程间通信的本质理解 进程间通信的方式 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 什么是匿名管道 匿名管道通信的原理 pipe()的使用 匿名管道通信的特点 拓展代码 命名管道 什么是命…

IDEA离线环境搭建远程开发-Windows

公司的云桌面实在太卡&#xff0c;多个微服务项目跑起来&#xff0c;直接无法进行其它编码工作&#xff0c;所以想到使用Idea提供的远程开发功能&#xff0c;将服务运行在服务器&#xff0c;电脑只提供给开发页面展示&#xff0c;提高效率。 环境介绍&#xff1a; 开发环境&…

SystemVerilog数组参数传递及引用方法总结

一、将常数数组传递给task/function 如下面的程序&#xff0c;将一个常数数组传递给function module my_array_test();function array_test(int array[4]);foreach(array[i]) begin$display("array[%0d] %0d", i, array[i]);endendfunctioninitial beginarray_tes…

景联文科技高质量成品数据集上新啦!

景联文科技近期上新多个成品数据集&#xff0c;包含图像、视频等多种类型的数据&#xff0c;涵盖丰富的场景&#xff0c;可满足不同模型的多元化需求。 高质量成品数据集可用于训练和优化模型&#xff0c;使得模型能够更加全面和精准地理解和处理任务&#xff0c;更好地应对复…

anaconda创建虚拟环境在D盘

【看一看就行&#xff0c;又是挺水的一期&#xff08;每一季都掺和一点子水分也挺好&#xff09;】 一、创建&#xff1a; conda create --prefixD:\python37\py37 python3.7 这下就在D盘了&#xff1a; 二、激活刚刚那个环境&#xff1a; activate D:\pyhton37\py37​ &…

如何微调医疗大模型llm:llama2学习笔记

三个微调方向&#xff1a;简单医疗问答 临床问答 影像学 一般流程&#xff1a; 1 数据集准备 2 模型基座选择 3 微调 4 案例拆解 1 数据集准备&#xff1a;两种类型&#xff0c;一种文本一种影像 扩展&#xff0c;多模态 2 模型基座选择 多模态处理所有视频&#xff0c;文本…

【汇总】解决Ajax请求后端接口,返回ModelAndView页面不跳转

【汇总】解决Ajax请求后端接口&#xff0c;返回ModelAndView不跳转 问题发现问题解决方法一&#xff1a;直接跳转到指定URL&#xff08;推荐&#xff09;方法二&#xff1a;将返回的html内容&#xff0c;插入到页面某个元素中方法三&#xff1a;操作文档流方法四&#xff1a;使…