线性表——链式存储
单链表(有头结点)
#include<stdio.h>
#include<stdlib.h>
//定义
typedef struct LNode{int data; //数据域 struct LNode *next; //指针域指向下一个结点,所以是 struct LNode类型
}LNode,*LinkList; //*LinkList用于表示这是一个指向 struct LNode类型的指针 //初始化(有头结点),只分配一个头结点
bool InitList(LinkList &L){ //LNode主要强调这是一个结点,而LinkList主要强调这是一个单链表,这里是对单链表进行初始化,所以参数最好使用LinkList L=(LNode *)malloc(sizeof(LNode)); //分配一个头结点的内存 if(L==NULL) //内存不足,分配失败 return false;L->next=NULL; //头结点后面暂时没有结点 return true;
}//单链表的建立——尾插法
LinkList List_TailInsert(LinkList &L){//第一步:初始化一个单链表L=(LinkList)malloc(sizeof(LNode)); //建立头结点,注意这里强调是单链表,所以是LinkList类型 LNode *s,*r=L; //s结点用于存储新元素,r结点为尾结点,永远指向最后一个结点int x; //新元素scanf("%d",&x); //输入新元素的值if(x!=999){ //当输入999时结束新元素插入 s=(LNode *)malloc(sizeof(LNode)); //为新节点分配内存if(s=NULL) //内存分配失败 return NULL;s->data=x;r->next=s;r=s;scanf("%d",&x); //输入新元素的值} r->next=NULL; //注意不能忘记 return L;}//单链表的建立——头插法,与尾插法同理,只是不需要尾指针,因为头结点代替了他的作用
LinkList List_HeadInsert(LinkList &L){L=(LinkList)malloc(sizeof(LNode));L->next=NULL;LNode *s;int x;scanf("%d",&x);if(x!=999){s=(LNode *)malloc(sizeof(LNode));if(s=NULL)return NULL;s->data=x;s->next=L->next;L->next=s;scanf("%d",&x);}return L;
} //指定结点后插操作,在p结点后插入e
bool InsertNextNode(LNode *p,int e) {if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode)); //分配内存 if(s==NULL)return false; //内存分配失败s->data=e;s->next=p->next;p->next=s;return true;
}//按位查找,查找第i个元素
LNode * GetElem(LinkList L,int i){if(i<0)return NULL;LNode *p; //p指针用于指向当前扫描到的结点int j=0; //j表示当前扫描到了第几个结点,开始是头结点——第0个结点p=L; //p开始指向头结点 while(p!=NULL&&j<i){p=p->next;j++;} return p;
} //按值查找
LNode * LocateElem(LinkList L,int e){LNode *p=L->next; //p指向第一个结点while(p!=NULL&&p->data!=e){p=p->next;} return p;} //插入,在位置i插入结点e ,采用封装思想
bool ListInsert(LinkList &L,int i,int e){if(i<1)return false; // LNode *p; //p指针用于指向当前扫描到的结点
// int j=0; //j表示当前扫描到了第几个结点
// p=L; //p指针最初指向头结点
// if(p!=NULL&&j<i-1){ //找到并用p指向第i-1个结点
// p=p->next;
// j++ ;
// } LNode *p=GetElem(L,i-1); //找到第i-1个结点// if(p==NULL) //防止i>(链表长度+1)
// return false;
//
// LNode *s=(LNode *)malloc(sizeof(LNode)); //分配一个结点的内存
// s->data=e;
// s->next=p->next;
// p->next=s;
// return true; return InsertNextNode(p,e); //再第i-1个结点后面插入e
} //指定结点前插操作,在p结点前插入e
bool InsertPriorNode(LNode *p,int e) {if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode)); //分配内存 if(s==NULL)return false; //内存分配失败/*因为单链表是单向的,只有next指针,所以在进行前插操作时,先把e插入到p的后面,然后再交换二者的数据域 */s->next=p->next;p->next=s;s->data=p->data;p->data=e;return true;
}//按位删除,删除表L中第i个位置的元素,并用e返回删除元素的值 。核心:找到第i-1个元素
bool ListDelete(LinkList &L,int i,int e){if(i<1)return false;LNode *p; //指向当前扫描到的结点int j=0; //当前扫描到第几个结点,头结点是第0个结点 p=L; //p开始指向头结点(注意:头结点不存储数据)while(p!=NULL&&j<i-1){ //找第i-1个元素 p=p->next;j++;} if(p==NULL)return false;if(p->next==NULL) //说明p是最后一个结点 return false;LNode *q=p->next; //令q指向被删除的结点 e=q->data; //用e返回删除元素的值p->next=q->next; free(q);return true;
} //删除指定结点p。核心:将p后面结点的数据域复制到p中,再将后面的结点删除
bool DeleteNode(LNode *p){if(p=NULL)return false;LNode *q=p->next;p->data=p->next->data;p->next=q->next;free(q);return true;
}
int main(){}
单链表(无头结点)
#include<stdio.h>
#include<stdlib.h>
//定义
typedef struct LNode{int data; //数据域 struct LNode *next; //指针域指向下一个结点,所以是 struct LNode类型
}LNode,*LinkList; //*LinkList用于表示这是一个指向 struct LNode类型的指针 //初始化 (无头结点)
bool InitList(LinkList &L){L=NULL; //空表,暂时没有任何结点 return true;
} //按位查找
LNode * GetElem(LinkList L,int i){if(i<0)return NULL;LNode *p;int j=1; //注意没有头结点所以初始值为1 p=L;while(p!=NULL&&j<i){p=p->next;j++; } return p;
} //按值查找
LNode * LocateElem(LinkList L,int e){LNode *p=L; //p开始指向第一个结点 while(p!=NULL&&p->data!=e){p=p->next;}return p;
} //指定结点后插操作,在p结点后插入e
bool InsertNextNode(LNode *p,int e) {if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode)); //分配内存 if(s==NULL)return false; //内存分配失败s->data=e;s->next=p->next;p->next=s;return true;
}//插入,在位置i插入结点e
bool ListInsert(LinkList &L,int i,int e){if(i<1)return false;if(i==1){ //使插入的结点成为头结点 LNode *s=(LNode *)malloc(sizeof(LNode)); //申请内存 s->data=e;s->next=L;L=s; return true;}// LNode *p;
// int j=1;
// p=L; //p指向第一个结点,注意不是头结点
//
// while(p!=NULL&&j<i-1){
// p=p->next;
// j++;
// }LNode *p=GetElem(L,i-1);// if(p=NULL)
// return false;
//
// LNode *s=(LNode *)malloc(sizeof(LNode)); //申请内存
// s->data=e;
// s->next=p->next;
// p->next=s;
// return true;return InsertNextNode(L,e);
} //指定结点前插操作,在p结点前插入e
bool InsertPriorNode(LNode *p,int e) {if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode)); //分配内存 if(s==NULL)return false; //内存分配失败/*因为单链表是单向的,只有next指针,所以在进行前插操作时,先把e插入到p的后面,然后再交换二者的数据域 */s->next=p->next;p->next=s;s->data=p->data;p->data=e;return true;
}//删除指定结点p。核心:将p后面结点的数据域复制到p中,再将后面的结点删除
bool DeleteNode(LNode *p){if(p=NULL)return false;LNode *q=p->next;p->data=p->next->data;p->next=q->next;free(q);return true;
}
int main(){}
双链表
#include<stdio.h>
#include<stdlib.h>
//只有涉及到参数中有结点就需要判断结点是否为空
//定义
typedef struct DNode{int data;struct DNode *prior,*next;
}DNode,*DLinklist;//初始化
bool InitDLinkList(DLinklist &L){L=(DNode *)malloc(sizeof(DNode));if(L==NULL)return false;L->next=NULL;L->prior=NULL;return true;
}
//插入
bool InsertNextDNode(DNode *p,DNode *e){if(p==NULL||e==NULL)return false;e->next=p->next;if(p->next!=NULL)p->next->prior=e;e->prior=p;p->next=e;return true;}
//删除,删除p的后继结点
bool DeleteNextDNode(DNode *p){if(p==NULL) return false;DNode *q=p->next;if(q==NULL)return false;p->next=q->next;if(q->next!=NULL)q->next->prior=p;free(q);return true;} //遍历 int main(){}
循环单链表
#include<stdio.h>
#include<stdlib.h>
//定义
typedef struct LNode{int data; //数据域 struct LNode *next; //指针域指向下一个结点,所以是 struct LNode类型
}LNode,*LinkList; //*LinkList用于表示这是一个指向 struct LNode类型的指针 //初始化(有头结点),只分配一个头结点
bool InitList(LinkList &L){ //LNode主要强调这是一个结点,而LinkList主要强调这是一个单链表,这里是对单链表进行初始化,所以参数最好使用LinkList L=(LNode *)malloc(sizeof(LNode)); //分配一个头结点的内存 if(L==NULL) //内存不足,分配失败 return false;L->next=L; //头结点后面暂时没有结点 return true;
}//单链表的建立——尾插法
LinkList List_TailInsert(LinkList &L){//第一步:初始化一个单链表L=(LinkList)malloc(sizeof(LNode)); //建立头结点,注意这里强调是单链表,所以是LinkList类型 LNode *s,*r=L; //s结点用于存储新元素,r结点为尾结点,永远指向最后一个结点int x; //新元素scanf("%d",&x); //输入新元素的值if(x!=999){ //当输入999时结束新元素插入 s=(LNode *)malloc(sizeof(LNode)); //为新节点分配内存if(s=NULL) //内存分配失败 return NULL;s->data=x;r->next=s;r=s;scanf("%d",&x); //输入新元素的值} r->next=NULL; //注意不能忘记 return L;}//单链表的建立——头插法,与尾插法同理,只是不需要尾指针,因为头结点代替了他的作用
LinkList List_HeadInsert(LinkList &L){L=(LinkList)malloc(sizeof(LNode));L->next=L;LNode *s;int x;scanf("%d",&x);if(x!=999){s=(LNode *)malloc(sizeof(LNode));if(s=NULL)return NULL;s->data=x;s->next=L->next;L->next=s;scanf("%d",&x);}return L;
} //指定结点后插操作,在p结点后插入e
bool InsertNextNode(LNode *p,int e) {if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode)); //分配内存 if(s==NULL)return false; //内存分配失败s->data=e;s->next=p->next;p->next=s;return true;
}//按位查找,查找第i个元素
LNode * GetElem(LinkList L,int i){if(i<0)return NULL;LNode *p; //p指针用于指向当前扫描到的结点int j=0; //j表示当前扫描到了第几个结点,开始是头结点——第0个结点p=L; //p开始指向头结点 while(p!=NULL&&j<i){p=p->next;j++;} return p;
} //按值查找
LNode * LocateElem(LinkList L,int e){LNode *p=L->next; //p指向第一个结点while(p!=NULL&&p->data!=e){p=p->next;} return p;} //插入,在位置i插入结点e ,采用封装思想
bool ListInsert(LinkList &L,int i,int e){if(i<1)return false; // LNode *p; //p指针用于指向当前扫描到的结点
// int j=0; //j表示当前扫描到了第几个结点
// p=L; //p指针最初指向头结点
// if(p!=NULL&&j<i-1){ //找到并用p指向第i-1个结点
// p=p->next;
// j++ ;
// } LNode *p=GetElem(L,i-1); //找到第i-1个结点// if(p==NULL) //防止i>(链表长度+1)
// return false;
//
// LNode *s=(LNode *)malloc(sizeof(LNode)); //分配一个结点的内存
// s->data=e;
// s->next=p->next;
// p->next=s;
// return true; return InsertNextNode(p,e); //再第i-1个结点后面插入e
} //指定结点前插操作,在p结点前插入e
bool InsertPriorNode(LNode *p,int e) {if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode)); //分配内存 if(s==NULL)return false; //内存分配失败/*因为单链表是单向的,只有next指针,所以在进行前插操作时,先把e插入到p的后面,然后再交换二者的数据域 */s->next=p->next;p->next=s;s->data=p->data;p->data=e;return true;
}//按位删除,删除表L中第i个位置的元素,并用e返回删除元素的值 。核心:找到第i-1个元素
bool ListDelete(LinkList &L,int i,int e){if(i<1)return false;LNode *p; //指向当前扫描到的结点int j=0; //当前扫描到第几个结点,头结点是第0个结点 p=L; //p开始指向头结点(注意:头结点不存储数据)while(p!=NULL&&j<i-1){ //找第i-1个元素 p=p->next;j++;} if(p==NULL)return false;if(p->next==L) //说明p是最后一个结点 return false;LNode *q=p->next; //令q指向被删除的结点 e=q->data; //用e返回删除元素的值p->next=q->next; free(q);return true;
} //删除指定结点p。核心:将p后面结点的数据域复制到p中,再将后面的结点删除
bool DeleteNode(LNode *p){if(p=NULL)return false;LNode *q=p->next;p->data=p->next->data;p->next=q->next;free(q);return true;
}
int main(){}
循环双链表
#include<stdio.h>
#include<stdlib.h>
//只有涉及到参数中有结点就需要判断结点是否为空
//定义
typedef struct DNode{int data;struct DNode *prior,*next;
}DNode,*DLinklist;//初始化
bool InitDLinkList(DLinklist &L){L=(DNode *)malloc(sizeof(DNode));if(L==NULL) //分配内存失败 return false;L->next=L;L->prior=L;return true;
}
//插入
bool InsertNextDNode(DNode *p,DNode *e){if(p==NULL||e==NULL)return false;e->next=p->next;p->next->prior=e;e->prior=p;p->next=e;return true;}
//删除,删除p的后继结点
bool DeleteNextDNode(DLinklist &L,DNode *p){if(p==NULL) return false;DNode *q=p->next;if(q==L)return false;p->next=q->next;q->next->prior=p;free(q);return true;} //遍历 int main(){}
相关文章:
线性表——链式存储
单链表(有头结点) #include<stdio.h> #include<stdlib.h> //定义 typedef struct LNode{int data; //数据域 struct LNode *next; //指针域指向下一个结点,所以是 struct LNode类型 }LNode,*LinkList; //…...
VUE3和VUE2
VUE3和VUE2 上一篇文章中,我们对VUE3进行了一个初步的认识了解,本篇文章我们来进一步学习一下,顺便看一下VUE2的写法VUE3是否能做到兼容😀。 一、新建组件 我们在components中新建一个组件,名称为Peron,…...
mysql5.5版本安装过程
mysql是关系型数据库的管理系统 将安装包放在 c盘根目录 名称为mysql 在该路径下cmd进入命令执行窗口 出现此页面说明安装成功 需要修改配置文件内容 将my-medium.ini 复制粘贴并改名为 my.ini 并添加如下内容 改好之后在mysql目录下cmd进入命令执行窗口 切换到cd bin …...
工厂生产管理系统
为应对一些国内验厂,如大疆等,他们需要客户有自己的生产管理系统的,但实际很多公司是没有引入ERP这类的系统的,从而想开发一套简单的生产管理系统。 参考了网上一个比较古老的StorageMange项目,此项目用到DevExpress的…...
Atlas 200I DK A2安装MindSpore Ascend版本
一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本,Atlas 200I DK A2无法安装MindSpore Ascend版本。 也有其他博主测试,也未尝成功,例如:【MindSpore易点通漫游世界】在Atlas 200I DK A2 (CANN6.2.RC2)…...
Go 生成UUID唯一标识
什么是UUID 通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份。 UUID的目的,是让分散式系统中的所有元素&#x…...
【知识蒸馏】deeplabv3 logit-based 知识蒸馏实战,对剪枝的模型进行蒸馏训练
本文将对【模型剪枝】基于DepGraph(依赖图)完成复杂模型的一键剪枝 文章中剪枝的模型进行蒸馏训练 一、逻辑蒸馏步骤 加载教师模型定义蒸馏loss计算蒸馏loss正常训练 二、代码 1、加载教师模型 教师模型使用未进行剪枝,并且已经训练好的原始模型。 teacher_mod…...
02.爬虫---HTTP基本原理
02.HTTP基本原理 1.URI 和 URL 的区别2.HTTP 和 HTTPS 的区别3.请求过程 1.URI 和 URL 的区别 URL(Uniform Resource Locator)即-统一资源定位符 URL是用来定位和访问互联网上资源的独特标识,它包括了资源的位置(如IP地址或域名&a…...
HTTP响应的基本概念
目录 HTTP响应中的一些信息 HTTPS HTTP响应中的一些信息 状态码:描述了这次HTTP请求是否成功,以及失败的原因。 1)200 ---OK 表示这次访问成功了。 2)404 ---Not Found 表示客户端请求的资源在服务器这边不存在。 3&a…...
链栈的存储
单向链表在栈中的存储 typedef struct StackNode {SElemType data;struct StackNode* next; }StackNode, *LinkStack; LinkStack S; //链栈初始化 void InitStack(LinkStack& S) {S NULL;return OK; } //判断链栈是否为空 Status StackEmpty(LinkStack S) {if (S NU…...
常见网络协议及端口号
https://www.cnblogs.com/Snail-yellow/p/17722411.html 常见的网络协议-腾讯云开发者社区-腾讯云 常见的网络协议知识整理_五种常用的网络协议-CSDN博客 端口 协议 常见的网络协议_计算机网络协议有哪些csdn-CSDN博客 协议 常见的网络协议知…...
几张自己绘制的UML图
全部来源于公司项目,使用建模工具 Enterprise Architect。自己做的其余文档(含绘图),因保密协议不便于公开。...
[读论文]精读Self-Attentive Sequential Recommendation
论文链接:https://arxiv.org/abs/1808.09781 其他解读文章:https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征,这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…...
HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…...
开放式耳机2024超值推荐!教你如何选择蓝牙耳机!
开放式耳机的便利性让它在我们的日常生活中变得越来越重要。它让我们摆脱了传统耳机的限制,享受到了更多的自由。不过,市面上的开放式耳机种类繁多,挑选一款既实用又实惠的产品确实需要一些小窍门。作为一位对开放式耳机颇有研究的用户&#…...
程序员搞副业的障碍有那些?
利用信息差是最常见的商业模式 在这个世界上,没有什么是所有人都知道的,信息差总是存在的。 无论是经验、技巧、知识,甚至是常识,都可能是信息差的源泉,而存在信息差的地方就意味着有赚钱的商机。 面对用户需求的金…...
windows7的ie11降级到ie8
重点是要在程序管理窗口中“查看已安装的更新”打开当前系统中已安装更新列表,找到两个IE11的更新(见下图“卸载文件“)并卸载掉,这样windows功能中的ie11才会变成ie8. 打开控制面板 进入面板,点击程序,进…...
楼房vr安全逃生模拟体验让你在虚拟环境中亲身体验火灾的紧迫与危险
消防VR安全逃生体验系统是深圳VR公司华锐视点引入了前沿的VR虚拟现实、web3d开发和多媒体交互技术,为用户打造了一个逼真的火灾现场应急逃生模拟演练环境。 相比传统的消防逃生模拟演练,消防VR安全逃生体验系统包含知识讲解和模拟实训演练,体…...
rust 学习--所有权
所有权是rust的核心功能。 Rust 是通过所有权来管理内存回收的 栈(Stack) 栈是后进先出的 栈中存储的数据在编译时是固定内存大小的数据 数据移除栈叫出栈,数据存入栈叫入栈 入栈要比在堆上分配内存块,入栈时分配器无需为存储…...
关于Git 的基本概念和使用方式
Git是一个分布式版本控制系统,用于跟踪和管理代码的改动。它具有以下基本概念和使用方式: 1. 仓库(Repository):Git使用仓库来存储代码和相关的历史记录。仓库可以是本地的,也可以是远程的。本地仓库保存在…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
