王道数据结构课后代码题(可直接运行,不断更新)


下面是22考研王道数据结构书上,课后习题所遇到的代码题,可以字节运行的,哈哈哈做个记录,可能算法不够优秀,一点点更新一点点进步吧,嘻嘻嘻!!

1、从线性表中删除最小元素,并将最后一个值赋值

/**
 * 从顺序表中删除具有最小的元素(假设唯一)并由函数返回被删除元素的值,
 * 空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行
 * @return
 */
#include "bits/stdc++.h"
using namespace std;

#define Max 50
struct SqList {
    int a[Max]{2, 3, 4, 6, 7, 1, 8, 9};
    int length = 8;
};

bool listdelete(SqList &s, int &ele) {
    if (s.length == 0) {
        return false;
    }
    int minn = s.a[0];
    int flag = 0;
    for (int i = 0; i < s.length; ++i) {
        if (s.a[i] < minn) {
            minn = s.a[i];
            flag = i;
        }
    }
    ele = s.a[flag];
    s.a[flag] = s.a[s.length - 1];
    return true;
}

int main() {
    SqList s;
    cout << "原先数组" << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;
    int k = 0;
    if (listdelete(s, k)) {
        cout << "最小元素k=" << k << endl;
        cout << "修改后的线性表为:" << endl;
        for (int i = 0; i < s.length; ++i) {
            cout << s.a[i] << " ";
        }
        cout << endl;
    } else {
        cout << "错误" << endl;
    }
       return 0;
}

输出结果:
在这里插入图片描述

2、逆置线性表

/**
 * 逆置线性表,使空间复杂度为 O(1)
 * @return
 */
#include "bits/stdc++.h"
using namespace std;

#define Max 50
struct SqList {
    int a[Max]{2, 3, 4, 6, 7, 1, 8, 9};
    int length = 8;
};

void reverse(SqList &s) {
    for (int i = 0; i <s.length / 2; i++) {
        int v = s.a[i];
        s.a[i] = s.a[s.length - i - 1];
        s.a[s.length - i - 1] = v;
    }
}

int main() {
    SqList s;
    cout << "原先数组" << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;

    reverse(s);
    cout << "逆置后数组" << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;
        return 0;
}

输出结果:
在这里插入图片描述

3、删除线性表所有值为x的元素

#include "bits/stdc++.h"

using namespace std;

/**
 * 长度为n的顺序表,删除线性表所有值为x的元素,使得时间复杂度为O(n),空间复杂度为O(1)
 */

#define Max 50
struct SqList {
    int a[Max]{2, 3, 4, 6, 1, 1, 8, 9};
    int length = 8;
};

void deleteList(SqList &L, int x) {
    int k = 0;//用来记录总共有几个x
    for (int i = 0; i < L.length; ++i) {
        if (L.a[i] == x) {
            k++;
        } else {
            L.a[i - k] = L.a[i];
        }
    }
    L.length = L.length - k;
}

int main() {
    SqList s;
    cout << "原先数组" << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;
    deleteList(s, 1);
    cout << "修改后数组" << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;
    return 0;
}

输出结果:
在这里插入图片描述

4、删除线性表值在s和t之间的元素(包含s和t)

#include "bits/stdc++.h"

using namespace std;

/**
 * 删除线性表中值在s与t之间的元素(s<t),s和t不合理或者顺序表为空则显示出错信息并退出运行
 */

#define Max 50
struct SqList {
    int a[Max]{1, 2, 3, 4, 4, 4, 6, 7, 8, 9};
    int length = 10;
};

bool deleteList(SqList &L, int s, int v) {
    if (s >= v || L.length == 0) return false;
    //ss是第一个大于s的值的下标
    //vv是第一个大于v的值的下标
    int ss = 0, vv = 0;
    bool flag = false;
    for (int i = 0; i < L.length; ++i) {
        if (L.a[i] >= s) {
            ss = i;
            flag = true;
            break;
        }
    }
    if (!flag) { return false; }
    for (int i = ss; i < L.length; ++i) {
        if (L.a[i] > v) {
            vv = i;
            break;
        } else {
            vv = L.length;
        }
    }
    int s1 = ss, v1 = vv;
    for (int j = vv; j < L.length; j++) {
        L.a[ss] = L.a[j];
        ss++;
    }
    L.length = L.length - (v1 - s1);
    return true;
}

int main() {
    SqList s;
    cout << "原先数组" << s.length << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;

    if (!deleteList(s, 1, 5)) { cout << "错误" << endl; }
    cout << "修改后数组" << s.length << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;
    return 0;
}

运行结果:
在这里插入图片描述

5、略

6、从有序表中删除重复元素,使表中所有元素值均不相同

#include "bits/stdc++.h"

using namespace std;

/**
 * 删除线性表中值重复的元素
 */

