【数据结构 | PTA】表

news2024/10/8 21:15:39

文章目录

    • 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;
        }
        else
            printf("%05d\n",ID);
        temp = str[temp].pre;
        printf("%05d %d ",ID , str[ID].data);
        if(ID == temp)
        {
            printf("-1\n");
            break;
        }
        else
            printf("%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.coloradmin.cn/o/2197261.html

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

相关文章

OgreNext高级材质中增加线宽,点大小,虚线模式绘制支持

修改Ogre高级材质系统,增加线宽,点大小,虚线模式,虚线参数的支持,效果如下: 需要修改的代码文件如下: 修改如下 代码文本: //范围[0.2 - 51] 0.2 * [0,255];Ogre::uint8 mLineWidth;//范围[0.5 - 127.5] 0.5 * [0, 255];Ogre::uint8 mPointSize;//虚线标记Ogre::ui…

【Redis】Redis线程模型

目录 1. Redis 是单线程的&#xff0c;还是多线程的&#xff1f;2. Redis单线程模式是怎么样的&#xff1f;Redis 单线程模式的优势Redis 单线程的局限性Redis 单线程的优化策略 3. Redis采用单线程为什么还这么快4. Redis 6.0 之前为什么使用单线程&#xff1f;5. Redis 6.0 之…

每日学习一个数据结构-图

文章目录 图基础一、图的定义二、图的相关概念三、图的分类四、图的使用场景 和图相关的算法一、图的遍历算法二、最短路径算法三、最小生成树算法四、图匹配算法五、网络流算法 图基础 一、图的定义 在数学中&#xff0c;图是描述于一组对象的结构&#xff0c;其中某些对象对…

数据结构单向链表

单向链表的转置 转置的思想&#xff1a; (1) 将头节点与当前链表断开&#xff0c;断开前保存下头节点的下一个节点&#xff0c;保证后面链表能找得到&#xff0c;定义一个q保存头节点的下一个节点&#xff0c;断开后前面相当于一个空的链表&#xff0c;后面是一个无头的单向链表…

动态内存管理练习题的反汇编代码分析(底层)

1.C语言代码 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str NULL;str GetMemory();printf(str); }int main() {Test();return 0; } 2.反汇编代码 VS2022x64debug #include <stdio.h>…

给普通的div或者view等元素添加onblur事件的方式

一般只有input元素有blur事件&#xff0c;但是如果想给普通的元素设置了blur事件之后&#xff0c;它是不会正常直行的。还需要再给元素添加tabindex属性&#xff0c;设置了tabindex属性之后&#xff0c;元素会带有一个下划线&#xff0c;还要去掉下划线&#xff0c;而且聚焦的时…

PostgreSQL学习笔记二:PostgreSQL的系统架构

PostgreSQL 是一种功能强大的开源关系型数据库管理系统&#xff0c;其架构具有以下特点&#xff1a; 一、客户端/服务器架构 客户端 客户端可以是各种应用程序&#xff0c;如 Web 应用、桌面应用等&#xff0c;它们通过网络连接与 PostgreSQL 服务器进行通信。客户端使用标准的…

力扣之603.连续空余座位

文章目录 1. 603.连续空余座位1.1 题干1.2 准备数据1.3 思路分析1.4 解法1.5 结果截图 1. 603.连续空余座位 1.1 题干 表: Cinema ----------------- | Column Name | Type | ----------------- | seat_id | int | | free | bool | ----------------- Seat_id 是该表的自动递…

2024-你自学网络安全的顺序可能一直是反的!

作为一名在网络安全领域工作了八年的技术人员&#xff0c;我想分享一些经验给2024年学习黑客技术的朋友们。 千万不要毫无基础就开始学黑客!一定要先了解相关的信息和知识! 对于刚入行的朋友&#xff0c;我建议先从网络安全或Web安全/渗透测试入手&#xff0c;这些方向市场需求…

【可答疑】基于51单片机的光照强度检测(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

基于STM32的智能仓库温湿度监控系统设计

引言 本项目设计了一个基于STM32的智能仓库温湿度监控系统&#xff0c;能够实时监测仓库内的温度和湿度&#xff0c;并根据设定的阈值触发报警或启动风扇调节环境。该系统通过DHT11温湿度传感器获取环境数据&#xff0c;结合OLED显示屏、风扇和蜂鸣器&#xff0c;实现对仓库环…

python中的数组模块numpy(一)(适用物联网数据可视化及数据分析)

一、创建数组对象array&#xff0c;认识数组的格式 array函数的格式:np.array(object,dtype,ndmin) 以下是示例代码&#xff1a; # coding:utf-8 import numpy as np d1[1.1,2.1,3.1] d2(1,2,3,4) d3[[a,b],[c,d],[e,f]] print(d1) print(d2) print(d3) print("以上是数…

无法编辑PDF文件?试试这3个解决方法!

PDF文件格式广泛应用于工作中&#xff0c;但有时候我们可能遇到无法编辑PDF文件的情况。这可能导致工作效率降低&#xff0c;特别是在需要修改文件内容时显得尤为棘手。遇到PDF不能编辑时&#xff0c;可以看看是否以下3个原因导致的。 原因一&#xff1a;PDF文件设置了编辑权限…

八大排序--06基数排序(桶排序)

【本质--先排序个位&#xff0c;再排序十位&#xff0c;排百位...依次类推的过程】 获取待排序数组中的最高位数 //取计算最大值的位数int maxarr[0];for(int j0;j<arr.length;j) {if(arr[j]>max) {maxarr[j];}} 存储数据&#xff08;桶排序中除了游标遍历外&#xff…

【数据结构 | PTA】栈

文章目录 7-1 汉诺塔的非递归实现7-2 出栈序列的合法性**7-3 简单计算器**7-4 盲盒包装流水线 7-1 汉诺塔的非递归实现 借助堆栈以非递归&#xff08;循环&#xff09;方式求解汉诺塔的问题&#xff08;n, a, b, c&#xff09;&#xff0c;即将N个盘子从起始柱&#xff08;标记…

分析和解决js运算精度问题,出现多位小数

加减乘除都会出现小数精度错误的问题 (见图) 原因&#xff1a;js进行运算时会将数字先转为二进制再进行运算。 错误思路&#xff1a;之前在做数字运算时都是将数字转化为整数再进行运算&#xff0c;某次突然发现在变整数的时候也会出现精度问题&#xff0c;比如上图中的数据。…

LINUX——内核移植、内核编译教程

Linux内核编译是一个将内核源代码转换成可在特定硬件架构上运行的二进制文件的过程。以下是编译Linux内核的一般步骤&#xff1a; 1、准备工作&#xff1a; 确保安装了必要的编译工具&#xff0c;如gcc、make、ncurses库&#xff08;用于make menuconfig&#xff09;等。 2、…

【读书笔记-《30天自制操作系统》-26】Day27

本篇内容不多&#xff0c;主要是一些优化的工作。首先优化了应用程序&#xff0c;然后引入对应用程序的保护功能&#xff0c;最后引入库的概念。 1. 应用程序优化 首先来解决上一篇中遗留的一个bug:使用ncst命令运行的应用程序&#xff0c;按下ShiftF1或者点击x按钮都无法关…

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

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

『网络游戏』登陆启动框架【05】

将上一章的加载界面隐藏 1.游戏启动逻辑 创建脚本GameRoot.cs &#xff08;该脚本为游戏入口&#xff0c;作用初始化游戏&#xff09; 创建脚本&#xff1a;ResSvc.cs &#xff08;&#xff09; 创建脚本&#xff1a;LoginSys.cs &#xff08;&#xff09; 编写脚本&a…