线性表——链式存储

单链表(有头结点)

#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(){} 

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

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

相关文章

体检系统商业源码,C/S架构的医院体检系统源码,大型健康体检中心管理系统源码

体检系统商业源码&#xff0c;C/S架构的医院体检系统源码&#xff0c;大型健康体检中心管理系统源码 体检信息管理系统软件是对医院体检中心进行系统化和规范化的管理。系统从检前&#xff0c;检中&#xff0c;检后整个业务流程提供标准化以及精细化的解决方案。实现体检业务市…

C 语言实例 - 阶乘

一个正整数的阶乘&#xff08;英语&#xff1a;factorial&#xff09;是所有小于及等于该数的正整数的积&#xff0c;并且 0 的阶乘为 1。自然数 n 的阶乘写作 n!。 n!123…n。阶乘亦可以递归方式定义&#xff1a;0!1&#xff0c;1!1&#xff0c;n!(n-1)!n。 #include <st…

优化css样式的网站

一、按钮的css样式 https://neumorphism.io/#e0e0e0https://neumorphism.io/#e0e0e0 二、渐变样式 Fresh Background Gradients | WebGradients.com &#x1f48e;Come to WebGradients.com for 180 beautiful linear gradients in CSS3, Photoshop and Sketch. This collect…

【Linux+Docker】修改Docker容器中的hosts文件

1、进入容器bash docker exec -it <container_id> bash2、安装编辑器 2.1、安装vim apt-get updateapt-get install vim2.2、安装nano apt-get install nano3、编辑hosts文件 3.1、使用vim编辑 vi /etc/hosts3.2、使用nano编辑 nano /etc/hosts4、安装ping apt-get…

Git Core Lecture

1、Git 简介 官方介绍&#xff1a;Git is a fast distributed revision control system (Git 是一个快速的分布式版本控制系统) 2、Git Core Command 2.1 git init git 工程初始化&#xff0c;会在工作区 (working directory) 根目录中创建.git 目录 # 创建目录 $ mkdir git-i…

C# 深拷贝和浅拷贝

文章目录 1.深拷贝2.浅拷贝3.拷贝类4.浅拷贝的实现5.深拷贝实现5.1 浅拷贝对象&#xff0c;对引用类型重新一个个赋值5.2 反射实现5.3 利用XML序列化和反序列化实现 1.深拷贝 拷贝一个对象时&#xff0c;不仅仅把对象的引用进行复制&#xff0c;还把该对象引用的值也一起拷贝。…

MySQL数据库入门之视图、存储过程、触发器

一、视图&#xff1a; 1.1、视图是什么&#xff1f;怎么理解&#xff1f; 视图是从数据库的基本表&#xff08;或者视图&#xff09;导出的虚表&#xff08;数据库只放定义&#xff0c;它不实际存储数据&#xff0c;而是根据用户定义的SQL查询动态生成的结果集&#xff0c;具…

python期末作业:批量爬取站长之家的网站排行榜数据并保存,数据分析可视化

爬虫作业,含python爬取数据和保存文件,数据分析使用pyecharts做数据可视化 整体上分析网站的排名,直观看各个网站的热度。 数据分析之后大致的效果: 整个项目分为两个大的部分,第一部分就是抓取网站排名数据,然后保存为Excel、csv等格式,其次就是从文件中…

【30天精通Prometheus:一站式监控实战指南】第8天:redis_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

arc-eager算法XJTU-NLP自然语言处理技术期末考知识点

arc-eager算法&#xff1a;以我/做了/一个/梦为例来描述arc-eager算法的四个操作&#xff1a;shift&#xff0c;left-arc&#xff0c;right-arc&#xff0c;reduce XJTU-NLP期末考点2024版 题型&#xff1a;5*6简答题4*15计算题 简答题考点&#xff1a; &#xff08;1&#…

信息安全法律法规复习

