数据结构习题_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个元素,无需大量移动元素

浙公网安备 33010602011771号