跳转至

DS-2 完善 Array List

题目描述

题目描述部分代码均为精简版

C++
typedef double t_ele;
typedef int t_idx;
class ArrayList 
{
private:
    t_idx size = 0;      // List 的大小.
    t_ele *data = nullptr;  // 存放数据的内存区域.
public:
    int find(t_ele _val) const;
    void makeEmpty();
};

如你所见,头文件里定义了 find 和 makeEmpty 两个函数,但在 ArrayList.cpp 里并没有实现。现在请你完善 ArrayList.cpp,实现这两个函数。

  • find 函数接收一个值 \(x\),你需要返回数组里第一个 \(x\) 值的下标;若数组里找不到 \(x\) 值,则返回 \(-1\)。
  • makeEmpty 函数需要将 ArrayList 清空,注意避免出现内存泄露。

解题思路

对于 find 函数,我们只需要遍历数组,找到第一个 \(x\) 值的下标,然后返回即可,如果遍历完都没有找到 \(x\),则返回 \(-1\)。

注意到存放的数据类型 t_ele 是 double 类型,所以我们不能使用 == 运算符。

C++
1
2
3
4
5
6
7
8
int ArrayList::find(t_ele _val) const {
    for (int i = 0; i < size; ++i) { // 遍历数组
        if (-1e-9 < data[i] - _val && data[i] - _val < 1e-9) { // double 类型数据的比较方式
            return i;
        }
    }
    return -1; // 找不到,返回 -1
}

对于 makeEmpty 函数,我们要做的就是清空数组,但是我们不能直接将数组的指针赋值为 nullptr,因为这样会导致内存泄露。

C++
1
2
3
4
5
6
void ArrayList::makeEmpty() {
    delete[] data; // 释放内存
    data = nullptr; // 避免野指针
    size = 0; // List 的大小也清零
    return;
}

参考代码

ArrayList.h

C++
#ifndef __CRAZYFISH_ARRAYLIST__
#define __CRAZYFISH_ARRAYLIST__

typedef double t_ele;
typedef int t_idx;

class ArrayList 
{
private:
    t_idx size = 0;      // List 的大小.
    t_ele *data = nullptr;  // 存放数据的内存区域.
public:
    ArrayList(){}; 
    ArrayList(int _maxSize)
    {
        size = _maxSize;
        data = new double[size];
        for (int i = 0; i < size; i++)
            data[i] = 0.0;
    };

    ArrayList(const ArrayList &other)
    {
        size = other.size;
        data = new double[size];
        for (int i = 0; i < size; i++)
            data[i] = other.data[i];
    };

    ~ArrayList()
    {
        makeEmpty();
    };

    ArrayList &operator=(const ArrayList &other)
    {
        if (this == &other)
            return *this;
        if (data != nullptr)
            delete[] data;
        size = other.size;
        data = new double[size];
        for (int i = 0; i < size; i++)
            data[i] = other.data[i];
        return *this;
    };

    void insert(t_ele _val, t_idx _pos); // 在指定位置插入一个元素.
    void printList() const;  // 列出表内全部元素.

    int find(t_ele _val) const;
    void makeEmpty();

};  

#else
//DO NOTHING
#endif

ArrayList.cpp

C++
#include "ArrayList02.h"
#include <iostream>

void ArrayList::printList() const
{
    for (int i = 0; i < size; i++)
        std::cout << data[i] << " ";
    std::cout << std::endl;
}

void ArrayList::insert(t_ele _val, t_idx _pos)
{
    if (_pos < 0 || _pos >= size)
    {
        std::cerr << "Error: position out of range." << std::endl;
        return;
    }
    for (int i = size - 1; i > _pos; i--)
        data[i] = data[i - 1];
    data[_pos] = _val;
}

// 以下为所需要实现的部分
int ArrayList::find(t_ele _val) const {
    for (int i = 0; i < size; ++i) {
        if (-1e-9 < data[i] - _val && data[i] - _val < 1e-9) {
            return i;
        }
    }
    return -1;
}

void ArrayList::makeEmpty() {
    delete[] data;
    data = nullptr;
    size = 0;
    return;
}

评论