第一章 绪论 信息&#xff1a;通过在数据上施加某些约定而赋予这些数据的特殊含义 信息安全&#xff1a;保护信息系统的硬件、软件及相关数据&#xff0c;使其不因为偶然或者恶意侵犯而遭受破坏、更改&#xff0c;泄露&#xff0c;保证信息系统能够连续可靠正常地运行 五大…

探索 CSS、Sass 和 SCSS:区别与应用

在前端开发中&#xff0c;样式设计是不可或缺的一部分&#xff0c;而 CSS&#xff08;Cascading Style Sheets&#xff09;、Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;和 SCSS&#xff08;Sassy CSS&#xff09;是其中最常用的三种工具。 一、CSS&#x…

Java+Spring+ IDEA+MySQL云HIS系统源码 云HIS适合哪些地区的医院?

JavaSpring IDEAMySQL云HIS系统源码云HIS适合哪些地区的医院&#xff1f; 云HIS适合哪些地区的医院&#xff1f; 云HIS&#xff08;云医院信息系统&#xff09;适合多种地区的医院&#xff0c;特别是那些希望实现医疗服务的标准化、信息化和规范化&#xff0c;同时降低IT运营成…

42-2 应急响应之计划任务排查

一、进程排查 进程排查是指通过分析系统中正在运行的进程,以识别和处理恶意程序或异常行为。在Windows和Linux系统中,进程是操作系统的基本单位,因此对于发现和处理恶意软件或异常活动至关重要。恶意程序通常会以进程的形式在系统中运行,执行各种恶意操作,比如窃取信息、破…

每日一题 包含不超过两种字符的最长子串

目录 1.前言 2.题目解析 3.算法原理 4.代码实现 1.前言 首先我打算介绍一下&#xff0c;我对滑动窗口的理解。 滑动窗口可以分为四个步骤&#xff1a; 进窗口&#xff1a; 在这一步骤中&#xff0c;我们决定了要在窗口中维护的信息。例如&#xff0c;在这个问题中&#xff…

什么是JavaScript渗透测试?

JavaScript开发的WEB应用和PHP&#xff0c;JAVA, NET等区别在于即没有源代码&#xff0c;也可以通过浏览器查看源代码。 所以相当于JavaScript开发的WEB应用属于白盒测试(默认有源码参考)

视觉SLAM-基本原理

以视觉传感器作为感知方式的SLAM称为视觉SLAM。按照建图稀疏程度来分&#xff0c;视觉SLAM技术可以分为稀疏SLAM&#xff0c;半稠密SLAM和稠密SLAM。虽然同为SLAM系统&#xff0c;但它们的侧重点并不完全一样。SLAM 系统最初的设想是为机器人提供在未知环境中探索时的定位和导航…

如何识别和使用GRS证书

申请TC时的问题 1.没有及时添加分包商信息&#xff0c;TC无法申请 申请TC前&#xff0c;承担“染色”加工的分包商没有增加到GRS证书上&#xff1b; 2.发票地址不在证书上&#xff0c;TC无法申请 公司办公地址与注册地址不同时&#xff0c;证书上没有开票单位的地址&#xff1b…

舆情公关是什么?如何处理企业网络舆情?

舆情就是舆论的情况&#xff0c;在公关领域有暗指负面舆论的意思。总之&#xff0c;舆情公关是目前公关领域的重要分支&#xff0c;很多企业在舆情公关方面折戟&#xff0c;目前越来越多的企业开始重视舆情公关&#xff0c;成为企业一项常规的工作。 什么是舆情公关&#xff1f…

大模型框架:vLLM

目录 一、vLLM 介绍 二、安装 vLLM 2.1 使用 GPU 进行安装 2.2 使用CPU进行安装 2.3 相关配置 三、使用 vLLM 3.1 离线推理 3.2 适配OpenAI-API的API服务 一、vLLM 介绍 vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架。它利用了全新的注意力算法「PagedAtten…