王道数据结构课后题

跟着我老婆学的欸嘿嘿嘿嘿  b站搜金可鱼哟

线性表

01

从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位
置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

算法思想:假设第0 个位置的元素是最小的,设其为min 下标为flag,依次遍历,若有比一个小的元素将其赋值给min

#include <stdio.h>

typedef int ElemType;
#define MaxSize 50
typedef struct SqList
{
    ElemType data[MaxSize] = {2, 3, 4, 6, 7, 1, 8, 9};
    int length = 8;
} SqList;

bool move(SqList &L, int &e)
{
    if (L.length == 0) {
        return false;
    }
    int min = L.data[0];
    int flag = 0;
    for (int i = 1; i < L.length; i++) {
        if (L.data[i] < min) {
            min = L.data[i];
            flag = i;
        }
    }
    e = L.data[flag];
    L.data[flag] = L.data[L.length - 1];
    return true;
}

int main() {
    SqList L;
    printf("original list: ");
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");

    int e;
    if (move(L, e)) {
        printf("min value: %d\n", e);
        printf("result list: ");
        for (int i = 0; i < L.length; i++) {
            printf("%d ", L.data[i]);
        }
        printf("\n");
    } else {
        printf("empty list\n");
    }
    return 0;
}

02

设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为 O(1)

#include <stdio.h>

#define MaxSize 50
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    int length;
} SqList;

void move(SqList& L)
{
    ElemType temp;
    for (int i = 0; i < L.length / 2; i++)
    {
        temp = L.data[i];
        L.data[i] = L.data[L.length - i - 1];
        L.data[L.length - i - 1] = temp;
    }
}


int main()
{
    SqList L;
    L.length = 6;
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.data[3] = 6;
    L.data[4] = 5;
    L.data[5] = 4;

    printf("Original Array: ");
    for (int i = 0; i < L.length; i++)
    {
        printf("%d ", L.data[i]);
    }
    printf("\n");

    move(L);

    printf("Reversed Array: ");
    for (int i = 0; i < L.length; i++)
    {
        printf("%d ", L.data[i]);
    }
    printf("\n");

    return 0;
}

03

对长度为”的顺序表L,编写一个时间复杂度为 O(m)、空间复泰度为 O()的算法,该算
法删除线性表中所有值为x的数据元素。

算法思想:设置一个k用来记录,x的个数,例如:本代码中的 第一个1是data[2],k = 1 那么data[3]就往前挪一个位置(删除:将其覆盖)。第二个1是data[5],k = 2 ,data[6]往前挪两个位置

总结规律:a[i-k] = a[i] L.length = n-k

#include <stdio.h>

#define MaxSize 50
typedef int ElemType;
typedef struct
{
    ElemType data[MaxSize] = {5,2,0,1,3,1,4,1,1,4};
    int length = 10;
} SqList;

void Reverse(SqList& L, ElemType x)
{
    int k = 0;
    for (int i = 0; i < L.length; i++)
    {
        if (L.data[i] == x)
            k++;
        else
            L.data[i - k] = L.data[i];
    }
    L.length = L.length - k;
}

int main()
{
    SqList L;
    ElemType x = 1;

    printf("Original Array: ");
    for (int i = 0; i < L.length; i++)
    {
        printf("%d ", L.data[i]);
    }
    printf("\n");

    Reverse(L, x);

    printf("Modified Array: ");
    for (int i = 0; i < L.length; i++)
    {
        printf("%d ", L.data[i]);
    }
    printf("\n");

    return 0;
}

04

从序顺序表中删除其值在给定值,与1之间(要求s<)的所有元素,若s或t不合理
或顺序表为空,则显示出错信息并退出运行。

#include <stdio.h>

#define MaxSize 50

typedef int ElemType;

typedef struct
{
    ElemType data[MaxSize] = {1, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 9}; // 原有数列数据
    int length; // 原有数列实际长度
} SqList;

/**
 * 删除有序顺序表 *L 中在给定值 s 与 t 之间的所有元素。
 * 删除成功返回 true,否则返回 false。
*/
bool Del(SqList *L, ElemType s, ElemType t)
{
    int i, j; // 定义循环移位起始下标

    // 无需删除
    if (s >= t || L->length == 0)
        return false;

    // 寻找第一个需删除的元素
    for (i = 0; i < L->length && L->data[i] < s; i++);

    // 所有元素值均小于 s,无需删除
    if (i >= L->length)
        return false;

    // 寻找第一个大于 t 的元素
    for (j = i; j < L->length && L->data[j] <= t; j++);

    // 数组前移,填补被删元素位置
    for (; j < L->length; i++, j++)
        L->data[i] = L->data[j];

    L->length = i; // 数组长度更新为实际元素个数
    return true;
}

