数据结构——线性表作业

news2025/1/22 19:41:35

目录

选择题和填空题

编程题

1. 输出单链表倒数第K个结点值

单链表

双指针

2. 数组元素移动

3. 多项式相加

4. 数组的循环左移


选择题和填空题


编程题

1. 输出单链表倒数第K个结点值

【问题描述】

输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。

【输入形式】

输入第一位为K值,其后接一串以空格分隔的整型值。
【输出形式】

输出为倒数第K个结点的值,若无,则输出Not Found

【样例输入】

3 13 45 54 32 1 4 98 2

【样例输出】

4

【样例说明】

K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开
【评分标准】

本题要综合输出正确性及使用的数据结构。需由输入数据构建单链表。不使用链表的将不得分。

单链表

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int num;
    struct Node* next;
} Node, * LinkList;

int main() {
    LinkList head = NULL;
    LinkList tail = NULL;
    int k;
    scanf("%d", &k);
    int n;
    while (scanf("%d", &n) != EOF) {
        LinkList newNode = (LinkList)malloc(sizeof(Node));
        newNode->num = n;
        newNode->next = NULL;
        if (head == NULL) {
            head = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = tail->next;
        }
    }
    LinkList p = head;
    int count = 0;
    while (p != NULL) {
        count++;
        p = p->next;
    }
    if (k <= 0 || k > count) {
        printf("Not Found\n");
    } else {
        p = head;
        for (int i = 0; i < count - k; i++) {
            p = p->next;
        }
        printf("%d\n", p->num);
    }
    p = head;
    while (p != NULL) {
        LinkList temp = p;
        p = p->next;
        free(temp);
    }
    return 0;
}

双指针

#include <stdio.h>
#include <stdlib.h>
 
typedef struct Node {
    int num;
    struct Node* next;
} Node, * LinkList;
 
int main() {
    LinkList head = NULL;
    LinkList tail = NULL;
    int k;
    scanf("%d", &k);
    int n;
    while (scanf("%d", &n) != EOF) {
        LinkList newNode = (LinkList)malloc(sizeof(Node));
        newNode->num = n;
        newNode->next = NULL;
        if (head == NULL) {
            head = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = tail->next;
        }
    }
    LinkList p = head;
    LinkList temp=head;
    if (k <= 0) {
        printf("Not Found\n");
    } else {
        p = head;
        temp=head;
        while(k && temp){
            temp=temp->next;
            k--;
        }
        while(temp){
            temp=temp->next;
            p=p->next;
            }
        if(k > 0){
           printf("Not Found\n");
            return 0;
        }
        printf("%d\n", p->num);
    }
    return 0;
}

2. 数组元素移动

【问题描述】
 将整数数组A[0..n],将其分为两部分,左边所有元素为奇数,右边所有元素为偶数。数组元素个数不超过1000。
【输入形式】
 以逗号隔开的所有元素
【输出形式】
 依次打印调整后的数组元素,元素间以逗号隔开。奇数序列和偶数序列分别按原序列中的顺序依次输出
【样例输入】

1,2,33,8,5

【样例输出】

1,33,5,2,8

【评分标准】

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    int arr[1000];
    int size = 0;
    while (scanf("%d,", &n) != EOF) {
        arr[size] = n;
        size++;
    }

    int *arr1 = (int*) malloc(size * sizeof(int));
    int *arr2 = (int*) malloc(size * sizeof(int));
    int size1 = 0, size2 = 0;

    for (int i = 0; i < size; i++) {
        if (arr[i] % 2 != 0) {
            arr1[size1] = arr[i];
            size1++;
        } else {
            arr2[size2] = arr[i];
            size2++;
        }
    }

    for (int i = 0; i < size1; i++) {
        printf("%d", arr1[i]);
        if (i < size1 - 1) {
            printf(",");
        }
    }
    if(size1>=1&&size2!=0){
        printf(",");
    }
    
    for (int i = 0; i < size2; i++) {
        printf("%d", arr2[i]);
        if (i < size2 - 1) {
            printf(",");
        }
    }

    free(arr1);
    free(arr2);
    return 0;
}

