数据结构与算法——1、顺序表

默认结构体

#define maxsize 50
typedef struct{
    int data [maxsize];
    int length;
}sqlist;

1.在顺序表L第k个位置插入元素

bool insert_l(sqlist&L,int k,int x)
{
    if(k<1&&k>L.length+1)
        return false;
    for(int i=L.length-1;i>=k-1;i--)
    {
        L.data[i+1]=L.data[i];
    }
    L.data[k-1]=x;
    L.length++;
    return true;
}

思想:
进行合法判断不能小于1,长度为原长度加1即加到最后一个后面

因为要将k-1到最后一个元素集体后移,我们可以设置第一个起始位置为最后一个,依次向后移动一个位置。(注意k-1的原因是因为从0开始,但我们要插入第k个位置也相当于存储到k-1位置,那么我们便需要从k-1后面都要向后移动)

进行赋值。

增加了一个元素,长度加1.


2.在顺序表L第k个位置删除元素并且返回

int delete_k(sqlist &L,int k)
{
    if(L.length<k||k<1)
        return 0;
    int x=L.data[k-1];
    for(int i=k-1;i<L.length;i++)
    {
        L.data[i]=L.data[i+1];
    }
    L.length--;
    return x;
}

思想:

先判断是否合法,最多长度为原长度。

因为后面对k-1索引数组修改所以要先进行重新赋值,最后返还原数。

进行循环我们从k-1开始,后面的每个都赋值给前面那个元素。

注意我们删除了一个元素因而长度减去1


3.将元素逆置

void reverse(sqlist &L)
{
    for(int i=0,j=L.length-1;i<=j;i++,j--)
    {
        int temp=L.data[i];
        L.data[i]=L.data[j];
        L.data[j]=temp;
    }
}

思想:

设置两个变量i从开始往后遍历,j从结尾往前遍历,他们会在中间相遇。

我们利用    t=a  a=b  b=t  进行交换


4.查找第一个值为x的元素

int find_x(sqlist &L,int x)
{
    for(int i=0;i<L.length-1;i++)
    {
        if(L.data[i]==x)
            return i+1;
    }
}

思想:从开头进行往后遍历,若与x相等直接返回,因只求第一个。


5.递增有序插入一个x元素,仍递增有序

void insert_x(sqlist &L,int x)
{
    int pose=0;
    for(int i=0;i<=L.length-1;i++)
    {
        if(L.data[i]>x)
        {
            pose=i;
            break;
        }
    }
    for(int i=L.length-1;i>=pose;i--)
    {
        L.data[i+1]=L.data[i];
    }
    L.data[pose]=x;
    L.length++;
}

思想:

首先我们先找到比x大第一个的元素。用pose记录。

我们在将从第一个比其大的开始到最后一个元素依次向后平移一个单位。(与1类似)

注意最后长度加1。


6.用顺序最后一个元素覆盖顺序表最小的元素并返回,若为最后一个顺序表不变。

void del_min(sqlist &L)
{
    int min=L.data[0];
    int j=0;
    for(int i=0;i<L.length;i++)
    {
        if(min>L.data[i])
        {
            min=L.data[i];
            j=i;

        }
    }
    if(j!=L.length-1)
    {
        L.data[j]=L.data[L.length-1];
        L.length--;
    }
    return min;
}

思想:

将原顺序表第一个元素作为min值进而进行比较。

若min比后面的元素大,我们就要更新min把原本数据传给min,同时将下标索引进行保存方便后面判断是否为最后一个元素。

保存索引为最后一个即不变返回最小值即可。

若不为则用最后一个进行覆盖。


7.删除第一个为x元素。

void del_x(sqlist &L,int x)
{
    int pose=0;
    for(int i=0;i<L.length;i++)
    {
        if(L.data[i]==x)
        {
            pose=i;
            break;
        }
    }
    for(int i=pose+1;i<=l.length-1;i++)
    {
        L.data[i-1]=L.data[i];
    }
    L.length--;
}

思想:

先找到第一个x所在位置然后break中止。

在将从那个位置之后(所以是pose+1)向前平移。从而覆盖找到的那个位置.

长度减去1


8.删除所有x元素

void del_x(sqlist &L,int x)
{
    for(int i=0;i<L.length;i++)
    {
        if(L.data[i]==x)
        {
            for(int j=i+1;j<=L.length-1;j++)
            {
                L.data[j-1]=L.data[j];
                L.length--;
            }
        }
    }
}

思想:

同7只是嵌入循环里

void del_x(sqlist&L,int x)
{
    int k=0;
    for(int i=0;i<L.length;i++)
    {
        if(L.data[i]!=x)
        {
            L.data[k]=L.data[i];
            k++;
        }
    }
    L.length=k;
}

思想:

新建一个数组用来存储不等于x,用k来保存长度,为什么不等于k+1,因为在循环中多加了一次1

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值