当前位置: 首页 > article >正文

qlu数据结构测试

12.15测试

编程题 

1、【问题描述】
已知非空线性链表第1个链结点指针为list,链结点构造为
struct node{
    datatype data;
    node *link;
};
请写一算法,将该链表中数据域值最大的那个点移到链表的最后面。(假设链表中数据域值最大的链结点惟一)(注意:要求先写出算法的解题思路,然后再写出算法)
【输入形式】
输入为一个整数序列,整数之间以空格隔开,序列以回车结尾。
【输出形式】
输出为移动后的整数序列,整数之间以空格隔开,序列以回车结尾。
【样例输入】
3 12 4 9 5 1
【样例输出】
3 4 9 5 1 12
【样例说明】
将序列中最大的数字12移动到序列最后。
【评分标准】
本题必须采用链表来实现移动操作,其他方法不得分。

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

// 定义链表节点结构体
typedef struct node {
    int data;
    struct node *link;
} Node;

// 函数用于将链表中数据域最大的节点移到链表末尾
void moveMaxToEnd(Node **list) {
    if (*list == NULL) {
        return;
    }
    Node *maxPtr = *list;
    Node *prevMaxPtr = NULL;
    Node *curPtr = *list;
    Node *prevPtr = NULL;
    // 遍历链表找到最大值节点以及其前一个节点
    while (curPtr!= NULL) {
        if (curPtr->data > maxPtr->data) {
            maxPtr = curPtr;
            prevMaxPtr = prevPtr;
        }
        prevPtr = curPtr;
        curPtr = curPtr->link;
    }
    // 如果最大值节点就是头节点
    if (prevMaxPtr == NULL) {
        *list = (*list)->link;
    } else {
        prevMaxPtr->link = maxPtr->link;
    }
    // 找到链表尾节点
    curPtr = *list;
    while (curPtr->link!= NULL) {
        curPtr = curPtr->link;
    }
    curPtr->link = maxPtr;
    maxPtr->link = NULL;
}

// 函数用于输出链表中的数据
void printList(Node *list) {
    Node *cur = list;
    while (cur!= NULL) {
        printf("%d ", cur->data);
        cur = cur->link;
    }
    printf("\n");
}

int main() {
    Node *list = NULL;
    Node *tail = NULL;
    int num;
    while (scanf("%d", &num)!= EOF) {
        Node *newNode = (Node *)malloc(sizeof(Node));
        newNode->data = num;
        newNode->link = NULL;
        if (list == NULL) {
            list = newNode;
            tail = newNode;
        } else {
            tail->link = newNode;
            tail = newNode;
        }
    }
    // 清空输入缓冲区
    while (getchar()!= '\n' && getchar()!= EOF);

    moveMaxToEnd(&list);
    printList(list);
    // 释放链表内存
    Node *temp;
    while (list!= NULL) {
        temp = list;
        list = list->link;
        free(temp);
    }
    return 0;
}

2、

【问题描述】对于1n的所有自然数,计算0到n所有数字(0-9之间的数字)出现的次数分布。

【输入形式】一个整数n(n <= 100000)

【输出形式】10个数字,空格隔开,对应0-9数字在1..n这个序列中出现的次数总和。

【样例输入】

11

【样例输出】

1 4 1 1 1 1 1 1 1 1

【样例输入】

10000

【样例输出】

2893 4001 4000 4000 4000 4000 4000 4000 4000 4000

【评分标准】输出的10个数之间用空格区分。

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

char* intToString(int num) {
    int len = 0;
    int temp = num;
    while (temp > 0) {
        len++;
        temp /= 10;
    }
    
    char* result = (char*)malloc((len + 1) * sizeof(char));
    if (result == NULL) {
        return NULL;
    }
    result[len] = '\0';  // 设置字符串结束符
    
    while (num > 0) {
        result[--len] = num % 10 + '0';
        num /= 10;
    }
    return result;
}

int main() {
    int n;
    scanf("%d", &n);
    int count[10] = {0};  // 用于记录0-9每个数字出现的次数,初始化为0
    for (int i = 1; i <= n; i++) {
        char* numStr;
        if (i < 0) {
            numStr = (char*)malloc(2 * sizeof(char));  // 为负号和数字字符串预留空间
            if (numStr == NULL) {
                return 1;
            }
            numStr[0] = '-';
            i = -i;
            char* tempStr = intToString(i);
            if (tempStr == NULL) {
                free(numStr);
                return 1;
            }
            strcpy(numStr + 1, tempStr);  // 将转换后的数字字符串复制到负号后面
            free(tempStr);
        } else {
            numStr = intToString(i);
            if (numStr == NULL) {
                return 1;
            }
        }
        // 遍历字符串
        for (size_t j = 0; j < strlen(numStr); j++) {
            int digit = numStr[j] - '0';  // 将字符转换回数字
            count[digit]++;
        }
        free(numStr);  // 释放
    }
    for (int i = 0; i < 9; i++) {
        printf("%d ", count[i]);
    }
    printf("%d\n", count[9]);
    return 0;
}

 


http://www.kler.cn/a/442545.html

相关文章:

  • 解决/var/lib/docker(默认的 Docker 数据目录)占用较大,并且所在磁盘空间不足
  • 容器安全:风险与对策
  • MyBatis-Plus批量保存与多线程保存比较
  • Linux之条件变量,信号量,生产者消费者模型
  • 配置清晰,nignx http tcp 代理 已经websocket
  • 计算机网络——期末复习(1)背诵
  • AI芯片常见概念
  • MoonBit 核心编译器正式开源!
  • 2.16、添加响应式数据
  • php面对对象的基础知识
  • 车载通信架构 --- 一个以太网帧包含多个DoIP帧?
  • 手机银行模拟器,一款高仿真银行app的模拟器,可以修改姓名 卡号 余额 做转账记录 做流水
  • 鸿蒙操作系统(HarmonyOS)的应用开发入门
  • Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】
  • 125. 耍杂技的牛 acwing 贪心算法
  • Redis 中的渐进式扩容
  • Elasticsearch-DSL高级查询操作
  • NoSQL大数据存储技术测试(6)图数据库Neo4J
  • C++入门小馆:初识sort函数
  • spring学习(spring-bean实例化(实现FactoryBean规范)(延迟实例化bean))