3. 多项式相加

【问题描述】

编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是无序的,A与B之和按降序排列。例如:

多项式A:  1.2X^0  2.5X^1  3.2X^3  -2.5X^5

多项式B:  -1.2X^0  2.5X^1  3.2X^3   2.5X^5   5.4X^10
多项式A与B之和:5.4X^10  6.4X^3  5X^1
【输入形式】

任意两个多项式A和B
【输出形式】

多项式中某一项的系数与指数,系数保留一位小数

【输入样例】

1.2 0 2.5 1 3.2 3 -2.5 5
-1.2 0 2.5 1 3.2 3 2.5 5 5.4 10
2

【输出样例】

6.4 3

【样例说明】
第一个多项式的系数与指数对,以空格隔开
第二个多项式的系数与指数对,以空格隔开
输出第2项的系数与指数,系数与指数间用空格隔开,系数保留一位小数

【评分标准】

必须用链表实现

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    float coef; 
    int exp; 
    struct Node* next;
} Node;

Node* createNode(float coef, int exp) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->coef = coef;
    newNode->exp = exp;
    newNode->next = NULL;
    return newNode;
}

void insertNode(Node** head, float coef, int exp) {
    Node* newNode = createNode(coef, exp);
    if (*head == NULL || (*head)->exp < exp) {
        newNode->next = *head;
        *head = newNode;
    } else {
        Node* temp = *head;
        while (temp->next != NULL && temp->next->exp >= exp) {
            temp = temp->next;
        }
        newNode->next = temp->next;
        temp->next = newNode;
    }
}

Node* addPolynomials(Node* poly1, Node* poly2) {
    Node* result = NULL;
    while (poly1 && poly2) {
        if (poly1->exp > poly2->exp) {
            insertNode(&result, poly1->coef, poly1->exp);
            poly1 = poly1->next;
        } else if (poly1->exp < poly2->exp) {
            insertNode(&result, poly2->coef, poly2->exp);
            poly2 = poly2->next;
        } else {
            float sum = poly1->coef + poly2->coef;
            if (sum) {
                insertNode(&result, sum, poly1->exp);
            }
            poly1 = poly1->next;
            poly2 = poly2->next;
        }
    }
    while (poly1 || poly2) {
        if (poly1) {
            insertNode(&result, poly1->coef, poly1->exp);
            poly1 = poly1->next;
        } 
        if (poly2) {
            insertNode(&result, poly2->coef, poly2->exp);
            poly2 = poly2->next;
        }
    }
    return result;
}


int main() {
    Node* poly1 = NULL;
    Node* poly2 = NULL;
    float coef;
    int exp;
    char ch;
    while (scanf("%f %d%c", &coef, &exp, &ch)) {
        insertNode(&poly1, coef, exp);
        if (ch == '\n') break; 
    }
    while (scanf("%f %d%c", &coef, &exp, &ch)) {
        insertNode(&poly2, coef, exp);
        if (ch == '\n') break;
    }
  
    Node* result = addPolynomials(poly1, poly2);

    int pos;
    scanf("%d", &pos);
    int i;
    for (i = 1; i < pos; i++) {
        if (result) {
            result = result->next;
        }
    }
    if (result) {
        printf("%.1f %d\n", result->coef, result->exp);
    }
    return 0;
}

4. 数组的循环左移

【问题描述】

设将n(n>1)个整数存放在一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(P>0)个位置。
例如,假设P<n,将R中的数据(X0,X1,..Xn-1)循环左移P个位置后,变换为(Xp, XP+1,..Xn-1,X0,X1,..Xp-1)
【输入形式】

循环移动的位数,数组中数据的个数,循环前的数组
【输出形式】

循环后的数组
【样例输入】

3 5 1 2 3 4 5

【样例输出】

4 5 1 2 3

【样例说明】

请大家注意,循环位移的位数可能超过数组中元素个数;输入与输出的数据均以空格分割,其中输入的数据中第一个是循环移位的位数,第二个是数组中数据的个数,后面的是数组中的数据。
【评分标准】

