这个是下面的那个程序的大前提:
#define OK 1
#define ERROR -1
#define MAX_SIZE 100
typedef int Status ;
typedef int ElemType ;
typedef struct sqlist
{ ElemType Elem_array[MAX_SIZE] ;int length ;
} SqList ;
Status Locate_Delete_SqList(Sqlist *L,ElemType x)
/* 删除线性表L中值为x的第一个结点 */
{ int i=0 , k ;
while (i<L->length) /*查找值为x的第一个结点*/
{ if (L->Elem_array[i]!=x ) i++ ;
else
{ for ( k=i+1; k< L->length; k++)
L->Elem_array[k-1]=L->Elem_array[k];
L->length--; break ;
}
}
if (i>L->length)
{ printf(“要删除的数据元素不存在!\n”) ;
return ERROR ; }
return OK;
}
我个人感觉 if (i > L->length) 用来判断 x 不存在,不是很合适。
比如 1 2 3,如果是 x = 4,由于列表中没有4, 因而i会递增到 i == L->length,也就是 3。根据原来的判断,if (i > L->length) ,明显不会进入 if 分支,而会提示删除成功,这是不正确的。而改为 if (i == L->length) 也不行,因为如果 x = 3 的话,i 递增到了2, 删除 3 之后 L->length 也是 2,会进入 if分支并提示元素不存在。这个同样不科学。
通过标记位的方式就可以避免这些问题了。