2023 数据结构复习

news2025/1/17 15:37:12

函数+编程题

7-1 交换二叉树中每个结点的左孩子和右孩子

#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
    char data;
    struct Node *left, *right;
} Node, *Tree;

Tree create() {
    char ch;
    Tree tree = NULL;
    if (scanf("%c", &ch)) {//当有输入时
        if (ch != '#') {
            tree = (Tree)malloc(sizeof(Node));
            tree->data = ch;
            tree->left = create();
            tree->right = create();
        } else {
            tree = NULL;
        }
    }
    return tree;
}

void order(Tree tree) {
    if (!tree)
        return;
    order(tree->left);
    printf("%c", tree->data);
    order(tree->right);
}

void swap(Tree tree) {
    if (!tree)
        return;
    if (!tree->left && !tree->right)
        return;
    Tree tmp = tree->left;
    tree->left = tree->right;
    tree->right = tmp;
    swap(tree->left);
    swap(tree->right);
}

int main() {
    Tree tree = create();
    order(tree);
    printf("\n");
    swap(tree);
    order(tree);
    return 0;
}

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

 一开始用的是数组方法

#include<stdio.h>
#include<stdlib.h>
int s1[1010], s2[1010];
int x, cnta, cntb;
int cmp(const void *a, const void *b){
    return(*(int*)a - *(int*)b);
}
int main(){
    while(scanf("%d", &x) != EOF){
        if(x == -1) break;
        else s1[++ cnta] = x;
    }
    while(!scanf("%d", &x) != EOF){
        if(x == -1) break;
        else s2[++ cntb] = x;
    }
    for(int i = cnta + 1; i <= cnta + cntb; i ++ ){
        s1[i] = s2[i - cnta];
    }
    qsort(s1, cnta + cntb, sizeof(s1[0]), cmp);
    if(cnta + cntb == 0){
        printf("NULL");
        return 0;
    }
    for(int i = 1; i <= cnta + cntb; i ++ ){
        if(i != 1) printf(" ");
        printf("%d", s1[i]);
    }

后来发现在大规模输入的时候不能过

于是就借鉴网上的ac了嘤嘤嘤嘤QAQ 

#include<stdio.h>
#include<stdlib.h>
typedef struct Node *List;
struct Node{
    int data;
    struct Node *Next;
};
List InitList(){
    List l;
    l = (List)malloc(sizeof(struct Node));
    if(!l) return NULL;
    l->Next = NULL;
    return l;
}
void read(List l){
    List t;
    int data;
    scanf("%d", &data);
    while(data > 0){
        t = (List)malloc(sizeof(struct Node));
        if(!t) return ;
        t->data = data;
        t->Next = NULL;
        l->Next = t;
        l = l->Next;
        scanf("%d", &data);
    }
    return ;
}
void combine(List l1, List l2, List l3){
    l1 = l1->Next;
    l2 = l2->Next;
    while(l1 != NULL && l2 != NULL){
        if(l1->data > l2->data){
            l3->Next = l2;
            l2 = l2->Next;
        }
        else{
            l3->Next = l1;
            l1 = l1->Next;
        }
        l3 = l3->Next;
    }
    if(l1 == NULL && l2 == NULL) return ;
    if(l1 != NULL) l3->Next = l1;
    else l3->Next = l2;
    return ;
}
void print(List l){
    l = l->Next;
    if(l == NULL){
        printf("NULL");
        return ;
    }
    while(l){
        if(l->Next == NULL) printf("%d", l->data);
        else printf("%d ", l->data);
        l = l->Next;
    }
}
int main(){
    List l1, l2, l3;
    l1 = InitList();
    l2 = InitList();
    l3 = InitList();
    read(l1);
    read(l2);
    combine(l1, l2, l3);
    print(l3);
    return 0;
}

6-4 链表逆置

struct ListNode *reverse( struct ListNode *head ){
    struct ListNode *q, *p = head, *tail = NULL;
    while(p){
        q = (struct ListNode*)malloc(sizeof(struct ListNode));
        q->data = p->data;
        if(tail == NULL) q->next = NULL;
        else q->next = tail;
        tail = q;
        p = p->next;
    }
    return tail;
}


6-1 顺序表基本操作

bool ListInsert(SqList *&L,int i,ElemType e){
    if(i <= 0 || i > L->length + 1 || L->length == MaxSize) return false;
    i -- ;
    if(i == L->length){
        L->data[i] = e;
        L->length ++ ;
    }
    else{
        for(int j = L->length; j > i; j -- ) L->data[j] = L->data[j - 1];
        L->data[i] = e;
        L->length ++ ;
        //e = L->data[i - 1];
    }
    return true;
}
bool ListDelete(SqList *&L,int i,ElemType &e){
    if(i < 1 || i > L->length) return false;
    i -- ;
    e = L->data[i];
    for(int j = i; j < L->length; j ++ ) L->data[j] = L->data[j + 1];
    L->length -- ;
    return true;
} 
bool ListDeleteElem(SqList *&L,ElemType e){
    int i = 0, j = 0, flag = 0;
    while(i + j < L->length){
        L->data[i] = L->data[i + j];
        if(L->data[i] == e){
            j ++ ;
            flag = 1;
        }
        else i ++ ;
    }
    L->length = L->length - j;
    if(flag == 0) return false;
    return true;
}  

7-1 列车调度

循环遍历就会导致超时

#include<stdio.h>
#include<stdlib.h>
int n, cnt = 1;
int a[100010], t[100010];
int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; i ++ ){
        scanf("%d", &a[i]);
    }
    t[0] = a[0];
    for(int i = 1; i < n; i ++ ){
        for(int j = 0; j < cnt; j ++ ){
            if(t[j] > a[i]){
                t[j] = a[i];
                break;
            }
            else if(j == cnt - 1){
                t[cnt ++ ] = a[i];
                break;
            }
        }
    }
    printf("%d", cnt);
    return 0;
}

