王道考研数据结构顺序表相关例题习题代码

代码是自己写的。

我的顺序表是以1为开始的下标,和书上的不一样。其中习题部分的代码是我自己写的,和书中答案不太一样,比如习题第8题,觉得书上答案用三次倒置操作很智障,自己写的代码多消耗了点空间,但时间效率比答案好。

#include <bits/stdc++.h>
#define MAX_SIZE 50
using namespace std;
//顺序表
typedef int ElemType;
typedef struct SqList
{
    ElemType data[MAX_SIZE];
    int length;
} SqList;
//插入节点
bool ListInsert(SqList &L, int i, ElemType e)
{
    if(i<1||i>L.length+1)
        return false;
    if(L.length>=MAX_SIZE)
        return false;
    for(int j=L.length+1; j>i; j--)
    {
        L.data[j]=L.data[j-1];
    }
    L.data[i]=e;
    L.length++;
    return true;
}
//删除
bool ListDelete(SqList &L, int i, ElemType &e)
{
    if(i<1||i>L.length+1)
        return false;
    e=L.data[i];
    for(int j=i; j<L.length; j++)
    {
        L.data[j]=L.data[j+1];
    }
    L.length--;
    return true;
}
//按值查找
int LocateElem(SqList &L,ElemType e)
{
    for(int i=1; i<=L.length; i++)
    {
        if(L.data[i]==e)
            return i;
    }
    return 0;
}

//打印表
void PrintList(SqList &L)
{
    for(int i=1; i<=L.length; i++)
    {
        cout<<L.data[i]<<' ';
    }
    cout<<endl;
}
//应用题1:删除最小值元素
bool DeleteMin(SqList &L,ElemType &e)
{
    ElemType Min;
    int index;
    if(L.length==0)
        return false;
    index=1;
    Min=L.data[1];
    for(int i=2; i<=L.length; i++)
    {
        if(Min>L.data[i])
        {
            Min=L.data[i];
            index=i;
        }
    }
    e=L.data[index];
    L.data[index]=L.data[L.length];
    L.length--;
    return true;
}
//应用题2表的逆置
bool Reverse(SqList &L)
{
    for(int i=1,j=L.length; i<j; i++,j--)
    {
        swap(L.data[i],L.data[j]);
    }
}
//应用题3删除表中的x
bool Deletex(SqList &L,ElemType x)
{
    int k=0;
    for(int i=1; i<=L.length; i++)
    {
        if(L.data[i]!=x)
        {
            L.data[++k]=L.data[i];
        }
    }
    L.length=k;
}
//应用题4删除s和t之间的数(无序)
bool Deletest1(SqList &L,ElemType s,ElemType t)
{
    int k=0;
    for(int i=1; i<=L.length; i++)
    {
        if(L.data[i]<s||L.data[i]>t)
        {
            L.data[++k]=L.data[i];
        }
    }
    L.length=k;
}
//应用题5删除s和t之间的数(有序)
bool Deletest2(SqList &L,ElemType s,ElemType t)
{
    if(s>t)
        return false;
    int index1=1,index2=L.length;
    while(L.data[index1]<s)
        index1++;
    while(L.data[index2]>t)
        index2--;
    int i,j;
    for(i=index1,j=index2+1; j<=L.length; j++,i++)
    {
        L.data[i]=L.data[j];
    }
    L.length=i-1;
    return true;
}
//应用题6删除重复的数
bool Unique(SqList &L)
{
    int k=0;
    for(int i=1; i<=L.length; i++)
    {
        if(L.data[i]!=L.data[i-1])
        {
            L.data[++k]=L.data[i];
        }
    }
    L.length=k;
    return true;
}
//应用题7合并顺序表
bool Merge(SqList &A, SqList &B, SqList &C)
{
    if(A.length+B.length>MAX_SIZE)
        return false;
    int i=1,j=1,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;
}
//应用题8 调换次序
void Exchange(SqList &L, int m, int n)
{
    int *temp;
    temp=(int *)malloc(sizeof(int)*m);
    for(int i=0;i<m;i++)
    {
        temp[i]=L.data[i+1];
    }
    for(int i=1;i<=n;i++)
    {
        L.data[i]=L.data[i+m];
    }
    for(int i=1;i<=m;i++)
    {
        L.data[i+n]=temp[i-1];
    }
}
//应用题9
void SearchExchangeInsert(SqList &L,ElemType e)
{
    int l=1,r=L.length;
    int mid;
    while(l<r)
    {
        mid=(l+r)/2;
        if(L.data[mid]<e)
        {
            l=mid+1;
        }
        else
            r=mid;
    }
    if(L.data[mid]==e)
    {
        swap(L.data[mid],L.data[L.length]);
        L.length--;
    }
    else
    {
        ListInsert(L,mid,e);
    }

}
int main()
{
   
    return 0;
}

 


版权声明:本文为Eknight123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。