数据结构习题_2.10

2.10 指出以下算法的错误和低效(即费时)之处,并将它改写为一个既正确又高效的算法。

Status  DeleteK(SqList &a, int i, int k)
    {//本过程从顺序存储结构的线性表a中删除第i个元素起的k个元素
        if(i<1 || k<0 || i+k>a.length)
            return INFEASIBLE;              //参数不合法
        else
            for(count=1; count<k; count++)
            {//删除一个元素
                for(j=a.length; j>=i+1; j--)
                    a.elem[j-1] = a.elem[j];
                a.length--;
            }
        return OK;
    }//DeleteK

 

 

 

正确的算法思路(以i=3 k=3为例):

 

 

 算法实现:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LIST_INIT_SIZE 100
#define ERROR 0;
#define OK 1;

typedef int ElemType;
typedef int Status;

typedef struct
{
    ElemType elem[LIST_INIT_SIZE];
    int length;
    
}SqList;//顺序表

Status test_2_10(SqList *s, int i, int k)
{
    int j;
    if(i<1 || i>s->length || k<0 || i+k-1>s->length)
        return ERROR;
    for ( j = i+k; j <= s->length; j++)
        s->elem[j-k-1] = s->elem[j-1];
    s->length -= k;
    return OK;
}

优点:一次性删除k个元素,无需大量移动元素

posted @ 2021-10-21 11:44  Sour_Orange  阅读(441)  评论(0)    收藏  举报