动态顺序表_WD课后习题2_2_4、5、6

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

#define InitSize 100
typedef int ElemType;

typedef struct
{
    ElemType *data;
    int length, MaxSize;
} SeqList;

// 初始化动态顺序表
void InitList(SeqList &L)
{
    L.data = (ElemType *)malloc((InitSize) * sizeof(int));
    L.MaxSize = InitSize;
    L.length = 0;
}

// 动态输入
void enterInput(SeqList &L, int length)
{
    printf("Please Input:\n");
    for (int i = 0; i < length; i++)
    {
        scanf("%d", L.data + i);
    }
    L.length = length;
}

// 输出存入的值
void outputShow(SeqList L)
{
    for (int i = 0; i < L.length; i++)
    {
        printf("%d  ", L.data[i]);
    }
    printf("\n");
}

// 删除其值在给定值S与t之间(要求S<t)的所有元素
bool deletes_t(SeqList &L, int s, int t)
{
    int i, j;

    if (s > t || L.length == 0)
        return false;
    for (i = 0; i < L.length && L.data[i] <= s; i++)
        ;
    if (i > L.length)
        return false;
    for (j = i; j < L.length && L.data[j] < t; j++) // j=i
        ;
    while (j < L.length)
    {
        L.data[i++] = L.data[j++];
    }
    L.length = i;
    return true;
}

int main()
{
    SeqList L;

    InitList(L);
    enterInput(L, 9);
    printf("原来数组为:\n");
    outputShow(L);

    if (deletes_t(L, 3, 7))
    {
        printf("删除s-t之间的值为:\n");
        outputShow(L);
    }
    else
        printf("\nerror!");
    return 0;
}

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

// 无序的情况1:(普遍的线性表)
// 时间复杂度为:O(n)

#include <Stdio.h>
#include <stdlib.h>

#define InitSize 100
typedef int ElemType;

typedef struct
{
    ElemType *data;
    int length, MaxSize;
} SeqList;

void InitList(SeqList &L)
{
    L.data = (ElemType *)malloc((InitSize) * sizeof(int));
    L.MaxSize = InitSize;
    L.length = 0;
}

void enterInput(SeqList &L, int length)
{
    printf("Please Input:\n");
    for (int i = 0; i < length; i++)
    {
        scanf("%d", L.data + i);
        L.length = length;
    }
}

void showOutput(SeqList &L)
{
    for (int i = 0; i < L.length; i++)
    {
        printf("%d  ", L.data[i]);
    }
    printf("\n");
}

// 删除其值在给定值s与t之间(包含s和t)

/*// 方法一:定义k记录s~t之间的数
 bool deletes_t(SeqList &L, int s, int t)
{
    int k = 0; // 记录不在s~t之间的值
    if (s > t || L.length == 0)
        return false;
    for (int i = 0; i < L.length; i++)
    {
        if (L.data[i] < s || L.data[i] > t)
            L.data[k++] = L.data[i];
    }
    L.length = k;
    return true;
} */

// 方法二:定义k记录不在s~t之间的数
bool deletes_t(SeqList &L, int s, int t)
{
    int k = 0;
    if (s > t || L.length == 0)
        return false;
    for (int i = 0; i < L.length; i++)
    {
        if (L.data[i] > s && L.data[i] <= t)
            k++;
        else
            L.data[i - k] = L.data[i];
    }
    L.length = L.length - k;
    return true;
}

int main()
{
    SeqList L;

    InitList(L);
    enterInput(L, 6);
    showOutput(L);
    deletes_t(L, 2, 7);
    showOutput(L);

    return 0;
}

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

#include <Stdio.h>
#include <stdlib.h>

#define InitSize 100
typedef int ElemType;
typedef struct
{
    ElemType *data;
    int length, MaxSize;
} SeqList;

void InitList(SeqList &L)
{
    L.data = (ElemType *)malloc((InitSize) * sizeof(int));
    L.MaxSize = InitSize;
    L.length = 0;
}

void enterInput(SeqList &L, int length)
{
    printf("Please Input:\n");
    for (int i = 0; i < length; i++)
    {
        scanf("%d", L.data + i);
        L.length = length;
    }
}

void showOutput(SeqList &L)
{
    for (int i = 0; i < L.length; i++)
    {
        printf("%d  ", L.data[i]);
    }
    printf("\n");
}

// 删除所有值重复的元素
/* // 方法一:前一个值与后一个值比较
void del_duplicate(SeqList &L)
{
    int i = 0, j = 1;
    for (i = 0, j = 1; j < L.length; j++)
    {
        if (L.data[i] != L.data[j])
        {
            i++;
            L.data[i] = L.data[j];
        }
    }
    L.length = i + 1;
} */

// 方法二:每次判断,同时判断两个,有相同值就进入下一次循环
void del_duplicate(SeqList &L)
{
    int i, j;
    for (i = 0, j = 0; i < L.length && j < L.length; i++, j++)
    {
        while (L.data[j] == L.data[j + 1] && j < L.length)
            j++;
        L.data[i] = L.data[j];
    }
    L.length = i;
}

int main()
{
    SeqList L;

    InitList(L);
    enterInput(L, 9);
    showOutput(L);

    del_duplicate(L);
    showOutput(L);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值