首页 > 其他 > 详细

课后习题 2-10 利用顺序表的操作,实现以下的函数

时间:2020-03-17 12:06:37      阅读:110      评论:0      收藏:0      [点我收藏+]

Array.h

#pragma once
#include<iostream>
using namespace std;

class Array {
public:
    int* data;
    int len;
    int maxSize;

    Array(int size = 30) {
        maxSize = size;
        data = new int[maxSize];
        len = 0;
    }
    void creat(int arr[], int n) {
        for (int i = 0; i < n; i++) {
            data[i] = arr[i];
            len++;
        }
    }
    void remove(int i) {
        for (int j = i; j < len - 1; j++) {
            data[j] = data[j + 1];
        }
        len--;
    }
    void show() {
        for (int i = 0; i < len; i++) {
            cout << data[i] << " ";
        }
        cout << endl;
    }

    /**
    (1)从顺序表中删除具有最小值的元素并由
    函数返回被删元素的值。空出的位置由最后一
    个元素填补,若顺序表为空则显示出错误信息
    并退出执行
    */
    int fun_1() {
        if (len <= 0) {
            cerr << "empty!!!" << endl;
            exit(1);
        }
        int min;
        int temp;
        int index=0;
        min = data[0];
        for (int i = 0; i < len; i++) {
            if (data[i] < min) {
                index = i;
                min = data[i];
            }
        }
        temp = data[index];
        data[index] = data[len - 1];
        len--;
        return temp;
    }

    /**
    (2)从顺序表中删除第i个元素并由函数返回被删元素的值。
    如果i不合理或顺序表为空则显示错误信息并退出。
    */
    int  fun_2(int i) {
        if (i > len || i <= 0) {
            cerr << "Out Of Bounds!!!!" << endl;
            exit(1);
        }
        if (len <= 0) {
            cerr << "empty!!!" << endl;
            exit(1);
        }
        int temp;
        temp = data[i - 1];
        for (int j = i - 1; i < len; i++) {
            data[i] = data[i + 1];
        }
        len--;
        return temp;
    }

    /**
    (3)向顺序表中第i个位置插入一个新元素x。如果i不合理,则显示错误信息并退出运行。
    */
    void fun_3(int i, int x) {
        if (i > len || i <= 0) {
            cerr << "Out Of Bounds!!!!" << endl;
            exit(1);
        }
        for (int j = len; j >= i; j--) {
            data[j] = data[j - 1];
        }
        data[i - 1] = x;
        len++;
    }

    /**
    (4)从顺序表中删除具有给定值x的所有元素。
    */
    void fun_4(int x) { //算法要注意,这是时间复杂度低一些的算法!
        int  k = 0;
        for (int i = 0; i < len; i++) {
            if (data[i] != x) {
                data[k] = data[i];
                k++;
            }
        }
        len = k ;
    }

    /**
    (5)从顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素。
    如果s或t不合理或 顺序表为空则显示错误信息并退出。
    */
    void fun_5(int s, int t) { //算法要注意,这是时间复杂度低一些的算法!
        if (s >= t || len <= 0) {
            cerr << "Error!!!!" << endl;
            exit(1);
        }
        int k = 0;
        for (int i = 0; i < len; i++) {
            if (data[i]<s || data[i]>t) {
                data[k] = data[i];
                k++;
            }
        }
        len = k;
    }

