【数据结构 | PTA】表

文章目录

    • 7-1 重排链表
    • 7-2 链表去重
    • 7-3 两个有序链表序列的合并
    • 7-4 两个有序链表序列的交集

7-1 重排链表

在这里插入图片描述

输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤105)。结点的地址是5位非负整数,NULL地址用−1表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址;Data是该结点保存的数据,为不超过105的正整数;Next是下一结点的地址。题目保证给出的链表上至少有两个结点。

输出格式:
对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。

输入样例:

00100 6
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

输出样例:

68237 6 00100
00100 1 99999
99999 5 12309
12309 2 00000
00000 4 33218
33218 3 -1
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef struct Node{int data;//存储数据int pre;//存储前一个节点的地址int next;//存储下一个节点的地址
}node;
int main()
{node str[100005];int i , n , ID , temp;scanf("%d%d",&ID , &n);for(i = 0 ; i < n ; i ++){int ID1 , num , next;scanf("%d%d%d",&ID1 , &num , &next);str[ID1].data = num;str[ID1].next = next;//保存下一个节点的地址if(next != -1)str[next].pre = ID1;//储存前一个节点的地址if(next == -1){temp = ID1;//记录最后一个节点的地址}}for(;;){printf("%05d %d ",temp , str[temp].data);if(temp == ID){printf("-1\n");break;}elseprintf("%05d\n",ID);temp = str[temp].pre;printf("%05d %d ",ID , str[ID].data);if(ID == temp){printf("-1\n");break;}elseprintf("%05d\n",temp);ID = str[ID].next;}return 0;
}

7-2 链表去重

给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤105,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。

随后 N 行,每行按以下格式描述一个结点:

地址 键值 下一个结点

其中地址是该结点的地址,键值是绝对值不超过104的整数,下一个结点是下个结点的地址。

输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例:

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

输出样例:

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1
#include<stdio.h>
#include<math.h>typedef struct Node
{int date;int next;
}Node;int first[100005]; // 存放第一条链表的地址 
int f = 0;;
int isVisited[100005]; // 判断是否有重复,0代表未重复,1代表已存在 
int is = 0;
int last[100005]; // 存放第二条链表的地址 
int l = 0;void print(Node arr[],int g[],int n);int main()
{Node arr[100005];int head; // 首地址 int n;int ads;scanf("%d %d",&head,&n);for(int i=0;i<n;i++){scanf("%d",&ads);scanf("%d %d",&arr[ads].date,&arr[ads].next);}int p = head;while(p != -1){is = abs(arr[p].date); // 取出键值的绝对值 // 判断该键值是否存在 if(!isVisited[is]){// 该键值不存在 first[f++] = p; // 将该键值的地址放入第一条链表中 isVisited[is] = 1; // 将该键值位置置为1,表示已存在 }else{// 该键值存在 last[l++] = p; // 将该键值地址放入第二条链表中 }p = arr[p].next; // 移向下一位置 }print(arr,first,f);print(arr,last,l);return 0;
}
void print(Node arr[],int g[],int n)
{for(int i=0;i<n;i++){if(i == n-1){printf("%05d %d -1\n",g[i],arr[g[i]].date);}else{printf("%05d %d %05d\n",g[i],arr[g[i]].date,g[i+1]);}}
}

7-3 两个有序链表序列的合并

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。

输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

1 3 5 -1
2 4 6 8 10 -1

输出样例:

1 2 3 4 5 6 8 10
#include<stdio.h>
#include<stdlib.h>
struct Node
{int dat;struct Node *next;
};
typedef struct Node node;
node *headp;
node *make_new_node(node *head)
{node *p;p=(node*)malloc(sizeof(node));head=p;p->next=NULL;return head;
}
int get_merge(node *head1,node *head2)
{node *pos1,*pos2,*headl;if(head1->next==NULL&&head2->next==NULL){return 0;//输出null;}if(head1->next==NULL||head2->next==NULL){return 1;//只需输出一个链表的值}pos1=(node*)malloc(sizeof(node));headl=pos1;headp=headl;head1=head1->next;head2=head2->next;while(head1&&head2){if(head1->dat<head2->dat){headl->next=head1;head1=head1->next;}else{headl->next=head2;head2=head2->next;}headl=headl->next;}if(!head1&&!head2) return 2;if(head1!=NULL){headl->next=head1;}if(head2!=NULL){headl->next=head2;}return 2;
}
void dis_link(node *head)
{node *p=head->next,*pr;while(p->next!=NULL){printf("%d ",p->dat);p=p->next;}printf("%d\n",p->dat);
}
void free_node(node *head)
{node *p;node *pr=head;while(pr->next!=NULL){p=pr->next;free(pr);pr=p;}free(pr);
}
int main(void)
{node *head1=NULL,*head2=NULL;head1=make_new_node(head1);head2=make_new_node(head2);int data;node *ll=head1;while(scanf("%d",&data),data!=-1){node *tep;tep=(node*)malloc(sizeof(node));ll->next=tep;tep->next=NULL;tep->dat=data;ll=tep;}ll=head2;while(scanf("%d",&data),data!=-1){node *tep;tep=(node*)malloc(sizeof(node));ll->next=tep;tep->next=NULL;tep->dat=data;ll=tep;}int flag=get_merge(head1,head2);if(flag==1){if(head1==NULL){dis_link(head2);free_node(head2);}else{dis_link(head1);free_node(head1);}}else if(flag==0){printf("NULL\n");free_node(head1);free_node(head2);}else{dis_link(headp);free_node(headp);}return 0;
}

7-4 两个有序链表序列的交集

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。

输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

1 2 5 -1
2 4 5 8 10 -1

输出样例:

2 5
#include <stdio.h>
#include <stdlib.h>
typedef struct list{int num;struct list *next;
}List;
List *creative();
List *together(List *head1,List *head2);
int main() {int flag=1;List *head1,*head2,*head,*p;head1=creative();head2=creative();head=together(head1,head2);p=head;if(p==NULL){printf("NULL");return 0;}while(p){List *q=p;if(flag){printf("%d",p->num);flag=0;} else{printf(" %d",p->num);}p=p->next;free(q);}return 0;
}
List *creative(){int num;List *p=NULL,*last,*head=NULL;head=NULL;while (1){scanf("%d",&num);if(num>0){p=(List*)malloc(sizeof (List));p->num=num;p->next=NULL;if(head!=NULL){last->next=p;} else{head=p;}last=p;} else{return head;}}
}
List *together(List *head1,List *head2){List *head=(List*) malloc(sizeof (List)),*p,*last=NULL;head->next=NULL;while (head1&&head2){if(head1->num==head2->num){p=(List*) malloc(sizeof (List));p->num=head2->num;p->next=NULL;if(head->next){last->next=p;} else{head->next=p;}last=p;head1=head1->next;head2=head2->next;} else if(head1->num<head2->num){head1=head1->next;} else if(head1->num>head2->num){head2=head2->next;}}return head->next;
}

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

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

相关文章

K8s持久化存储PV和PVC(通俗易懂)

一、PV和PVC的引入 Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足。 拿前面 AWS EBS 的例子来说,要使用 Volume,Pod 必须事先知道如下信息: 当前 Volume 来自 AWS EBS。EBS Volume 已经提前创建,并且知道确切的 volume-id。Pod 通常是由应用的开发人员…

Linux安装配置Jupyter Lab并开机自启

文章目录 1、安装配置jupyter lab首先需要使用pip3安装&#xff1a;生成配置文件和密码&#xff1a; 2、设置开机自启首先通过which jupyter查询到可执行文件路径&#xff1a;设置自启服务&#xff1a; 1、安装配置jupyter lab 首先需要使用pip3安装&#xff1a; pip3 instal…

细说机器学习和深度学习

背景 平常业务开发中每天都要接触到机器学习和深度学习的概念&#xff0c;在听了很多大佬的普及后&#xff0c;发现甚是有趣。于是小编想着着手开始学习这部分的内容。 那废话不多说&#xff0c;就从最基础的机器学习和神经网络开始~ 一、机器学习基础 1、机器学习是什么&a…

2024 uniapp入门教程 01:含有vue3基础 我的第一个uniapp页面

uni-app官网uni-app,uniCloud,serverless,快速体验,看视频&#xff0c;10分钟了解uni-app,为什么要选择uni-app&#xff1f;,功能框架图,一套代码&#xff0c;运行到多个平台https://uniapp.dcloud.net.cn/ 准备工作&#xff1a;HBuilder X 软件 HBuilder X 官网下载&#xf…

职场上的人情世故,你知多少?这五点一定要了解

职场是一个由人组成的复杂社交网络&#xff0c;人情世故在其中起着至关重要的作用。良好的人际关系可以帮助我们更好地融入团队&#xff0c;提升工作效率&#xff0c;甚至影响职业发展。在职场中&#xff0c;我们需要了解一些关键要素&#xff0c;以更好地处理人际关系&#xf…

泛微流程隐藏按钮

隐藏右键菜单的按钮 控制台输入 mobx.toJS(WfForm.getGlobalStore().rightMenu.rightMenus) 获取相对应 type在js中进行隐藏 ecodeSDK.overwritePropsFnQueueMapSet(WeaRightMenu,{ //复写组件名隐藏菜单fn:(newProps)>{ //newProps代表组件参数newProps.datas newProps.…

Hierarchical Cross-Modal Agent for Robotics Vision-and-Language Navigation

题目&#xff1a;用于视觉语言导航的层次化跨模态智能体 摘要 1. 问题背景和现有方法 VLN任务&#xff1a;这是一种复杂的任务&#xff0c;要求智能体基于视觉输入和自然语言指令进行导航。 现有方法的局限性&#xff1a;之前的工作大多将这个问题表示为离散的导航图&#x…

MySQL基础教程(一):连接数据库和使用表

这个专栏用来讲解 MySQL 数据的基本语法和用法。本教程的目的是方便查询 MySQL 的用法&#xff0c;因此对于原理的讲解会偏少一些&#xff0c;但特点就是会有很多实验操作图。 本专栏使用的源材料是《MySQL必知必会》这本书的源代码。 文章目录 1. 连接 MySQL 数据库2. 创建数…

【物流配送中心选址问题】基于改进粒子群算法

课题名称&#xff1a; 基于改进粒子群算法的物流配送中心选址问题 改进方向&#xff1a;动态惯性权重优化粒子群算法 代码获取方式&#xff1a; 模型描述&#xff1a; 待补充 Matlab仿真结果&#xff1a; 1. 模型优化后的仿真结果 2. 初始解对应的物流配送路径图 3. 粒子…

Tianrui Green Shield

Tianrui Green Shield&#xff0c;即天锐绿盾&#xff0c;是一款专注于企业数据防泄密的软件系统。以下是对天锐绿盾的详细介绍&#xff1a; 一、基本信息 产品名称&#xff1a;天锐绿盾&#xff08;又名绿盾信息安全管理软件&#xff09;公司官网&#xff1a;www.drhchina.co…

VMware中Ubuntu系统Docker正常运行但网络不通(已解决)

问题描述&#xff1a;在VMware中的Ubuntu系统下部署了Docker&#xff0c;当在docker容器中运行Eureka微服务时&#xff0c;发现Eureka启动正常&#xff0c;但无法通过网页访问该容器中Eureka。 解决办法如下&#xff1a; 1、创建桥接网络&#xff1a;test-net sudo docker n…

2024年最强网络安全学习路线,详细到直接上清华的教材!

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题前排提示&#xff1a;文末有CSDN官方认证Python入门资料包 &#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语…

微信第三方开放平台接入本地消息事件接口报错问题java.security.InvalidKeyException: Illegal key size

先看报错&#xff1a; java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)at javax.crypto.Cipher.implInit(Cipher.java:805)at javax.crypto.Cipher.chooseProvider(Cipher.java:864)at javax.crypto.Cipher.in…

Java基础(上)

Java的特性 简单易学&#xff08;语法简单&#xff0c;上手容易&#xff09;&#xff1b; 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b; 平台无关性&#xff08; Java 虚拟机实现平台无关性&#xff09;&#xff1b; 支持多线程&…

什么是数据编织

What Is Data Fabric? 【dataCamp】 What Is Data Fabric? Data fabric is a unified data architecture that connects disparate data sources, simplifying access and management while ensuring consistency and security across the entire data landscape. Data Fa…

【设计模式】设计模式介绍和常见设计模式代码示例

文章目录 设计模式分类创建型模式结构型模式行为型模式 设计模式详解单例模式&#xff08;Singleton Pattern&#xff09;懒汉模式饿汉模式 工厂模式&#xff08;Factory Pattern&#xff09;简单工厂模式工厂方法模式抽象工厂模式 装饰模式&#xff08;Decorator Pattern&…

设计模式的学习

OO:Object-Oriented 面向对象 --- 《Head First设计模式》 这本书是用java写的&#xff0c;我是写C的&#xff0c;用C来写相关的代码 --- p2&#xff08;第二页&#xff09; #ifndef DUCK_H #define DUCK_H/*** brief The Duck class 鸭子类*/ class Duck { public:D…

No.8 笔记 | SQL 查询语句:数据探索的钥匙

2024/10/7 心记 - 致在路上默默奋斗的你 在当今数字化的时代&#xff0c;网络安全已成为我们生活中不可或缺的一部分。它如同守护数字世界的隐形盾牌&#xff0c;保护着我们的隐私、数据和整个社会的稳定运行。 学习网络安全&#xff0c;是踏上一段充满挑战与机遇的征程。 每一…

软件设计师(软考学习)

数据库技术 数据库基础知识 1. 数据库中的简单属性、多值属性、复合属性、派生属性简单属性&#xff1a;指不能够再分解成更小部分的属性&#xff0c;通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。 多值属性&#xff1a;指一个属性可以有多个值…