所以就需要用二分法来解决; 用到了查找精确值的二分法

#include<stdio.h>
#include<stdlib.h>
int n, cnt = 1;

int main(){
    scanf("%d", &n);
    int a[n], t[n];
    for(int i = 0; i < n; i ++ ){
        scanf("%d", &a[i]);
    }
    t[0] = a[0];
    for(int i = 1; i < n; i ++ ){
        if(a[i] > t[cnt - 1]){
            t[cnt ++ ] = a[i];
        }
        else{
            int l = 0, r = cnt - 1;
            while(l < r){
                int mid = l + r >> 1;
                if(t[mid] > a[i]) r = mid - 1;
                else l = mid + 1;
            }
            t[l] = a[i];
        }
    }
    printf("%d", cnt);
    return 0;
}

7-2 愿天下有情人都是失散多年的兄妹 

五代人需要用追溯,dfs

关于坑点就是对父母的性别,当父母为可考的时候,要赋上性别,为后面追溯同祖先并查集准备。

if (father != -1) a[father].sex = 'M';
if (mother != -1) a[mother].sex = 'F';

还有就是pta上只能c,c的结构体和c++设置有一点点不一样(

#include<stdio.h>
#define max 100000
typedef struct Node{
    int father;
    int mother;
    char sex;
}node;
node a[max];
int n, k;
int pre[max];
int find(int x){
    if(x != pre[x]) pre[x] = find(pre[x]);
    return pre[x];
}
void Union(int a, int b){
    if (b == -1) return ;
    int pa = find(a);
    int pb = find(b);
    if (pa != pb) pre[pa] = pb;
}
int dfs(int x, int y, int age){
    if (!(x != -1 && y != -1)) return 1;
    if (age > 5) return 1;
    if (x == y) return 0;
    else
        return dfs(a[x].father, a[y].father, age + 1) && dfs(a[x].father, a[y].mother, age + 1) && dfs(a[x].mother, a[y].father, age + 1) && dfs(a[x].mother, a[y].mother, age + 1);
}
int main(){
    for (int i = 0; i < max; i++){
        pre[i] = i;
        a[i].father = -1;
        a[i].mother = -1;
    }
    scanf("%d", &n);
    for (int i = 0; i < n; i++){
        int id, father, mother;
        char sex;
        scanf("%d %c %d %d", &id, &sex, &father, &mother);
        a[id].father = father;
        a[id].sex = sex;
        a[id].mother = mother;
        Union(id, father);
        Union(id, mother);
        if (father != -1) a[father].sex = 'M';
        if (mother != -1) a[mother].sex = 'F';
    }
    scanf("%d", &k);
    for (int i = 0; i < k; i++){
        int x, y;
        scanf("%d %d", &x, &y);
        if (a[x].sex == a[y].sex) printf("Never Mind\n");
        else{
            if (find(x) != find(y)) printf("Yes\n");
            else if (dfs(x, y, 1)) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

 7-3 修理牧场

还不是特别会(

#include<stdio.h>
#include<stdlib.h>
int n;
int a[10010];//原来是一开始开小了,紫砂
int cmp(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}
int main(){
    int sum = 0, pay = 0, j;
    scanf("%d", &n);
    for(int i = 0; i < n; i ++ ){
        scanf("%d", &a[i]);
    }
    qsort(a, n, sizeof(a[0]), cmp);
    for(int i = 0; i < n - 1; i ++ ){
        sum = a[i] + a[i + 1];
        pay = pay + sum;
        for(j = i + 2; j < n; j ++ ){
            if(sum > a[j]) a[j - 1] = a[j];
            else{
                a[j - 1] = sum;
                break;
            }
        }
        if(j == n) a[n - 1] = sum;
    }
    printf("%d", pay);
    return 0;
}

单选题

AOE网络工程最早结束时间

 具体解法根据某B求AOE网中的关键路径 数据结构_哔哩哔哩_bilibili的方法解的


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

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

相关文章

P5015 [NOIP2018 普及组] 标题统计————C++

题目 [NOIP2018 普及组] 标题统计 题目描述 凯凯刚写了一篇美妙的作文&#xff0c;请问这篇作文的标题中有多少个字符&#xff1f; 注意&#xff1a;标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时&#xff0c;空格和换行符不计算在内。 输入…

JAVA开发与架构(携程架构实践)

发这篇博文主要是想学习一下携程的架构。携程出了一本《携程架构实践》&#xff0c;无奈现在还没开源。看京东价大概109元人民币。如果看到次博文的网友能发我一本《携程架构实践》pdf。不胜感谢。或者实体书籍也行。其实我不怎么需要实体书籍&#xff0c;因为技术的东西很快会…

特种变色树脂T-46 CC

Tulsimer T-46 CC ISO-9001/ISO-14001/OHSAS-18000 特级强酸性阳离子交换树脂--(自变色树脂) Tulsimer T-46 CC 是一款专门研制的、优质的、强酸型的聚苯乙烯架构的阳离子交 换树脂&#xff0c;具有核子级磺酸官能团&#xff0c; 并同时拥有绝佳的物理及化学稳定品质&#x…

three.js 之 入门篇1

目录three.js 之 入门篇1&#xff1a;使用parcel搭建 three.js 开发环境2&#xff1a;运行一个简单的场景和物体2.1 main.js2.2效果3&#xff1a;轨道控制器和控制物体 mesh3.1 main.js3.2效果4&#xff1a;添加坐标辅助器 AxesHelper4.14.2效果5&#xff1a;设置几何体移动5.1…

深度学习 Day24——使用Pytorch环境实现mnist手写数字识别

深度学习 Day24——使用Pytorch环境实现mnist手写数字识别 文章目录深度学习 Day24——使用Pytorch环境实现mnist手写数字识别一、前言二、我的环境三、Pytorch简介四、前期工作1、导入依赖项和设置GPU2、导入数据3、加载数据4、数据可视化五、构建简单的CNN网络六、训练模型1、…

Spring的嵌套事务(Propagation.NESTED)到底是个啥

什么是嵌套事务 嵌套事务其实是对数据库SavePoint概念的Java操作版封装&#xff0c;什么是SavePoint参考我另一篇blog&#xff1a;juejin.cn/post/718544… SavePoint是数据库事务中的一个概念, 可以将整个事务切割为不同的小事务, 可以选择将状态回滚到某个小事务发生时的样…

Java图形化界面---AWT布局管理器

目录 一、布局管理器介绍 二、布局管理器用法 &#xff08;1&#xff09;FlowLayout &#xff08;2&#xff09;BorderLayout &#xff08;3&#xff09;GridLayout &#xff08;4&#xff09;CardLayout &#xff08;5&#xff09;BoxLayout 三、Box容器的讲解 一、布…

自主实现HTTP

"让我们&#xff0c;跳吧在无比宏达的星系!" 一、背景 超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么…

STL list容器底层代码剖析、正向迭代器与反向迭代器的类的封装

目录 一、迭代器是什么 二、迭代器的本质 三、如何给一个容器实现迭代器功能 四、正向迭代器功能的具体实现 五、反向迭代器 六、list底层代码剖析 一、迭代器是什么 迭代器&#xff08;iterator&#xff09;有时又称光标&#xff08;cursor&#xff09;是程序设计的软件设…

【手写 Vue2.x 源码】第六篇 - 数据代理的实现

一&#xff0c;前言 上篇&#xff0c;主要介绍了 Vue 数据初始化流程中&#xff0c;数组类型的数据劫持是如何实现的&#xff0c;核心思路如下&#xff1a; 出于对性能的考虑&#xff0c;Vue 没有对数组采用 Object.defineProperty 进行递归劫持&#xff0c;而是对能够导致原…

NOSQL数据库习题

NOSQL数据库习题第一章第二章第三章第四章第五章NoSQL数据库上机测试第一章 1.写出DB、RDB、DBMS、TRDB、NoSQL、NewSQL、NDFS的中文名称。 答&#xff1a;DB&#xff1a;数据库 RDB&#xff1a;关系型数据库 DBMS&#xff1a;数据库管理系统 TRDB&#xff1a;传统关系型数据…

解决Shotgrid登陆不上, 上传出错,窗口卡住不动等问题

在使用Shotgrid时&#xff0c;是否遇到这种问题&#xff1a; accounts.autodesk.com出错 auth.autodesk.com出错 再或者这样出错&#xff1a; Shotgrid登陆出错 再再这样关闭Load…时这样出错&#xff0c; 窗口半天都关闭不了&#xff1a; 分析&#xff1a; 1 出现这种错…

(一分钟)激光SLAM扫描匹配 文献阅读

本博客介绍了激光SLAM扫描匹配的相关问题。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;扫描匹配也是数据关联类的问题&#xff0c;是SLAM里面的重要构成部分。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

PyTorch实例2——文本情绪分类器

实例主要用于熟悉相关模型&#xff0c;并且练习创建一个模型的步骤&#xff1a;数据收集、数据预处理、构建模型、训练模型、测试模型、观察模型表现、保存模型传送门&#xff1a;蓝桥云课实验 目录1. 实验环境2. 实验目的3. 相关原理4. 实验步骤4.1 数据收集从在线商城抓取评论…

OpenHarmony 标准系统HDF框架之I2C驱动开发

OpenHarmony 标准系统HDF框架之I2C驱动开发主要内容I2C 基础知识## I2C 基础知识 —— 概念和特性I2C 基础知识 —— 协议、四种信号组合I2C 调试手段## I2C 调试手段 —— 硬件I2C 调试手段 —— 软件HDF 框架下的 I2C 设备驱动## HDF 框架下的 I2C 设备驱动 —— 案例描述HDF…

Shell 传递参数

我们可以在执行 Shell 脚本时&#xff0c;向脚本传递参数&#xff0c;脚本内获取参数的格式为&#xff1a;$n。n 代表一个数字&#xff0c;1 为执行脚本的第一个参数&#xff0c;2 为执行脚本的第二个参数&#xff0c;以此类推……实例以下实例我们向脚本传递三个参数&#xff…

ArcGIS Pro脚本工具(15)——按字段属性值分类导图

之前做了配合地图系列批量导图的脚本工具 ArcGIS Pro脚本工具&#xff08;9&#xff09;——配合地图系列批量导图_学学GIS的博客-CSDN博客_arcgispro批量导出地图pngPro的地图系列是批量制图的利器&#xff0c;但是有个不便的地方&#xff0c;就是设置完成地图系列后&#xf…

机器学习实战教程(13篇)

机器学习实战教程(13篇)这些网址非常适合想学习机器学习&#xff0c;却苦于没有项目&#xff08;尤其缺少数据&#xff09;的人。无意中看到&#xff0c;给自己做一个记录。机器学习实战教程&#xff08;一&#xff09;&#xff1a;K-近邻算法&#xff08;史诗级干货长文&#…

2022年度外设产品行业增长分析:鼠标、键盘同比增长27%

近年来&#xff0c;信息技术迅速发展&#xff0c;网民数量不断增长&#xff0c;深刻改变着社会的运作方式&#xff0c;对社会生产、商业运作模式等方面产生重大影响。广泛的行业应用为网络设备品牌商、制造商带来了差异化的细分市场&#xff0c;各类互联网设备接入数量也快速增…

混合空间增强

混合图像增强是一种图像处理技术&#xff0c;用于在不损失图像细节的情况下增强图像的对比度和亮度。它通常通过将图像拆分成多个通道&#xff0c;然后对每个通道进行独立处理来实现。 综合利用平滑滤波&#xff0c;锐化滤波&#xff0c;灰度拉伸等技术对图像进行处理&#xff…