#define Max 50
struct SqList {
    int a[Max]{1, 2, 2, 4, 4, 4, 6, 7, 8, 9};
    int length = 10;
};

bool deleteRepeat(SqList &L) {
    int difCount = 1;//用来记录有几个不同的数字
    for (int i = 1; i < L.length; ++i) {
        if (L.a[i - 1] != L.a[i]) {
            //如果前面一个元素值和当前不同,difCount++
            //然后将当前位置的值移动到
            L.a[difCount] = L.a[i];
            difCount++;
        }
    }
    L.length = difCount;
}

int main() {
    SqList s;
    cout << "原先数组" << s.length << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;
    deleteRepeat(s);

    cout << "修改后数组" << s.length << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.a[i] << " ";
    }
    cout << endl;
    return 0;
}

运行结果:
在这里插入图片描述

7、将两个有序顺序表合并成一个新的有序表,并有函数返回有序顺序表

#include "bits/stdc++.h"

using namespace std;

/**
 * 将两个有序顺序表合并成一个新的有序表,并有函数返回有序顺序表
 */

#define Max 20
struct SqList {
    int data[Max];
    int length;
};

bool mergeList(SqList A, SqList B, SqList &C) {
    if (C.length < A.length + B.length) {
        return false;
    }
    int i = 0, j = 0, k = 0;
    while (i < A.length && j < B.length) {
        if (A.data[i] <= B.data[j]) {
            C.data[k++] = A.data[i++];
        } else {
            C.data[k++] = B.data[j++];
        }
    }
    while (i < A.length) {
        C.data[k++] = A.data[i++];
    }
    while (j < B.length) {
        C.data[k++] = B.data[j++];
    }
    C.length = A.length + B.length;
    return true;
}

int main() {
    SqList A = {{2,3,5,5,7}, 5};
    SqList B = {{1,3,9}, 3};
    SqList s;
    s.length =8;
    cout << "A数组" << A.length << endl;
    for (int i = 0; i < A.length; ++i) {
        cout << A.data[i] << " ";
    }
    cout << endl;
    cout << "B数组" << B.length << endl;
    for (int i = 0; i < B.length; ++i) {
        cout << B.data[i] << " ";
    }
    cout << endl;
    mergeList(A,B,s);
    cout << "修改后数组" << s.length << endl;
    for (int i = 0; i < s.length; ++i) {
        cout << s.data[i] << " ";
    }
    cout << endl;
    return 0;
}

运行结果:
在这里插入图片描述

8、将数组中两个顺序表位置互换

#include "bits/stdc++.h"

using namespace std;

/**
 * 1、题目:
 *          已知在一维数组A[m+n]中一次存放着两个线性表(a1,a2,a3...am),
 *          (b1,b2,b3...bn),试编写一个函数,将数组中两个顺序表位置互换,即将
 *          (b1,b2,b3...bn)放在(a1,a2,a3...am)前面。
 * 2、思想:
 *          123 4567整体逆置————7654 321,然后对前面一半逆置得4567,再对后一半逆置得123
 *          即先(0,m+n-1)逆置,然后(0,n-1)逆置,然后(n,m+n-1)逆置
 */

#define Max 20
struct SqList {
    int data[Max];
    int length;
};

void reverse(SqList &A, int left, int right) {
    //0 1 2 3 4 5 逆置,只需要两个元素交换,0和5,1和4,它们加起来的和总是一样
    //将i和left+right-i两个数交换,遍历只需要遍历到中间就可以
    int temp;
    for (int i = left; i <= (left + right) / 2; ++i) {
        temp = A.data[i];
        A.data[i] = A.data[left + right - i];
        A.data[left + right - i] = temp;
    }
}

void changeList(SqList &A, int m) {
    reverse(A, 0, A.length - 1);
    cout << "全部逆置" << endl;
    for (int i = 0; i < A.length; ++i) {
        cout << A.data[i] << " ";
    }
    cout << endl;

    cout << "逆置第1个到" << m << "个" << endl;
    reverse(A, 0, m - 1);
    for (int i = 0; i < A.length; ++i) {
        cout << A.data[i] << " ";
    }
    cout << endl;

    cout << "逆置第" << m+1<< "到" << A.length << "个" << endl;
    reverse(A, m, A.length - 1);
    for (int i = 0; i < A.length; ++i) {
        cout << A.data[i] << " ";
    }
    cout << endl;
}

int main() {
    SqList A = {{1, 2, 3, 4, 5, 6, 7}, 7};
    cout << "A初始化数组" << A.length << endl;
    for (int i = 0; i < A.length; ++i) {
        cout << A.data[i] << " ";
    }
    cout << endl;
    changeList(A, 3);

    cout << "修改后数组" << A.length << endl;
    for (int i = 0; i < A.length; ++i) {
        cout << A.data[i] << " ";
    }
    cout << endl;
    return 0;
}

运行结果:
在这里插入图片描述

9、将数组中两个顺序表位置互换

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值