【数据结构】顺序表的有序插入、扩容以及排序

顺序表的有序插入

Status SeqListInsert(SqList &L,ElemType e)//有序插入的函数
{
    int i=0;
    while(i<L.length&&L.elem[i]<e)//判断插入位置合法性
    {
        i++;
    }
    ListInsert(L,i+1,e);
    //调用插入函数
    return OK;
}
Status ListInsert(SqList &L,int i,ElemType e)//插入函数
{
    int j;
    if((i<1)||(i>L.length+1)) return ERROR;
    if(L.length==MAXSIZE) return ERROR;
    for(j=L.length-1;j>=i-1;j--)
    {
        L.elem[j+1]=L.elem[j];
    }
    L.elem[i-1]=e;
    ++L.length;
    return OK;
}

相信大家对于简单的插入函数已经十分了解了,那要想实现顺序插入的话,只需要再加一个判断即可,即判断在哪插入的问题,如上。


顺序表的扩容

#define INcrease 100
void expandList(SqList& L)//扩容
{ 
    ElemType *newelem=new ElemType[INcreast];
    //INcrease为你想要扩容后表的大小
    int i = 0;
    for(i = 0; i < L.length; i++) 
    {
        newelem[i] = L.elem[i];
    }//将旧表的数据放入新表中
    delete L.elem; 
    L.elem = newelem; 
}

这里我采用的方法是重新申请一块更大的空间,并且将旧表的数据放入新表,操作为代码段中的for循环中,并且将旧表删除,为了不影响主函数中使用L.elem,我在最后将newelem重新用L.elem表示。


顺序表的排序

void Listpaixu(SqList &L)// 排序
{
    int i,j,t;
    for(i=1;i<L.length;i++)
    {
        for(j=1;j<=L.length-i;j++)//每次循环都会从第一个元素开始判断
        {
            if(L.elem[j]<L.elem[j-1])
            {
                t=L.elem[j];
                //用t来保存一下要移位的数据
                L.elem[j]=L.elem[j-1];
                //移位
                L.elem[j-1]=t;
                //把之前保存的数据放到新的位置
                
            }
        }
    }
}

大家在构思的时候,不妨可以在纸上简单的写一个值从大到小的顺序表

1、变换位置

为了实现这样的算法,肯定需要判断相近两个元素的值的大小关系,然后再将其变换位置,而涉及到变换位置,就需要令设一个变量用来存储移位之前的元素值,从而就可以实现元素变换位置

2、嵌套循环

通过这个嵌套循环就可以充分地将不合理位置的元素全部顺利归位,但建议大家在写算法的时候,先考虑你要实现什么样的功能,即将具体要实现的操作先写出来,再考虑需要什么样的循环条件,最后将操作放入循环即可,否则问题就会变得很复杂。


在本篇文章中我最想对和我一样的初学者分享的还是大家在写代码时,建议优先书写执行语句,即你到底想要执行什么样的操作,最后在考虑需要循环多少次的问题,这样有利于思路更加清晰,当然这仅仅是我在实践中总结的想法。

猜你喜欢

转载自blog.csdn.net/2301_77112634/article/details/130244192
今日推荐