int main()
{
    SqList L;
    L.length = 12;

    ElemType s, t;
    printf("Enter the range to delete (elements between s and t will be deleted):\n");
    scanf("%d %d", &s, &t);

    if (Del(&L, s, t))
    {
        printf("The updated sequence list: ");
        for (int i = 0; i < L.length; i++)
            printf("%d ", L.data[i]);
        printf("\n");
    }
    else
    {
        printf("Deletion failed\n");
    }

    return 0;
}

05

从顺序表中删除其值在给定值,与1之间 (包含s和1,要求s<1)的所有元素,若s或
r不合理或顺序表为空,则显示出错信息并退出运行。

#include <stdio.h>
#include <stdbool.h>       // 引入stdbool.h头文件用于定义bool类型及相应的true和false值

#define MaxSize 50          // 定义SqList的最大长度
typedef int ElemType;      
typedef struct {
    ElemType data[MaxSize]; // 存储数据的数组
    int length;             // 数组中实际存储的元素个数
} SqList;

bool move(SqList &L, ElemType s, ElemType t)  // 删除SqList中符合某一区间的元素。函数返回值为bool类型,表示是否删除成功。
{
    int k = 0;              // 用于存储满足删除条件的元素的个数,初始值为0。
    if (L.length == 0 || s >= t)
        return false;       // 若SqList长度为0或者s大于等于t,则无法删除,函数返回false。
    for (int i = 0; i < L.length; i++) {     // 遍历SqList中的元素。
        if (L.data[i] >= s && L.data[i] <= t)   // 若当前元素的值在区间内,则需要删除该元素。
            k++;                            // 记录当前需要删除的元素的个数。
        else
            L.data[i - k] = L.data[i];      // 若不需要删除,将当前元素向前移k位(即将需要删除的元素剔除)。
    }
    L.length -= k;          // 更新SqList的长度,即使删除后SqList的长度变为原来的长度k。
    return true;            // 删除成功,函数返回true。
}

int main() {
    SqList L = { {3, 4, 1, 2, 6, 7}, 6 };  // 定义一个SqList并初始化。
    ElemType s, t;

    printf("Initial array: ");
    for (int i = 0; i < L.length; i++) {   // 输出SqList中的初始元素。
        printf("%d ", L.data[i]);
    }
    printf("\n");

    printf("Enter the lower and upper bound of the interval (separated by a space): ");
    scanf("%d %d", &s, &t);         // 读入需要删除的区间。

    if (move(L, s, t)) {            // 若删除成功,输出删除区间后的元素。
        printf("Array after deleting elements in the interval [%d, %d]: ", s, t);
        for (int i = 0; i < L.length; i++) {
            printf("%d ", L.data[i]);
        }
        printf("\n");
    }
    else {                          // 若删除失败,输出相应的信息。
        printf("Unable to delete elements in the interval [%d, %d]\n", s, t);
    }

    return 0;
}

06

从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。

#include <stdio.h>

#define MaxSize 50
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    int length ;
}SqList;

bool move(SqList &L)
{
    if(L.length==0)
        return false;
    int i,j;
    for (i = 0,j = 1;j<L.length;j++)
        if (L.data[i] != L.data[j])
            L.data[++i] = L.data[j];
    L.length = i+1;
    return true;
}

int main() {
    SqList L;

    // 输入数组长度
    printf("Enter the length of the array: ");
    scanf("%d", &L.length);

    // 输入数组元素
    printf("Enter the elements of the array: ");
    for (int i = 0; i < L.length; i++) {
        scanf("%d", &L.data[i]);
    }

    printf("Original array: ");
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");

    if (move(L)) {
        printf("Array after removing duplicates: ");
        for (int i = 0; i < L.length; i++) {
            printf("%d ", L.data[i]);
        }
        printf("\n");
    } else {
        printf("Failed to remove duplicates.\n");
    }

    return 0;
}

07

将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。

#include <stdio.h>

#define MaxSize 50
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    int length;
} SqList;

bool merge(SqList A, SqList B, SqList &C)
{
    if (A.length + B.length > C.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 = k;
    return true;
}

int main() {
    SqList A;
    SqList B;
    SqList C;

    // Initialize list A
    A.data[0] = 1;
    A.data[1] = 3;
    A.data[2] = 5;
    A.length = 3;

    // Initialize list B
    B.data[0] = 2;
    B.data[1] = 4;
    B.length = 2;

    // Initialize list C
    C.length = A.length + B.length;

    // Merge lists A and B into C
    if (merge(A, B, C))
    {
        printf("Merge successful. The merged list C is:");
        for (int i = 0; i < C.length; i++)
        {
            printf("%d ", C.data[i]);
        }
        printf("\n");
    }
    else
    {
        printf("Merge failed. The merged list C would exceed the maximum capacity.\n");
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值