链表的基本操作(数据结构)

单链表

#include <stdlib.h>
#include <iostream>
#include <stdio.h>
typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;打印链表 
void PrintList(LNode *p)
{LNode *temp;temp = p->next;printf("链表的顺序:");while(temp!=NULL){printf("%d ",temp->data);temp = temp->next;}printf("\n");
}//头插法
LinkList HeadInsert(LinkList &L){LNode *s;int x;L = (LinkList)malloc(sizeof(LNode));L->next=NULL;printf("请输入数字:");scanf("%d",&x);while(x!=000){s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = L->next;L->next = s;printf("请输入数字:");scanf("%d",&x);}return L;
} //尾插法
LinkList TailInsert(LinkList &L){int x;L = (LinkList)malloc(sizeof(LNode));LNode *s,*r=L;printf("请输入数字:");scanf("%d",&x);while(x!=000){s = (LNode*)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;printf("请输入数字:");scanf("%d",&x);}r->next=NULL;return L;
} //按序号查找结点
LNode *GetElem(LinkList L){int i;printf("请输入要查找的节点:"); scanf("%d",&i);if(i<1) return NULL;int j=1;LNode *p = L->next;while(p!=NULL&&j<i){p=p->next;j++;}return p;
} //按照值来查找 
int LocateElem(LinkList &L){int x;int i=0;printf("请输入你要查询的数字:");scanf("%d",&x);LNode *p = L->next;while(p!=NULL&&p->data!=x){p = p->next;i++;}return i+1;
}//前插入节点
LinkList ListInsert(LinkList L,int i,int n)//插入一个数(后插法) 
{if(i<1) return L;LNode *p;int j=0;p=L->next;while(p!=NULL&&j<i-2){p=p->next;j++;}if(p==NULL)     //i值不合适 return L;LNode *s = (LNode*)malloc(sizeof(LNode));s->data = n;s->next = p->next;p->next = s;printf("success\n"); return L;
} //后插入节点
LinkList ListNextInsert(LinkList &L,int i,int n){if(i<1) return L;LNode *p;int j=0;p=L->next;while(p!=NULL&&j<i-1){p=p->next;j++;}if(L==NULL) return L;LNode *s = (LNode*)malloc(sizeof(LNode));if(s==NULL) return L;s->data= n;s->next = p->next;p->next = s;printf("success\n"); return L;
} int main(){LinkList L;HeadInsert(L);PrintList(L);TailInsert(L);PrintList(L);//按序号查找LNode *p;p = GetElem(L);printf("查找出来值为:%d\n",p->data);//按值查找int i;i = LocateElem(L);printf("找出位置:%d\n",i);//前插入printf("插入(L,2,99)");ListInsert(L,2,99);PrintList(L); //后插入printf("插入(L,3,99)");ListNextInsert(L,3,100);PrintList(L);return 0;
} 

双链表