    /**
    (6)从“有序”顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素。
    如果s或t不合理或 顺序表为空则显示错误信息并退出。
    */
    void fun_6(int s, int t) {
        if (s >= t || len <= 0) {
            cerr << "Error!!!!" << endl;
            exit(1);
        }
        int index_s = -1, index_t = -1;
        for (int i = 0; i < len; i++) {
            if (data[i] == s) {
                index_s = i;
            }
            else if (data[i] == t) {
                index_t = i;
            }
        }
        int gap = t - s + 1;
        for (int i = index_s; i < len - gap; i++) {
            data[i] = data[i + gap];
        }
        len -= gap;
    }
    /**
    (7)将两个有序顺序表合并成一个新的有序顺序表
    并由 函数返回结果顺序表
    */
    Array fun_7(Array B) {
        Array C;
        int p_c = 0;
        int p_a = 0;
        int p_b = 0;
        if (data[len - 1] > B.data[B.len - 1]) {
            while (p_b < B.len) {
                if (data[p_a] < B.data[p_b]) {
                    C.data[p_c] = data[p_a];
                    p_a++;
                }
                else {
                    C.data[p_c] = B.data[p_b];
                    p_b++;
                }
                p_c++;
            }
            while (p_a < len) {
                C.data[p_c] = data[p_a];
                p_a++;
                p_c++;
            }
        }
        else {
            while (p_a < len) {
                if (data[p_a] < B.data[p_b]) {
                    C.data[p_c] = data[p_a];
                    p_a++;
                }
                else {
                    C.data[p_c] = B.data[p_b];
                    p_b++;
                }
                p_c++;
            }
            while (p_b < B.len) {
                C.data[p_c] = B.data[p_b];
                p_b++;
                p_c++;
            }
        }
        C.len = len + B.len;
        return C;
    }

    /**
    (8)从顺序表中删除所有 其值重复的元素,使表中的所有元素的值都不相等。
    */
    void fun_8() {
        for (int i = 0; i < len; i++) {
            for (int j = i+1; j < len; j++) {
                if (data[j] == data[i]) {
                    remove(j);
                }
            }
        }
    }

};

main.cpp

#include"Array.h"

int main() {
    cout << "Test 01:" << endl;
    Array A_1;
    int a_1[] = { 5,1,2,78,3,-8,-2,-5,4,-45,26,74,12,3256 };
    A_1.creat(a_1, 14);
    A_1.show();
    int elem_1 = A_1.fun_1();
    cout << elem_1 << endl;
    A_1.show();

    cout << "---------------------" << endl;
    cout << "Test 02:" << endl;
    Array A_2;
    int a_2[] = { 1,2,3,4,5,6,7,8,9 };
    A_2.creat(a_2, 9);
    A_2.show();
    int elem_2 = A_2.fun_2(6);
    cout << elem_2 << endl;
    A_2.show();

    cout << "---------------------" << endl;
    cout << "Test 03:" << endl;
    Array A_3;
    int a_3[] = { 1,2,3,4,5,6,7,8,9 };
    A_3.creat(a_3, 9);
    A_3.show();
    A_3.fun_3(5, 666);
    A_3.show();

    cout << "-----------------------" << endl;
    cout << "Test 04:" << endl;
    Array A_4;
    int a_4[] = { 9,1,5,9,7,5,9,1,6,9,4,9,2,9 };
    A_4.creat(a_4, 13);
    A_4.show();
    A_4.fun_4(9);
    A_4.show();

    cout << "---------------------" << endl;
    cout << "Test 05:" << endl;
    Array A_5;
    int a_5[] = { 1,9,7,4,7,6,3,2,9 };
    A_5.creat(a_5, 9);
    A_5.show();
    A_5.fun_5(3, 6);
    A_5.show();

    cout << "---------------------" << endl;
    cout << "Test 06:" << endl;
    Array A_6;
    int a_6[] = { 1,2,3,4,5,6,7,8,9 };
    A_6.creat(a_6, 9);
    A_6.show();
    A_6.fun_6(3, 6);
    A_6.show();

    cout << "---------------------" << endl;
    cout << "Test 07:" << endl;
    Array A_71;
    int a_71[] = { 1,3,5,7,9 };
    A_71.creat(a_71, 5);
    A_71.show();
    Array A_72;
    int a_72[] = { 2,4,6,8,12 };
    A_72.creat(a_72, 5);
    A_72.show();
    Array A_73;
    A_73 = A_71.fun_7(A_72);
    A_73.show();

    cout << "---------------------" << endl;
    cout << "Test 08:" << endl;
    Array A_8;
    int a_8[] = { 1,2,3,4,1,3,6,9 };
    A_8.creat(a_8, 8);
    A_8.show();
    A_8.fun_8();
    A_8.show();

    return 0;
}

 

课后习题 2-10 利用顺序表的操作,实现以下的函数

原文:https://www.cnblogs.com/SlowIsFast/p/12509622.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!