GESP5级语法知识(三):双向链表、循环链表

双链表的创建与输出:

#include<cstdio>
using namespace std;
struct node
{int data;    //data记录这个结点对应元素的值node *next,*pre; //next指向后继  pre指向前驱 
}*head,*tail,*p;
int n,k;
int main() 
{scanf("%d",&n);head=new node;head->pre=head->next=NULL;tail=head;     //新建一个虚拟头结点(不储存元素的值)//方便删除操作(不会越界),此时头尾指针都指向他for(int i=1;i<=n;++i) {p=new node;scanf("%d",&p->data);//输入第n个元素的值,储存到新建的结点中 p->pre=tail;tail->next=p;     //将p指向的节点插入到tail指向的结点的后面 p->next=NULL;tail=p;          //将tail更新为p,下次就插入在它的后面 }p=new node;p->pre=tail;p->next=NULL;tail->next=p;tail=p;              //和虚拟头结点类似,建立虚拟尾结点//方便删除和查询、输出p=head->next;         //p指向虚拟头结点的后继,即第一个元素 while(p!=tail)       //遍历到虚拟尾结点时停止{printf("%d ",p->data);//输出该结点的元素 p=p->next;} return 0;					  
}

双链表插入结点:

#include<cstdio>
#include<iostream>
using namespace std;
struct node
{int data;    //data记录这个结点对应元素的值node *next,*pre; //next指向后继  pre指向前驱 
}*head,*tail,*p;
void insert(node *head,int i,int x) //在双向链表的第i个结点之前插入x
{node *s,*p;             //node型指针*s,*p; int j;                  //定义计数器j s=new node;             //申请新结点s,用于存储插入的数据 s->data=x;              //为s->data ,数据域赋值为x  p=head;                 //给p赋值为head j=0;                    //计数器赋初值为0 while((p->next!=NULL)&&(j<=i)) {p=p->next;j++;}                //p指向第i个结点if(p->next==NULL) printf("no this position!\n");else{                 //将结点s插入到结点p之前 p->pre->next=s;   //将p的本来前趋结点的后继指向ss->pre=p->pre;//将s的前趋指向p的前趋p->pre=s;     //将s作为p的新前趋s->next=p;    //将s的后继指向p		}
} 
int n,x,y;
int main() 
{scanf("%d",&n);head=new node;head->pre=head->next=NULL;tail=head;     //新建一个虚拟头结点(不储存元素的值)//方便删除操作(不会越界),此时头尾指针都指向他for(int i=1;i<=n;++i) {p=new node;scanf("%d",&p->data);//输入第n个元素的值,储存到新建的结点中 p->pre=tail;tail->next=p;     //将p指向的节点插入到tail指向的结点的后面 p->next=NULL;tail=p;          //将tail更新为p,下次就插入在它的后面 }p=new node;p->pre=tail;p->next=NULL;tail->next=p;tail=p;              //和虚拟头结点类似,建立虚拟尾结点//方便删除和查询、输出scanf("%d%d",&x,&y);insert(head, x, y);p=head->next;         //p指向虚拟头结点的后继,即第一个元素 while(p!=tail)       //遍历到虚拟尾结点时停止{printf("%d ",p->data);//输出该结点的元素 p=p->next;} return 0;					  
}

双链表删除第K个结点:

