顺序表

基本操作(创建,插入,删除,查找)

#include<iostream>
using namespace std;

#define Maxsize 50
typedef struct
{
    int data[Maxsize]={0};
    int length=0;
}List;

//插入
bool List_insert(List &L,int i,int num)
{
    if(i<1||i>L.length+1)
        return false;
    if(L.length>=Maxsize)
        return false;

    for(int j=L.length;j>=i;j--)
    {
        L.data[j]=L.data[j-1];
    }

    //这个地方我们输入的i是从1开始的,但是数组是从0开始的,所以i-1
    L.data[i-1]=num;
    L.length++;
    return true;
}

//将该位置被删除的数返回同时删除
int List_Delete(List &L,int i)
{
    if(i<1||i>L.length+1)
        return 0;

    int p=L.data[i-1];

    for(int j=i;j<L.length;j++)
    {
        //这里就是把删除的数的后面的数往前移动
        L.data[j-1]=L.data[j];
    }   
    L.length--;
    return p;
}

//查找某一数值是否存在
int List_locate(List &L,int num)
{
    int i=0;
    for(i=0;i<L.length;i++)
    {
        if(L.data[i]==num)
            return i+1;
    }
    return 0;
}

​ 接下来我们调用一下这些函数,实现一下。

int main()
{
    List sqlist;
    List_insert(sqlist,1,10);
    List_insert(sqlist,2,30);
    List_insert(sqlist,3,25);
    List_insert(sqlist,4,90);
    List_insert(sqlist,5,2);
    List_insert(sqlist,6,138);
    List_insert(sqlist,7,8);

    //输出表的长度并且遍历
    cout<<sqlist.length<<endl;
    for(int i=0;i<sqlist.length;i++)
    {
        cout<<sqlist.data[i]<<"   ";
    }
    cout<<endl;

    //按值查找
    int temp=List_locate(sqlist,139);
    if(temp==0)
        cout<<"The value you are looking for does not exist"<<endl;
    else
        cout<<"the value you are looking for does exist"<<temp<<endl;

    //删除某个值,按位置(从1开始的)删除
    int p=List_Delete(sqlist,2);
    cout <<"the value you delete is :"<< p << endl;

    return 0;
}

王道课后习题

//删除顺序表中最小的元素,该函数为P17-1(2022)
//删除顺序表中最小的元素,该函数为P18-1(2023)
int List_Del_Min(List &L)
{
    if(L.length==0)
        return 0;

    //temp的作用是存放当前最小的值
    //我们把表的数都遍历一遍,用temp存放最小值
    int temp=99999,j=0;
    for(int i=0;i<L.length-1;i++)
    {
        if(temp>=L.data[i])
        {
            temp=L.data[i];
            j=i;
        }
    }
    //空出的位置由最后一个元素补上
    //当然啦,你要是找到了最小的元素你也可以调用List_Delete函数
    L.data[j]=L.data[L.length-1];
    L.length--;
    return temp;
}

//顺序表逆置,高效算法,空间复杂度O(1),P17-2(2022)
//顺序表逆置,高效算法,空间复杂度O(1),P17-2(2023)
bool List_reverse(List &L)
{
    int temp=0;
    int j=L.length-1;
    for(int i=0;i<L.length/2;i++)
    {
        temp=L.data[i];
        L.data[i]=L.data[j-i];
        L.data[j-i]=temp;
    }
}

//删除线性表中所有值为X的数据元素,P17-3(2022)
//删除线性表中所有值为X的数据元素,P17-3(2023)
void List_Del_x(List &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;
}

lionの金库