#include <stdlib.h>
#include <iostream>
#include <stdio.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->prior = NULL;//头节点的prior永远指向NULL L->next = NULL;//头节点之后暂时还没有节点 return true;
} //判断双链表是否为空(头节点)
bool Empty(DLinkList L){if(L->next==NULL){return true;}else{return false;}
} //双链表的插入 
bool InserNextDNode(DNode *p,DNode *s){if(p==NULL || s==NULL){return false;}s->next = p->next;if(p->next!=NULL){//如果p结点有后继节点 p->next->prior = s;}s->prior = p;p->next = s;return true;
}//双链表的删除
bool DeleteNextDNode(DNode *p){if(p==NULL) return false;DNode *q = p->next; //找到p的后继节点if(q==NULL) return false;//p没有后继节点p->next = q->next;if(q->next!=NULL){q->next->prior = p;} free(q);return true;} //销毁双链表
void DestoryList(DLinkList &L){//循环释放各个数据结点while(L->next!=NULL){DeleteNextDNode(L);} free(L);L=NULL;
} 

循环单链表

#include <stdlib.h>
#include <iostream>
#include <stdio.h>
typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;//初始化一个循环单链表
bool InitList(LinkList &L){L = (LNode *)malloc(sizeof(LNode));if(L==NULL) return false;L->next = L //头节点next指向头节点return true; 
} //判断循环单链表是否为空
bool Empty(LinkList L){if(L->next==L) return true;else return false;
} //判断节点p是否为循环单链表的表尾结点
bool isTail(LinkList L,LNode *p){if(p->next == L) return true;else return false;
} 

循环双链表

#include <stdlib.h>
#include <iostream>
#include <stdio.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->prior = L;L->next = L;return true;
}//判断循环双链表是否为空
bool Empty(DLinkList L){if(L->next==L) return true;else return false;
} //判断结点p是否为循环双链表的表尾结点
bool isTail(DLinkList &L,DNode *p){if(p->next==L) return true;else return false;
} 

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

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

相关文章

Rust Http 性能测试框架/工具

在Rust中&#xff0c;有几个常用的性能测试框架和工具可用于对HTTP性能进行测试。以下是其中一些&#xff1a; 1、Criterion&#xff1a;Criterion是一个通用的性能测试框架&#xff0c;可以用于测试各种类型的代码性能&#xff0c;包括HTTP性能。你可以使用Criterion来编写和运…

使用UiPath和AA构建的解决方案 3. CRM 自动化

您是否曾经从一个应用程序中查找数据并更新另一个系统? 在许多情况下,人们在系统之间复制和移动数据。有时,可能会发生“转椅活动”,从而导致人为失误。RPA可以帮助我们自动化这些活动,使其更快,同时还可以消除任何人为错误。 在这个项目中,我们将在客户服务中自动化一…

正则验证用户名和跨域postmessage

一、正则验证用户名 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title> </head> <body> <form action"/login" method"post"><input type…

系统架构设计:3 软件架构建模技术与应用

目录 一 架构“4+1”视图 二 论点 1 架构的本质 2 “4+1”视图 (1)逻辑视图 <

蓝桥杯每日一题2023.10.2

时间显示 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 输入为毫秒&#xff0c;故我们可以先将毫秒转化为秒&#xff0c;由于只需要输出时分&#xff0c;我们只需要将天数去除即可&#xff0c;可以在这里多训练一次天数判断 #include<bits/stdc.h> using namespace std…

【网络安全 --- kali2023安装】超详细的kali2023安装教程(提供镜像资源)

如果你还没有安装vmware 虚拟机&#xff0c;请参考下面博客安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;https://blog.csdn.net/m0…

python代码封装二进制文件并使用C#调用方案

思路 首先使用Cython库将python代码生成二进制文件pyd&#xff0c;然后使用C#中的pythonnet的Nuget包来进行调用&#xff0c;python代码中可以使用第三方类库。 Cython使用 Cython的安装 在命令行中使用如下语句即可安装Cython pip install cythonpyd文件格式 Cython用于…

openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw

文章目录 openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw93.1 编译oracle_fdw93.2 使用oracle_fdw93.3 常见问题93.4 注意事项 openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw openGauss的fdw实现的功能是各个openGauss数据库及…

Umijs介绍

今天我们来看 umijs 我们访问官网 https://umijs.org/ 这是一个可 插拔的企业级 React框架 当然 你也可以选择 React 的一个脚手架 但是 这样就有很多需要考虑的东西 用这个umi 很多点 我们就不需要考虑了 框架已经帮我们配置好了 这边 我们点击快速上手的一个 指南 我们可…

非 Prop 的属性

概念 父组件传给子组件的属性&#xff0c;但该属性没有在子组件 props 属性里定义。 属性继承 非 Prop 的属性默认情况下会被子组件的根节点继承&#xff0c;非 prop 的属性会保存在子组件 $attrs 属性里。 举例 子组件 date-picker 如下 <!-- 我是子组件 date-picker --&…

数据结构刷题训练——二叉树篇(一)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

贪心找性质+dp表示+矩阵表示+线段树维护:CF573D

比较套路的题目 首先肯定贪心一波&#xff0c;两个都排序后尽量相连。我一开始猜最多跨1&#xff0c;但其实最多跨2&#xff0c;考虑3个人的情况&#xff1a; 我们发现第3个人没了&#xff0c;所以可以出现跨2的情况 然后直接上dp&#xff0c;由 i − 1 , i − 2 , i − 3 i…

D (1092) : DS循环链表—约瑟夫环(Ver. I - A)

Description N个人坐成一个圆环&#xff08;编号为1 - N&#xff09;&#xff0c;从第S个人开始报数&#xff0c;数到K的人出列&#xff0c;后面的人重新从1开始报数。依次输出出列人的编号。 例如&#xff1a;N 3&#xff0c;K 2&#xff0c;S 1。 2号先出列&#xff0c;然…

谷歌浏览器驱动下载

谷歌浏览器驱动下载 在使用selenium进行网页操作的时候通常会用到驱动器。以下是谷歌浏览器驱动下载方式。 谷歌浏览器驱动下载链接&#xff1a;https://chromedriver.chromium.org/downloads 打开连接后按照下图步骤进行操作&#xff1a; 查找出自己谷歌浏览器版本后根据以…

gitlab突然提示我要输入密码了。

用了很长时间的一个gitlab库&#xff0c;今天提交代码的时候突然提示我输入密码了&#xff0c;并且用户还是gitxx.xx.xx.xx的&#xff0c;瞬间懵逼。 想想原因&#xff0c;可能是因为我不久前设置了本地对另外一个git库的远程访问&#xff0c;用的是ssh&#xff0c;操作过程中可…

【单元测试】如何使用 JUnit5 框架?

JUnit5 单元测试框架使用教程 一、Junit5 是什么&#xff1f; Junit5是一个用于在Java平台上进行单元测试的框架。JUnit 5 框架主要由三部分组成&#xff1a;JUnit Platform、JUnit Jupiter 和 JUnit Vintage。 JUnit Platform&#xff1a;定义了测试引擎的 API&#xff0c;是…

[yolo系列:yolov7添加可变形卷积Deformable Conv V2]

yolo系列文章目录 文章目录 yolo系列文章目录一、可变形卷积是什么&#xff1f;二、使用步骤1.在models/common.py文件添加2.然后再yolo.py里面添加DCNv23.修改yolov7的yaml 总结参考文章 一、可变形卷积是什么&#xff1f; 可变形卷积即DCN&#xff08;缩写取自Deformable Con…

天启科技联创郭志强:趟遍教育行业信数化沟坎,创业智能赛道重塑行业生态

郭志强 天启科技联合创始人 近20年互联网、企业信息化、数字化实施、管理及培训经验。对于集团型企业及初创企业、传统企业及互联网企业的信息化、数字化转型有自己独到的见解和实操经验。具备跨区域、集团化信息规划、解决方案、系统架构及企业流程搭建、优化和技术团队管理能…

leetCode 674. 最长连续递增序列 动态规划 / 贪心策略

674. 最长连续递增序列 - 力扣&#xff08;LeetCode&#xff09; 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每…

Qt之实现圆形进度条

在Qt自带的控件中&#xff0c;只有垂直进度条、水平进度条两种。 在平时做页面开发时&#xff0c;有些时候会用到圆形进度条&#xff0c;比如说&#xff1a;下载某个文件的下载进度。 展示效果&#xff0c;如下图所示&#xff1a; 实现这个功能主要由以下几个重点&#xff1a…