#include<cstdio>
#include<iostream>
using namespace std;
struct node
{int data;    //data记录这个结点对应元素的值node *next,*pre; //next指向后继  pre指向前驱 
};
node *get(node *head,int n)//寻找第n个结点 
{node *p=head;for(int i=1;i<=n;i++){if(p==NULL){break;}p=p->next;}return p;
}
void remove(node *head,int n)
{node *p=get(head,n) ;//寻找第n个结点 if(p==NULL) //判断是否存在第n个结点 {cout<< "no this position!"<<endl;return;}else {p->pre->next=p->next; //将k结点的前趋结点的next指向k结点的后继结点 p->next->pre=p->pre;  //将k结点的后继结点的pre指向k结点的前趋结点 delete p ;             //释放k结点 }
} int main() 
{node *head,*tail,*p;int n,k;scanf("%d",&n);head=new node;head->pre=head->next=NULL;tail=head;     //新建一个虚拟头结点(不储存元素的值)//方便删除操作(不会越界),此时头尾指针都指向他for(int i=1;i<=n;++i) {p=new node;scanf("%d",&p->data);//输入第n个元素的值,储存到新建的结点中 p->pre=tail;tail->next=p;     //将p指向的节点插入到tail指向的结点的后面 p->next=NULL;tail=p;          //将tail更新为p,下次就插入在它的后面 }p=new node;p->pre=tail;p->next=NULL;tail->next=p;tail=p;              //和虚拟头结点类似,建立虚拟尾结点//方便删除和查询、输出scanf("%d",&k);remove(head,k);p=head->next;         //p指向虚拟头结点的后继,即第一个元素 while(p!=tail)       //遍历到虚拟尾结点时停止{printf("%d ",p->data);//输出该结点的元素 p=p->next;} return 0;					  
}

约瑟夫问题:单循环链表

#include<iostream>
using namespace std;
struct node
{int data;node *next;
};
int n,m;
node *head,*tail,*p;
int main()
{int i,j,k,l;cin>>n>>m;head=new node;head->data=1;head->next=NULL;tail=head;   //将头尾结点都指向1for(i=2;i<=n;i++) {p=new node;p->data=i;p->next=NULL;tail->next=p;tail=p;}           //建立链表tail->next=head;tail=head;   //单链表头尾相连,成为循环单链表for(i=1;i<=n;i++) {for(j=1;j<=m-2;j++)tail=tail->next;cout<<tail->next->data<<" ";tail->next=tail->next->next;tail=tail->next;}return 0;
}

约瑟夫问题:双向循环链表

#include<cstdio>
using namespace std;
struct node
{int data;     //记录这个结点对应的编号node *next,*pre; //next 指向结点的后继, pre指向结点的先驱 
}*head,*tail,*p;    //head表示头结点  tail表示尾结点
int n,m;
int main() 
{scanf("%d%d",&n,&m);head=new node;head->data=1;head->next=head->pre=NULL;tail=head;        //先建立编号为1的结点,头指针和尾指针都指向它for(int i=2;i<=n;++i){p=new node;p->data=i;     //建立编号为i的结点tail->next=p;  //将p指向的结点 插入到tail指向的结点 后面p->pre=tail;p->next=NULL;tail=p;        //将tail更新为p,下次就插入在它的后面  }head->pre=tail;tail->next=head;   //因为是循环列表,所以头尾相连p=head;for(int i=1;i<=n;++i) //需要按照顺序删除n-1 个结点{for(int j=1;j<m;++j) //找到需要删除的结点 p=p->next;printf("%d ",p->data);   //输出值 p->next->pre=p->pre;  //删除结点 p->pre->next=p->next;p=p->next;       //从下一个重新报数 } 
}

约瑟夫问题:数组模拟链表

#include<iostream>
using namespace std;
const int N=100;
int a[N+1];  //a[i]表示第i号人的下一人的编号
int main() 
{int n,m;cin>>n>>m;for(int i=1;i<n;i++) //建立数组模拟链表{a[i]=i+1;} a[n]=1;             //建立数组模拟循环链表 第n人指向1,形成一个环int pre=n;         // 前一人 int cur=1;         // 当前人for (int p=0;p<n;p++)  //n个人均出队为止{for(int k=1;k<m;k++)  //报数计数器加一{pre=cur;  //前一人变成当前人cur=a[pre];//当前人变成下一人 	} cout<<cur<<" "; //数到m此人出队 a[pre] =a[cur]; //前一个人的下一个人变成当前人的下一人a[cur] =0;      //当前人的下一人变成0cur=a[pre] ;    //当前人变成当前的下一个人 } return 0; 
}