除了提交之后自动判分之外,还会根据代码的时间复杂度酌情给分,请大家尽量降低空间、时间复杂度

#include <stdio.h>
#include <stdlib.h>

void reverseArr(int *arr, int start, int end) {
    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

void leftRotate(int *arr, int p, int n) {
    reverseArr(arr, 0, p - 1);
    reverseArr(arr, p, n - 1);
    reverseArr(arr, 0, n - 1);
}

int main() {
    int p, num, i;
    scanf("%d", &p);
    scanf("%d", &num);
    p = p % num;
    int *arr = (int *)malloc(num * sizeof(int));
    for (i = 0; i < num; i++) {
        scanf("%d", &arr[i]);
    }

    leftRotate(arr, p, num);

    for (i = 0; i < num; i++) {
        printf("%d", arr[i]);
        if (i < num - 1) {
            printf(" ");
        }
    }
    printf("\n");

    free(arr);
    return 0;
}

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

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

相关文章

外贸知识:谈好订单的客户临时却要求价格优惠怎么办?

距离订单成交只差一步的时候&#xff0c;客户却要求价格一降再降&#xff0c;是为什么&#xff1f; 真的只是为了降价吗&#xff1f; Carl是一个苦苦挣扎的业务员&#xff0c;每次在挖掘客户需求的过程中&#xff0c;客户都是一副“对对对&#xff0c;是是是&#xff0c;好好好…

那些年,我们追过的Java BUG

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

基于springboot实现银行OA系统的设计与实现平台项目【项目源码+论文说明】计算机毕业设计

摘要 在互联网信息技术时代中&#xff0c;企业管理更多的是使用管理系统进行智能化控制&#xff0c;提高单位的核心竞争力&#xff0c;适应快节奏的生产活动。银行OA系统是为企业提供的一整套便于企业管理的应用软件&#xff0c;是目前企业管理的必备系统。通过走访了解&#…

几个非常实用的 Chrome Devtools 技巧

原文链接&#xff1a;[几个非常实用的 Chrome Devtools 技巧](https://fe32.top/articles/skill001/ 关于 Chrome 浏览器&#xff0c;如果你是一名前端开发者&#xff0c;相信对此并不陌生&#xff0c;我们可以用它来查看 网络请求、分析网页性能、调试 JavaScript 功能 等。 …

山海鲸报表系统:数据洞察的利器

在信息时代&#xff0c;数据是每个组织的核心资产。然而&#xff0c;拥有大量数据并不足够&#xff0c;我们需要将这些数据转化为有用的信息&#xff0c;以指导决策和行动。这就是山海鲸报表系统的使命。 解析数据的力量 山海鲸报表系统是一款强大的工具&#xff0c;旨在帮助企…

代码随想录打卡第四十二天| ● 62.不同路径 ● 63. 不同路径 II

62 不同路径 **题目&#xff1a;**一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条…

收银系统哪个好 2023年十大收银软件品牌排行榜

根据2023年的最新数据和市场调研&#xff0c;以下是收银系统十大排名&#xff08;2023年十大收银软件品牌排行榜&#xff09;&#xff1a; 商人宝 一款集成了收银系统、会员管理、进销存和数据分析等多个功能的服装店收银软件&#xff0c;适用于服装卖场、中小型连锁超市、便利…

RunnerGo UI自动化使用体验

RunnerGo怎么做UI自动化 首先需要进入官网&#xff0c;RunnerGo支持开源&#xff0c;可以自行下载安装&#xff0c;也可以点击右上角体验企业版按钮快速体验 点击体验企业版进入工作台后可以点击页面上方的UI自动化 进入到测试页面 创建元素 我们可以在元素管理中创建我们测试…

企业文件防泄密软件!好用的文件加密系统推荐

由于众多企业内部都有大量的机密数据以电子文档的形式存储着&#xff0c;且传播手段多样&#xff0c;很容易造成文件泄密的问题发生。若是员工通过网络泄密重要文件&#xff0c;或是有黑客入侵窃取机密数据等&#xff0c;造成重要文件被非法查看盗取&#xff0c;都会给企业业务…

ROS 物体跟踪示例

物体跟踪与物体识别有相似之处&#xff0c;同样使用特征点检测的方法&#xff0c;但侧重点并不相同。物体识别针对的物体可以是静态的或动态的&#xff0c;根据物体特征点建立的模型作为识别的数据依据&#xff1b;物体跟踪更强调对物体位置的准确定位&#xff0c;输入图像一般…

2.2 如何使用FlinkSQL读取写入到文件系统(HDFS\Local\Hive)

目录 1、文件系统 SQL 连接器 2、如何指定文件系统类型 3、如何指定文件格式 4、读取文件系统 4.1 开启 目录监控 4.2 可用的 Metadata 5、写出文件系统 5.1 创建分区表 5.2 滚动策略、文件合并、分区提交 5.3 指定 Sink Parallelism 6、示例_通过FlinkSQL读取kafk…

力扣:133. 克隆图(Python3)

题目&#xff1a; 给你无向连通图中一个节点的引用&#xff0c;请你返回该图的深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。 class Node {public int val;public Lis…

Excel提高工作效率常用功能

定位快捷键使用 CtrlG或者F5 根据不同类别插入空行 例&#xff1a;以下表&#xff0c;以部门为单位&#xff0c;每个部门后插入空白行 部门姓名出勤基本工资岗位津贴公体加班绩效基数工龄应发合计财务部姓名73115002101710财务部姓名11116006003401502363财务部姓名5271000…

求解八皇后问题

一、实验目的 利用回溯法搜索或爬山法找到八皇后问题的一个可行解。 二、实验内容 有一个 8 8 的棋盘&#xff0c;现在要将8个皇后放到棋盘上&#xff0c;满足&#xff1a;对于每一个皇后&#xff0c;在 自己所在的行、列、两个对角线都没有其他皇后。求所有满足的摆放方式…

大模型技术实践(五)|支持千亿参数模型训练的分布式并行框架

在上一期的大模型技术实践中&#xff0c;我们介绍了增加式方法、选择式方法和重新参数化式方法三种主流的参数高效微调技术&#xff08;PEFT&#xff09;。微调模型可以让模型更适合于我们当前的下游任务&#xff0c;但当模型过大或数据集规模很大时&#xff0c;单个加速器&…

基于springboot实现酒店管理系统平台项目【项目源码+论文说明】

摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

Flow深入浅出系列之在ViewModels中使用Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之在ViewModels中使用Kotlin Flows Flow出现后&#xff0c;LiveData仍然可以用&#xff0c;并且…

基于springboot实现家具网站设计与实现平台项目【项目源码+论文说明】

摘要 随着移动互联网技术的深入发展&#xff0c;电子商务也不断的完善&#xff0c;线上销售额不断提高&#xff0c;网络消费成为人民日常生活的一部分。并且随着电子商务的发展&#xff0c;也呈现出多元化方向&#xff0c;各种农村电商、生鲜电商、家具电商等&#xff0c;带动…

AI 悄然变天:这家平台为何能俘获众多明星大模型「芳心」?

整个AI领域&#xff0c;GPT-4 发布无疑成为载入 AI 史册的大事件。但其还留下来一些发展空间&#xff0c;其不可能把所有的事情都做完。比如&#xff0c;涉及小数、分数的运算&#xff0c;GPT-4 可能给不出正确答案&#xff08;其多位乘法运算准确率仅为 4.3%&#xff09;。 可…

变电站监控无人值守:电力数字化、智能化趋势、技术与应用

随着电力行业的快速发展&#xff0c;变电站监控系统的升级和改造已成为行业的重要议题。其中&#xff0c;实现无人值守的监控模式成为现代变电站运行的关键。 一、变电站监控无人值守的趋势 随着科技的不断进步&#xff0c;电力行业正在逐步实现智能化、自动化的转型。变电…