2025.2.24(数据与结构c++)顺序表的插入与删除 记住c++头文件背诵

在ptq上做了两个编程题作业,分别是字符表的插入与删除。
里面了解到了一个第一次见的用法:
while(cin>>...)的用法为多次读入。适用于多组数据(或不知道几组),其结束的标志是循环读入直到无数据or读到无效数据。附图


今天的作业不是用老师上课的方法写的,老师教的目前看懂了一些些。等会再看看。
插入的题目如图:

下面我用ai帮我生成我写的代码注释

点击查看代码
#include <iostream>
using namespace std;

int main() {
    int n;          // 数组初始长度
    char x, y;      // x: 要插入的字符,y: 要查找的目标字符
    
    // 持续读取输入,直到遇到EOF或输入错误
    while (cin >> n >> y >> x) {  
        int t = 0;  // 标记是否找到y,0未找到,1找到
        int j;      // 记录y的位置       
        char a[n + 1];  // 多分配1个空间用于插入操作   
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
                // 查找y的位置
        for (int i = 0; i < n; i++) {
            if (a[i] == y) {
                t = 1;    // 标记找到
                j = i;    // 记录y的位置(下标)
            }             
        }
        
        if (t == 1) {  // 如果找到y
            // 元素后移操作(从后向前移动)
            for (int i = n; i > j; i--) {  // i从n开始(利用额外分配的空间)
                a[i] = a[i - 1];  // 后移元素
            }
            a[j] = x;  // 插入新元素
            
            // 输出插入后的数组(共n+1个元素)
            for (int i = 0; i <= n; i++) {
                cout << a[i];
            }
            cout << endl;
            
        } else if (t == 0) {  // 未找到y的情况
            cout << "not found y" << endl;
        }
    }
    return 0;
}

3. 变长数组(VLA):char a[n+1] 不符合C++标准,建议改用:
   vector<char> a(n+1);  // 需要包含<vector>
   或动态分配:char* a = new char[n+1];(上课内容,还不了解。。。。)
代码怎么退出啊。。sos。。<details>
***************************************************************
退出了,,假的算了。。 下面是删除的题目, ![](https://img2024.cnblogs.com/blog/3606000/202502/3606000-20250224220247907-1317758950.png)
点击查看代码
#include <iostream>
using namespace std;

int main() {
    int n;          // 要处理的数组初始长度
    char x;         // 要删除的目标字符
    // 持续读取输入直到遇到EOF或错误
    while (cin >> n >> x) {  
        int j;      // 记录目标字符位置
        int t = 0;  // 查找标记:0未找到,1找到
       
        // 正确做法应使用vector或动态内存分配(待学习中,。。。)
        char a[n + 1];  // 分配n+1空间(实际只需n空间,此处设计存疑)!

        // 读取原始数组(注意:实际只使用前n个位置)
        for (int i = 0; i < n; i++)
            cin >> a[i];  // 正确读取n个元素到a[0]~a[n-1]

        // 查找第一个目标字符
        for (int i = 0; i < n; i++) {
            if (a[i] == x) {  // 正确使用比较运算符
                t = 1;
                j = i;
                break;  // 正确:找到第一个立即退出
            }
        }

        if (t == 1) {
            // 删除操作(实际是覆盖操作)
            // ⚠️危险循环:当i=n-1时,a[i+1]即a[n]是未初始化的内存
            for (int i = j; i < n; i++) {  
                a[i] = a[i + 1];  // 最后一个操作a[n-1] = a[n](访问越界)
            }
            
            // 输出处理后的数组(实际输出n-1个元素)
            // ⚠️注意:当n=0时会出错,但题目场景中n应>=1
            for (int i = 0; i < n - 1; i++)
                cout << a[i];  // 输出前n-1个元素
            cout << endl;
        } else {
            cout << "not found" << endl;  // 正确的未找到处理
        }
    }
    return 0;
}
以上。c++的头文件还没背救命。。
posted @ 2025-02-24 21:58  痛苦的大学生修勾酱  阅读(20)  评论(0)    收藏  举报