约瑟夫问题:一维数组

#include<iostream>
using namespace std;
const int N=100;
bool a[N+1];  //初始为false
int main() 
{int n,m,f=0,t=0,s=0;//f出圈的人数,t圈中位置编号,s为计数器cin>>n>>m;do{t++;//枚举圈中每个人 if(t==n+1) //数组模拟环状{t=1;} if(!a[t]) //t的位置有人报数{s++;} if(s==m)  //当前报的数是m{s=0;  //计数器清0cout<<t<<" " ; //输出出圈人的编号a[t] =true;   //标记已经出局f++;   //出局的人增加一个 } }while(f!=n);  //全部出局为止 return 0;
}

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

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

相关文章

homework 2025.01.07 math 6

1选择部分 二填空部分

cursor vip

https://cursor.jeter.eu.org?pf7f4f3fab0af4119bece19ff4a4360c3 可以直接复制命令使用git bash执行即可 命令&#xff1a; bash <(curl -Lk https://gitee.com/kingparks/cursor-vip/releases/download/latest/ic.sh) f7f4f3fab0af4119bece19ff4a4360c3 等待执行完成后…

touch详讲

&#x1f3dd;️专栏&#xff1a;https://blog.csdn.net/2301_81831423/category_12872319.html &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 基本语法 主要功能 常用选项详解 1. …

UE5本地化和国际化语言

翻译语言 工具 - 本地化控制板 Localization Dashboard 修改图中这几个地方就可以 点击箭头处&#xff0c;把中文翻译成英语&#xff0c;如果要更多语言就点 添加新语言 最后点击编译即可 编译完&#xff0c;会在目录生成文件夹 设置界面相关蓝图中设置 切换本地化语言 必须在…

微信小程序实现登录注册

文章目录 1. 官方文档教程2. 注册实现3. 登录实现4. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/路由跳转的几种方式&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab…

【C++】18.继承

文章目录 1.继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 1.3 继承类模板 2.基类和派生类对象赋值转换3.继承中的作用域3.1 隐藏规则&#xff1a;3.2 考察继承作用域相关选择题 4.派生类的默认成员函数4…

PostgreSQL学习笔记(二):PostgreSQL基本操作

PostgreSQL 是一个功能强大的开源关系型数据库管理系统 (RDBMS)&#xff0c;支持标准的 SQL 语法&#xff0c;并扩展了许多功能强大的操作语法. 数据类型 数值类型 数据类型描述存储大小示例值SMALLINT小范围整数&#xff0c;范围&#xff1a;-32,768 到 32,7672 字节-123INTE…

Bi-Encoder vs. Cross-Encoder

Bi-Encoder vs. Cross-Encoder Bi-Encoder 和 Cross-Encoder 是两种常见的模型架构&#xff0c;主要用于自然语言处理&#xff08;NLP&#xff09;中的文本匹配、问答、检索等任务。它们的主要区别在于如何处理输入文本以及计算相似度的方式。 1. Bi-Encoder&#xff08;双编…

PyQt5 UI混合开发,控件的提升

PromoteLabelTest.py 提升的类 import sys from PyQt5.QtWidgets import QApplication, QWidget,QVBoxLayout,QTextEdit,QPushButton,QHBoxLayout,QFileDialog,QLabelclass PromoteLabel(QLabel):def __init__(self,parent None):super().__init__(parent)self.setText("…

A/B实验之置信检验(一):如何避免误判 (I类) 和漏报 (II类)

假设检验的依据&#xff1a;如何避免误判和漏报 A/B实验系列相关文章&#xff08;置顶&#xff09; 1.A/B实验之置信检验&#xff08;一&#xff09;&#xff1a;如何避免误判和漏报 2.A/B实验之置信检验&#xff08;二&#xff09;&#xff1a;置信检验精要 引言 在数据驱动…

金融租赁系统助力行业转型与升级的创新之路

内容概要 在当今快速发展的商业环境中&#xff0c;金融租赁系统逐渐成为企业转型与升级的重要工具。它通过整合大数据与自动化技术&#xff0c;不仅提升了风险管理的准确性&#xff0c;还加快了审批流程&#xff0c;让企业在激烈的市场竞争中游刃有余。这个系统就像是一位聪明…

Postman接口测试02|接口用例设计

目录 六、接口用例设计 1、接口测试的测试点&#xff08;测试维度&#xff09; 1️⃣功能测试 2️⃣性能测试 3️⃣安全测试 2、设计方法与思路 3、单接口测试用例 4、业务场景测试用例 1️⃣分析测试点 2️⃣添加员工 3️⃣查询员工、修改员工 4️⃣删除员工、查询…

Python标准库之SQLite3

包含了连接数据库、处理数据、控制数据、自定义输出格式及处理异常的各种方法。 官方文档&#xff1a;sqlite3 --- SQLite 数据库的 DB-API 2.0 接口 — Python 3.13.1 文档 官方文档SQLite对应版本&#xff1a;3.13.1 SQLite主页&#xff1a;SQLite Home Page SQL语法教程&a…

HTML 迷宫游戏

HTML 迷宫游戏 相关资源文件已经打包成压缩文件&#xff0c;可双击index.html直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#xff0…

【Linux】上传、下载、压缩、解压

一、上传、下载 1.1 FinalShell文件系统 我们可以通过FinalShell工具&#xff0c;方便的和虚拟机进行数据交换。 在FinalShell软件的下方窗体中&#xff0c;提供了Linux的文件系统视图&#xff0c;可以方便的&#xff1a; 浏览文件系统&#xff0c;找到合适的文件&#xff0…

以柔资讯-D-Security终端文件保护系统 logFileName 任意文件读取漏洞复现

0x01 产品简介 D-Security终端文件保护系统是一套专注于企业文件管理效率与安全的解决方案,统对文件进行全文加密,而非仅在文件表头或特定部分进行加密,从而大大提高了文件的安全性,降低了被破解的风险。D-Security终端文件保护系统是被政府和国安局等情报单位唯一认定的安…

关于重构一点简单想法

关于重构一点简单想法 当前工作的组内&#xff0c;由于业务开启的时间正好处于集团php-》go技术栈全面迁移的时间点&#xff0c;组内语言技术栈存在&#xff1a;php、go两套。 因此需求开发过程中通常要考虑两套技术栈的逻辑&#xff0c;一些基础的逻辑也没有办法复用。 在这…

新的 WhoisXML API 白皮书重点分析了主要 gTLD 和 ccTLD 注册趋势

任何寻求建立在线存在的人似乎都可以选择无限多的互联网域名注册服务。然而&#xff0c;问题依然存在&#xff1a;哪些提供商更受注册者青睐&#xff1f;WhoisXML API 的研究团队通过分析主要 gTLD&#xff08;通用顶级域&#xff09;和 ccTLD&#xff08;国家或地区顶级域&…

zabbix(二)

zabbix 1.zabbix监控的模式 主动和被动模式都是对于客户端而言 主动模式 客户端主动将数据发送给server或者是代理服务器 被动模式 服务端或者proxy(代理服务器)主动找客户端索要数据------------>默认方式 被动模式在成规模的集群&#xff08;成百上千台的&#xff09;&…

任务调度之Quartz(二):Quartz体系结构

1、Quartz 体系结构 由上一篇的Quartz基本使用可以发现&#xff0c;Quartz 主要包含一下几种角色&#xff1a; 1&#xff09;Job&#xff1a;也可以认为是JobDtetail&#xff0c;表示具体的调度任务 2&#xff09;Trigger&#xff1a;触发器&#xff0c;用于定义任务Job出发执行…